Linux日志记录

经常系统某个进程出现异常,就会不自然地通过查看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文件当中!

发表回复