模块接口
模块接口比较简单,因为主要只有写日志的操作。
创建日志模块变量
[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 }
};