日志模块的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语言 ,