经常系统某个进程出现异常,就会不自然地通过查看log日志来定位问题,大多数的信息都是通过用户进程调用syslog来产生日志信息
一般进程读取的是syslog.conf配置文件,这个配置文件决定了不同种类的信息会送往何处,但在CentOS6.4上找不到这个配置文件,但是有一个rsyslog.conf文件,而且传统的守护进程syslogd也没有,应该是RHEL做了相应的修改
接口函数,指定了送信息的位置和优先级
#include <syslog.h> void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, ...); void closelog(void);
如果不调用openlog,在第一次用syslog的时候自动调用openlog;同样closelog也是可选的,关闭曾被用于和syslogd守护进程通信的描述符
openlog的第一个参数ident是一个字符串,一般可以指定进程名;参数option一般是下面这些选项的运算结果
LOG_CONS 直接写入系统控制台,如果有一个错误,同时发送到系统日志记录 LOG_NDELAY 立即打开连接(通常,打开连接时记录的第一条消息) LOG_NOWAIT 不要等待子进程,因为其有可能在记录消息的时候就被创建了 LOG_ODELAY 延迟连接的打开直到syslog函数调用 LOG_PERROR 同时输出到stderr(标准错误文件) LOG_PID 包括每个消息的PID
第三个参数facility可以对不同的消息做不同的处理,有以下选项
LOG_AUTH 认证系统:login、su、getty等 LOG_AUTHPRIV 同LOG_AUTH,但只登录到所选择的单个用户可读的文件中 LOG_CRON cron守护进程 LOG_DAEMON 其他系统守护进程,如routed LOG_FTP 文件传输协议:ftpd、tftpd LOG_KERN 内核产生的消息 LOG_LPR 系统打印机缓冲池:lpr、lpd LOG_MAIL 电子邮件系统 LOG_NEWS 网络新闻系统 LOG_SYSLOG 由syslogd(8)产生的内部消息 LOG_USER 随机用户进程产生的消息 LOG_UUCP UUCP子系统 LOG_LOCAL0~7 为本地使用保留
syslog的第一个参数priority其实是facility和level的组合,其中level的值按照优先级从高到低排序为:
LOG_EMERG 紧急情况 LOG_ALERT 应该被立即改正的问题,如系统数据库破坏 LOG_CRIT 重要情况,如硬盘错误 LOG_ERR 错误 LOG_WARNING 警告信息 LOG_NOTICE 不是错误情况,但是可能需要处理 LOG_INFO 情报信息 LOG_DEBUG 包含情报的信息,通常旨在调试一个程序时使用
format参数可以格式化输出一些信息,比如文件名等
下面在CentOS6.4上,创建一个指定的log文件,然后通过调用openlog将我们自己的进程的信息打印到指定的log文件中,以便于我们检索:
1:指定log文件
vim /etc/rsyslog.conf,添加一行指定自己的log文件
# Save boot messages also to boot.log local7.* /var/log/boot.log local1.* /var/log/lihui.log
重启服务
[root@localhost ~]# service rsyslog restart Shutting down system logger: [ OK ] Starting system logger: [ OK ]
这样,会有该log文件生成:
[root@localhost ~]# ll /var/log/lihui.log -rw-------. 1 root root 0 Jan 26 00:12 /var/log/lihui.log
2:编译下面C程序
#include <syslog.h> int main(int argc, char **argv) { openlog("lihui", LOG_CONS | LOG_PID, LOG_LOCAL1); syslog(LOG_INFO, "This is a syslog test by '%s'\n", argv[0]); closelog(); return 0; }
3:搜索log文件
运行编译的a.out,然后通过tail检索打印的信息
[root@localhost ~]# ./a.out [root@localhost ~]# [root@localhost ~]# tail -f /var/log/lihui.log Jan 26 00:20:38 localhost lihui[31407]: This is a syslog test by './a.out'
这样,我们自定义的信息就写入了我们自定义的log文件当中!