四,关于openlog调用
在写系统日志时,不是必须要调用openlog,如果没有调用openlog,那么在第一次调用syslog时,会自动调用openlog,此函数原型如下:
[cpp]
void openlog(const char *ident, int option, int facility);
这个函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里记录日志。
ident:这个参数是一个标记,在写入日志时,每行都会在前面自动的加上这个标记,通常可以写成当前程序的名称或者是同一程序不同的端口调用。
option:该参数可以取值LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID。都表示不同的意思,我们这里取LOG_PID表示每一行日志都包含当前程序的进程ID号。
facility:表示往哪个日志里写,其实也是表示由哪个具体的系统日志类型来记录日志。
五,写日志
在调用log_new之后,此时log_st有两种可能:
类型为系统日志类型,那么已经打开了系统日志。接下来只要直接调用syslog函数就OK了。
日志类型不是系统日志,而是文件或者标准输出,此时log_st结构体的域FILE *file,已经指向了具体的文件,后面只要调用fwrite类函数就可以了。
代码如下:
[cpp]
#define MAX_LOG_LINE (1024)
void log_write(log_t log, int level, const char *msgfmt, ...)
{
va_list ap;
char *pos, message[MAX_LOG_LINE+1];
int sz, len;
time_t t;
if(log->type == log_SYSLOG) { // 写入系统日志
va_start(ap, msgfmt);
len = vsnprintf(message, MAX_LOG_LINE, msgfmt, ap);
if (len > MAX_LOG_LINE)
message[MAX_LOG_LINE] = '\0';
else
message[len] = '\0';
syslog(level, "%s", message); // 下面会说明syslog调用。
va_end(ap);
return;
}
t = time(NULL); // 时间戳
pos = ctime(&t);
sz = strlen(pos);
pos[sz-1]=' ';
len = snprintf(message, MAX_LOG_LINE, "%s[%s] ", pos, _log_level[level]);
if (len > MAX_LOG_LINE)
message[MAX_LOG_LINE] = '\0';
else
message[len] = '\0';
for (pos = message; *pos != '\0'; pos++); /*empty statement */
sz = pos - message;
va_start(ap, msgfmt);
vsnprintf(pos, MAX_LOG_LINE - sz, msgfmt, ap);
va_end(ap); // 根据传入参数,组织文本信息
fprintf(log->file,"%s", message); // 写入文件。
fprintf(log->file, "\n");
fflush(log->file);
}
六,syslog调用
函数的声明如下:
[cpp]
void syslog(int priority, const char * message, ...);
priority:消息的紧急级别。
message:第二个参数是消息及其格式,之后是格式对应的参数,如同C语言里面printf输出函数一样使用。
第一个参数priority,它是由severity level和facility组成的,Facility已经在上面介绍了,下面介绍一下severity level,也就是消息的重要级别,它主要包括:
[html]
LOG_EMERG:紧急状况
LOG_ALERT:高优先级问题,比如说数据库崩溃等,必须要立即采取反应行动
LOG_CRIT:重要状况发生,比如硬件故障
LOG_ERR:错误发生
LOG_WARNING:警告发生
LOG_NOTICE:一般状况,需要引起注意
LOG_INFO:信息状况
LOG_DEBUG:调试消息
七,释放
这个操作就很简单了,
[cpp]
void log_free(log_t log) {
if(log->type == log_SYSLOG)
closelog();
else if(log->type == log_FILE)
fclose(log->file);
free(log);
}
八,使用的例子
这个使用也是很简单的,分成三部:创建,写入,释放
[cpp]
log_t log = log_new(log_SYSLOG, "Example", "local5"); // 创建日志模块变量。
log_write(log, LOG_NOTICE, "应用程序正在启动中");
log_free(log);