当前位置:编程学习 > C/C++ >>

日志模块的C语言实现

模块接口
模块接口比较简单,因为主要只有写日志的操作。
创建日志模块变量
[cpp] 
log_t log_new(log_type_t type,const char *file, const char *facility); 
log_type_t用于控制日志的类型,可以标识为系统日志,文件以及标准输出,是一个枚举类型,定义如下:
[cpp]
typedef enum {   
    log_STDOUT, 
    log_SYSLOG, 
    log_FILE 
} log_type_t; 
file:这个字段有两种意思,如果日志类型为文件时,该字段表示文件名。如果日志类型为系统日志,该字段表示ident值。
facility:这个参数用于指明记录日志的程序的类型,我们传递的格式都是系统保留的,并且以这种形式传递local3。
写日志
[cpp] 
void  log_write(log_t log, int level, const char *msgfmt, ...); 
level表示写入日志的级别,如:通告,错误,警告之类的,可以按照通用的错误类型划分。分别定义字符串如下:
[html]
static const char *_log_level[] = 

    "emergency", 
    "alert", 
    "critical", 
    "error", 
    "warning", 
    "notice", 
    "info", 
    "debug" 
}; 
释放日志模块变量
[cpp] 
void  log_free(log_t log); 
二,数据结构
定义数据结构如下:
[cpp] 
typedef struct log_st 

    log_type_t  type; 
    FILE        *file; 
} *log_t; 
 只有日志类型和一个文件结构指针。
下面说一下记录日志的程序类型,主要有以下几种日志程序的类型:
[html] 
LOG_AUTH :安全/授权消息 
LOG_AUTHPRIV:安全/授权消息 
LOG_CRON:时间守护进程(cron和at)专用 
LOG_DAEMON:其它系统守护进程 
LOG_KERN:核心消息 
LOG_LOCAL0到LOG_LOCAL7:系统保留 
LOG_LPR:printer子系统 
LOG_MAIL:mail子系统 
LOG_NEWS:USENET新闻子系统 
LOG_SYSLOG:syslogd进程内部所产生的消息 
LOG_USER(缺省):一般使用者缺省使用消息 
LOG_UUCP:UUCP子系统 
LOG_FTP:FTP子系统使用 
我们在这里用的是系统保留,也就是只有LOG_LOCAL0到LOG_LOCAL7,那就要求必须重新封装,以做到以下两点:
如果传递的facility不属于local0~local7,就默认local0~local7中的一个。
需要将传递的local0转换成LOG_LOCAL0,以此类推。
这里为什么传递local0,而不直接传递LOG_LOCAL0?直接传递也是可以的,只所以传递字符串,是因为大多数的日志都是在配置文件中,而配置文件以字符串的形式存取。而LOG_LOCAL0,并不是一个固定的整数值。
[cpp] 
typedef struct log_facility_st 

    const char  *facility; 
    int         number; 
} log_facility_t; 
 
static log_facility_t _log_facilities[] = { 
    { "local0", LOG_LOCAL0 }, 
    { "local1", LOG_LOCAL1 }, 
    { "local2", LOG_LOCAL2 }, 
    { "local3", LOG_LOCAL3 }, 
    { "local4", LOG_LOCAL4 }, 
    { "local5", LOG_LOCAL5 }, 
    { "local6", LOG_LOCAL6 }, 
    { "local7", LOG_LOCAL7 }, 
    { NULL, -1 } 
}; 
 这是定义的一个常量数组,分别和系统日志设备对映起来。在操作的日志文件中,可以看到和这相关的配置,位于/etc/syslog.conf文件中,如:
[cpp] 
# Log all kernel messages to the console. 
# Logging much else clutters up the screen. 
#kern.*                                                 /dev/console 
 
# Log anything (except mail) of level info or higher. 
# Don't log private authentication messages! 
*.info;mail.none;authpriv.none;cron.none                /var/log/messages 
 
# The authpriv file has restricted access. 
authpriv.*                                              /var/log/secure 
 
# Log all the mail messages in one place. 
mail.*                                                  -/var/log/maillog 
 
 
# Log cron stuff 
cron.*                                                  /var/log/cron 
 
# Everybody gets emergency messages 
*.emerg                                                 * 
 
# Save news errors of level crit and higher in a special file. 
uucp,news.crit                                          /var/log/spooler 
 
# Save boot messages also to boot.log 
local7.*                                                /var/log/boot.log 
local5.*                                                /var/log/client.log 
 这上面就配置了local7和local5这两个本地日志设备,其实就是两个日志文件。其实在系统的头文件中就是<sys/syslog.h>中,也定义了这样的一个数组:
[cpp]
#ifdef SYSLOG_NAMES 
CODE facilitynames[] = 
  { 
    { "auth", LOG_AUTH }, 
    { "authpriv", LOG_AUTHPRIV }, 
    { "cron", LOG_CRON }, 
    { "daemon", LOG_DAEMON }, 
    { "ftp", LOG_FTP }, 
    { "kern", LOG_KERN }, 
    { "lpr", LOG_LPR }, 补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,