首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言日志模塊完整實現:多輸出目標、分級記錄、系統日志集成

     編輯:關於C

架構設計概覽

模塊支持三種輸出目標:標準輸出、文件、系統日志。核心接口僅三個函數:創建、寫入、釋放,通過不透明指針隱藏內部結構。

核心數據結構

typedef enum {
    LOG_STDOUT,   // 標準輸出
    LOG_SYSLOG,   // 系統日志
    LOG_FILE      // 文件日志
} log_type_t;

typedef struct log_st {
    log_type_t type;
    FILE *file;   // 文件指針或stdout
} *log_t;

關鍵功能實現

1. 設施字符串到常量映射

配置文件中以字符串形式存儲(如"local5"),運行時轉換為系統常量LOG_LOCAL5:

static log_facility_t _log_facilities[] = {
    {"local0", LOG_LOCAL0}, {"local1", LOG_LOCAL1}, /* ... */
    {"local7", LOG_LOCAL7}, {NULL, -1}
};

static int _log_facility(const char *facility) {
    for (log_facility_t *lp = _log_facilities; lp->facility; lp++)
        if (!strcasecmp(lp->facility, facility))
            return lp->number;
    return -1;  // 未匹配時默認LOG_LOCAL7
}

2. 多態寫入邏輯

void log_write(log_t log, int level, const char *msgfmt, ...) {
    if (log->type == LOG_SYSLOG) {
        // 系統日志路徑:vsnprintf格式化 → syslog()
    } else {
        // 文件/標準輸出路徑:時間戳 + 級別 + 格式化消息 → fprintf() + fflush()
    }
}

3. 系統日志優先級編碼

priority = facility | level,級別從高到低:LOG_EMERG → LOG_DEBUG。

使用示例

log_t log = log_new(LOG_SYSLOG, "MyApp", "local5");
log_write(log, LOG_NOTICE, "應用程序啟動中,PID=%d", getpid());
log_free(log);

工程化優勢

  • 統一接口屏蔽底層差異
  • 內存池管理避免頻繁分配
  • 線程安全設計(需補充鎖機制)
  • 兼容/etc/syslog.conf標準配置
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved