1 日志文件
LINUX保存了系统中所发生事件的详细记录,这些记录称作日志文件或消息文件。可以查阅日志文件来确定系统当前状态、观察入侵者踪迹、寻找某特定程序(或事件)相关的数据。
守护进程并不拥有控制终端,因此无法将进程运行信息输出显示,因此会向相应的日志文件中写入记录。Linux内核本身也会将一些系统信息写入相应的日志文件。
1.1 日志消息
日志消息是对程序内正在发生的事件的一个描述,通过日志消息可以报告正常的信息(比如,某用户已经登录系统)、也可以发出告警信息(比如,某用户进行了未成功的登录尝试)、或报告严重错误指明某程序即将崩溃。
1.2 日志文件或消息文件的格式
日志文件中的每条消息一次包含如下一些内容:
(1) 事件发生的日期和时间,通常称为时间戳
(2) 事件发生原系统的主机名或计算机名
(3) 产生日志消息的程序名
(4) 消息文本自身,可能会超过一行
2 syslogd与klogd守护进程
syslogd与klogd(监控linux内核提交的消息)守护进程负责记录、发送系统或工具产生的信息,二者的配置文件都是/etc/syslog.conf。
每次启动Linux时,syslogd与klogd这两个守护进程都会由/etc/rc.d/inid.d中的初始化脚本启动。
当系统内核或工具产生信息时,通过调用相关函数,将信息发送到syslogd或klogd守护进程。syslogd与klogd守护进程会根据/etc/syslog.conf中的配置信息,对消息的去向作出处理。
2.1 /etc/syslog.conf配置文件
2.1.1 /etc/syslog.conf文件中每行的格式
/etc/syslog.conf文件中,以#开始的行是注释文本。
2.1.2 选择器
用于标明应该记录那些消息的一组单词,由两部分组成:设备(facility)和优先级(priority)。
当匹配了facility且优先级大于或等于/etc/syslog.conf文件指定的优先级时,该条消息才会被记录到相关的日志文件中去。
2.1.2.1设备(facility)
设备(facility),生成该消息的程序所选择的类别。如表2.1.2.1所示。
facility取值 |
值 |
说明 |
kern |
0 |
内核日志信息 |
user |
1 |
用户日志信息 |
mail |
2 |
邮件系统日志信息 |
daemon |
3 |
系统守护进程日志信息 |
auth |
4 |
安全管理日志信息 |
syslog |
5 |
syslogd守护进程的日志信息 |
lpr |
6 |
打印服务日志信息 |
news |
7 |
新闻组服务日志信息 |
uucp |
8 |
uucp系统日志信息 |
cron |
9 |
守护进程cron的日志信息 |
authpriv |
10 |
私有的安全管理日志信息 |
ftp |
11 |
ftp守护进程 |
|
12~15 |
系统保留 |
local0~local7 |
16~23 |
保留给系统本地使用 |
表2.1.2.2 facility字段
2.1.2.2优先级(priority)
优先级(priority),表明该消息所代表事件的严重程度。如表2.1.2.2所示。
priority取值 |
值 |
说明 |
emerge |
0 |
发生严重事件,并有导致系统崩溃的潜在危险 |
alert |
1 |
严重错误消息,会导致程序关闭并可能影响其他程序 |
crit |
2 |
错误消息,可能会导致程序关闭的事件 |
err |
3 |
程序中存在错误的通告 |
warning |
4 |
程序中存在潜在问题的警告信息 |
notice |
5 |
程序运行中产生了值得注意的事件 |
info |
6 |
关于程序当前状态的报告信息 |
debug |
7 |
编程人员或测试人员使用的调试信息 |
表2.1.2.2 消息优先级
注意:在表2.1.2.2中,值越小级别越高。
2.1.3 动作
动作或处理方案,确定了syslogd与klogd守护进程将日志消息发送到什么地方去。
(1) 普通文件:使用文件的绝对路径来指明日志文件所在的位置,例如:/var/log/cron。
(2) 终端设备:终端可以是/dev/tty0~/dev/tty6,也可以为/dev/console。
(3) 用户列表:例如动作为“root hackbutter”,将消息写入到用户root与hackbutter的计算机屏幕上。
(4) 远程主机:将信息发往网络中的其他主机的syslogd守护进程,格式为“@hostname”。
2.1.4 配置文件的语法说明
(1) *用作设备或优先级时,可以匹配所有的设备或优先级。
(2) *用作动作时,将消息发送给所有的登录用户。
(3) 多个选择器可在同一行中,并使用分号分隔开。
(4) 可以同时指定多个设备或优先级,之间用逗号分开。如,uucp,news.crit。
(5) 关键字none用作优先级时,会屏蔽所有来自指定设备的消息。
(6) 通过使用相同的选择器和不同的动作,同一消息可以记录到多个位置。
(7) syslog.conf文件中后面的配置行不会覆盖前面的配置行,每一行指定的动作都独立的运作。
修改syslog.conf配置文件之后,必须通知syslogd和klogd重新读取该配置文件,这样改动才会生效。有三种通知方法:
(1) 使用service命令:
# service syslog restart
syslog服务可以同时重启这两个日志守护进程。
(2) 向日志守护进程发送重启信号:
很多linux守护进程都把自身的PID存储在文件中,可以在kill命令中向日志守护进程发送SIGHUP信号,守护进程收到这样的信号后会重新读取自身的配置文件。
展示syslogd的PID:#cat /var/run/syslogd.pid
展示klogd的PID: #cat /var/run/klogd.pid
# kill –HUP ` cat /var/run/syslogd.pid `
# kill –HUP ` cat /var/run/klogd.pid `
(3) 使用killall命令向日志守护进程发送信号:
#killall -HUP syslogd
#killall -HUP klogd
3 程序添加日志功能的流程
openlog() → syslog() → closelog()
openlog、syslog、closelog的函数原型:
#include
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
int setlogmask(int maskpri);
3.1 openlog函数
openlog函数用于打开系统日志链接,只有在打开连接后,才能使用syslog函数向日志文件中添加日志信息。
ident参数:标识信息的来源,其指向的字符信息会被固定地添加在每行日志的前面。
option参数:用于指定openlog函数和接下来调用的syslog函数的控制标志,如下表所示。
参数 |
说明 |
LOG_CONS |
如果将信息发送给syslogd守护进程时发生错误,直接将相关信息输出到终端 |
LOG_NDELAY |
立即打开与系统日志的连接,通常情况下,只有在产生第一条日志信息的情况下才会打开与日志系统的连接 |
LOG_NOWAIT |
在记录日志信息时,不等待可能的子进程的创建 |
LOG_ODELAY |
类似于LOG_NDELAY参数,与系统日志的连接只有在syslog函数调用时才会创建 |
LOG_PERROR |
将信息写入日志的同时,将信息发送到标准错误输出 |
LOG_PID |
每条日志信息中都包括进程号 |
openlog函数中的option取值表
facality参数 |
Syslog.conf中对应的facality取值 |
LOG_KERN |
kern |
LOG_USER |
user |
LOG_MAIL |
mail |
LOG_DEAMON |
daemon |
LOG_AUTH |
auth |
LOG_SYSLOG |
syslog |
LOG_LPR |
lpr |
LOG_NEWS |
news |
LOG_UUCP |
uucp |
LOG_CRON |
cron |
LOG_AUTHPRIV |
authpriv |
LOG_FTP |
ftp |
LOG_LOCAL0~ LOG_LOCAL7 |
local0~local7 |
penlog函数中的facality取值表
3.2 syslog函数
syslog函数的过程就是写入日志的过程。
priority参数:表示消息的级别,如下表所示。
priority参数 |
syslog.conf中对应的level取值 |
LOG_EMERG |
emerge |
LOG_ALERT |
alert |
LOG_CRIT |
crit |
LOG_ERR |
err |
LOG_WARNING |
warning |
LOG_NOTICE |
notice |
LOG_INFO |
info |
LOG_DEBUG |
debug |
syslog函数参数priority取值表
第二个参数,为消息格式,之后是格式对应的参数,类似于printf函数。