1、简介
Linux下日志主要在/var/log下,比如:message、warn、localmessages等,在suse11下,由进程/sbin/syslog-ng负责日志打印
配置文件:
/etc/syslog-ng/syslog-ng.conf
/etc/sysconfig/syslog
2、消息类型和优先级
消息类型 | 消息来源 |
kern | 内核 |
User | 用户程序 |
Damon | 系统守护进程 |
Mail | 电子邮件系统 |
Auth | 与安全权限相关的命令 |
Lpr | 打印机 |
News | 新闻组信息 |
Uucp | Uucp程序 |
Cron | 记录当前登录的每个用户信息 |
wtmp | 一个用户每次登录进入和退出时间的永久记录 |
Authpriv | 授权信息 |
优先级 | 描述 |
emerg | 最高的紧急程序状态 |
alert | 紧急状态 |
Cirt | 重要信息 |
warning | 警告 |
err | 临界状态 |
notice | 出现不寻常的事情 |
info | 一般性信息 |
Debug | 调试级信息 |
None | 不记录任何日志信息 |
3、函数接口
在Linux中,提供了四个有关syslog日志系统的系统调用,供用户使用:
- openlog:打开日志设备,以供读取和写入,与文件系统调用的open类似;
- syslog:写入日志,与文件系统调用的write类似;
- closelog:关闭日志设备,与文件系统调用的close类似;
- vsyslog:它和syslog功能一样,负责写入日志,只是参数格式不同。
该函数的声明如下:
void openlog(const char *ident, int option, int facility);
此函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里添加信息了。而closelog函数就是用来关闭此连接的。
openlog 的第一个参数ident是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。第二个参数 option一般是下列选项值取“与”运算(使用“|”表示,如“LOG_CONS | LOG_PID”)的结果:
- LOG_CONS:如果送到system logger时发生问题,直接写入系统终端;
- LOG_NDELAY:立即开启连接,通常连接是在第一次写入消息时才打开的;
- LOG_PERROR:将消息也同时送到stderr设备;
- LOG_PID:将进程PID含入所有消息中。
- 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子系统使用
(2)syslog函数
syslog函数的声明如下:
void syslog(int priority, const char * message, ...);
第一个参数是消息的紧急级别priority,第二个参数是消息及其格式,之后是格式对应的参数,如同C语言里面printf输出函数一样使用,具体的格式这里就不再详述。
第一个参数priority,它是由severity level和facility组成的。Facility已经在上面介绍了,下面介绍一下severity level,也就是消息的重要级别,它主要包括:
- LOG_EMERG:紧急状况
- LOG_ALERT:高优先级问题,比如说数据库崩溃等,必须要立即采取反应行动
- LOG_CRIT:重要状况发生,比如硬件故障
- LOG_ERR:错误发生
- LOG_WARNING:警告发生
- LOG_NOTICE:一般状况,需要引起注意
- LOG_INFO:信息状况
- LOG_DEBUG:调试消息
在实际使用中,如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。
(3)closelog函数
其声明如下:
void closelog( void );
值得注意的是,虽然该函数的使用和调用情况非常简单,但是是必不可少的,因为在Linux系统中,打开的日志也是资源,如果只使用openlog函数打开 日 志,而忘记使用closelog关闭日志的话,当打开的日志数量累积到一定程度,便会造成内存不足,从而引起系统问题。
1)用syslog打印
#include <syslog.h>
#include <stdio.h>
#include <stdarg.h>
int main(void)
{
int log_test;
/*打开日志*/
openlog("main", LOG_PID|LOG_CONS, LOG_USER);
/*写日志*/
syslog(LOG_INFO, "PID information, pid=%d", getpid());
/*关闭日志*/
closelog();
return 1;
}
2)用vsyslog打印
#include <syslog.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
void p_syslog(char *format, ...)
{
va_list ap;
va_start(ap, format);
vsyslog(LOG_INFO, format, ap);
va_end(ap);
}
int main(void)
{
openlog("main", LOG_PID, 0);
int a = 10;
p_syslog("test is %d\n",a);
closelog();
return 1;
}
程序运行的结果写入日志:/var/log/message
【End】
本文部分概念描述性内容摘自:
http://weisjohn.blog.163.com/blog/static/310152562012326113450226
http://hi.baidu.com/ugo5/blog/item/cb90ca0b224ce82de8248831.html