参考连接:
http://zhouyang340.blog.163.com/blog/static/302409592012729102343362/
http://blog.youkuaiyun.com/qpwyj/article/details/40382271
http://blog.youkuaiyun.com/balderfan/article/details/7571724
https://linux.die.net/man/5/syslog.conf
- syslog是 Unix 系统的一个常见组件,用于执行系统日志记录活动。
- syslogd 是它的守护进程,syslogd 从一组日志源(如 /dev/log 和 /dev/klog )中读取数据,并按照 /etc/syslog.conf 中的说明处理这些日志消息。通过调用syslog(),可将应用程序日志消息记录到 syslog 中。syslog 消息采用一种包含可选优先级和设备的标准格式。优先级指示消息的紧急程度,设备指示发布消息的子系统。/usr/include/syslog.h中定义了它的优先级和设备资源。
- klog是一个从Unix内核接受消息的设备,klogd 守护进程获得并记录 Linux 内核信息。通常,syslogd 会记录 klogd 传来的所有内核信息。
下文涉及的知识主要包括:
- syslogd进程的配置文件/etc/syslog.conf
- printk()
- syslog编程接口
- logger程序
- 日志滚动
1、/etc/syslog.conf
This file specifies rules for logging, every rule consists of two fields, a selector
field and an action
field. These two fields are separated by one or more spaces or tabs.
Selector
The selector field specifies a pattern of facilities and priorities belonging to the specified action.
The selector field itself again consists of two parts, a facility and apriority,separated by a period.
Action
The action field of a rule describes the abstract term ''logfile''. A ''logfile'' need not to be a real file, btw.
可能的值:
- Regular File,-表示不实时同步
- Named Pipes
- Terminal and Console
- Remote Machine
- List of Users,
*
表示所有登陆用户
Examples
# Kernel messages are first, stored in the kernel file
kern.* /var/adm/kernel
# critical messages and higher ones also go to another host and to the console
kern.crit @finlandia
kern.crit /dev/console
2、printk
printk相当于printf的孪生姐妹,她们一个运行在用户态,另一个则在内核态被人们所熟知。
2.1 printk和printf有一个不同的地方,使用这个函数不一定会将内容显示到终端上,但是一定在内核缓冲区里。
2.2 使用printk时内核会根据日志级别,可能把消息打印到当前控制台上(这个控制台通常是一个字符模式的终端、一个串口打印机或是一个并口打印机),这些消息正常输出的前提是:日志输出级别小于console_loglevel(在内核中数字越小优先级越高);没有指定日志级别的printk语句默认采用的级别是DEFAULT_MESSAGE_LOGLEVEL
,这个默认级别一般为<4>,即与KERN_WARNING
在一个级别上)。
2.3 通过读写/proc/sys/kernel/printk文件可读取和修改控制台的日志级别。
2.3.1 查看这个文件的方法如下:
#cat /proc/sys/kernel/printk --> 6 4 1 7
上面显示的4个数据分别对应控制台日志级别
、默认的消息日志级别
、最低的控制台日志级别
和默认的控制台日志级别
。
2.3.2可用下面的命令设置当前日志级别:
# echo 8 > /proc/sys/kernel/printk
这样所有级别<8的消息都可以显示在控制台上.
2.4 如果没有输出到控制台我们可以去/var/log/messages
里面去查看,如果klogd
没有运行,消息不会传递到用户空间,只能查看/proc/kmsg
(dmesg
命令可以查看)。
3、syslog编程接口
syslog库API在syslog.h文件中定义,它提供了函数openlog、syslog和closelog用来将应用程序中的日志消息写入日志系统。
// 表示用程序的基本名字作为消息标签头<Tag:[pid]>
openlog (program_name, 0 , LOG_AUTH ); // LOG_AUTH表示安全或授权消息
//打印消息
syslog (LOG_NOTICE, //消息优先级
"%s\nu", "hello printk"); //和printf相同
closelog (); //关闭
4、logger
logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。
logger 语法
logger [options] [messages]
options (选项)
-d, –udp 使用数据报(UDP)而不是使用默认的流连接(TCP)
-i, –id 逐行记录每一次logger的进程ID
-f, –file file_name记录特定的文件
-h, –help 显示帮助文本并退出
-n, –server 写入指定的远程syslog服务器,使用UDP代替内装式syslog的例程
-P, –port port_num 使用指定的UDP端口。默认的端口号是514
-p, –priority priority_level指定输入消息的优先级,优先级可以是数字或者指定为 ” facility.level” 的格式。默认级别是 “user.notice”
-s, –stderr 输出标准错误到系统日志。
-t, –tag tag 指定标记记录
-u, –socket socket 写入指定的socket,而不是到内置系统日志例程。
-V, –version 现实版本信息并退出messages:写入log文件的内容消息,可以与-f配合使用。
5、日志滚动
系统时时刻刻都在产生日志,如果不及时清理,很快就会灌满硬盘,但如果要手工清理,又很麻烦。logrotate 用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。
我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过一个叫做crond的守护进程来执行,logrotate 还可以用于压缩日志文件,以及发送日志到指定的E-mail 。
logrotate 的配置文件是 /etc/logrotate.conf
,主要参数如下表:
参数 功能
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig .rpmsave
size size 当日志文件到达指定的大小时才转储,可以指定bytes(缺省)以及KB(sizek)或者MB (sizem).
系统对 logrotate 的执行和操作:
在/etc/cron.daily/
路径下,有一个logrotate的shell脚本,所以cron程序会每天调用一次logrotate程序,然后logrotate程序回去检查日志文件是否符合回滚条件,并执行相应动作。
执行操作:/usr/sbin/logrotate /etc/cron.daily/logrotate.conf;
在/etc/logrotate.conf文件中,有如下选项:
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
#这个选项说明在执行logrotate程序时,同时执行/etc/logrotated目录下的所有脚本。
执行动作示例:每月清除/var/log/wtmp目录中的相关内容:
/var/log/wtmp {
monthly
create 0664 root root
rotate 1
}