RHEL7: 系统日志(rsyslog, journal)

参考文档

http://fedoraproject.org/wiki/Changes/NoDefaultSyslog
http://0pointer.de/blog/projects/journalctl.html
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/s1-Using_the_Journal.html
https://wiki.archlinux.org/index.php/systemd


rsyslog

rsyslog.conf

日志的优先级。

Code Priority Severity
0 emerg System is unusable.
1 alert Action must be taken immediately.
2 crit Critical condition.
3 err Non-critical error condition.
4 warning Warning condition.
5 notice Normal but significant event.
6 info Informational event.
7 debug Debugging-level message.


在 /etc/rsyslog.conf 和 /etc/rsyslog.d/*.conf 中可以设置rsyslog记录日志的规则。

*.info;mail.none;authpriv.none;cron.none     /var/log/messages

*.info表示所有服务大于等于info优先级的信息都会记录到/var/log/messages中;
mail.none表示不记录任何mail的信息到/var/log/messages中。

logrotate

为防止/var/log/messages过大,logrotate可以定时按规则将日志归档到不同文件。
可以参考 man 8 logrotate
(TODO: 补充logrotate)

日志格式

rsyslog的日志有固定格式。
时间戳,发送消息的Host,发送消息的程序/进程,消息内容;

Dec 31 10:59:57 rhel7-0 yum[9992]: Installed: psmisc-22.20-8.el7.x86_64

用tail -f /var/log/messages 可以监视日志。

logger

用logger命令可以手动发送一条日志。不指定-p的话,它会以user.notice的优先级来发送消息。

[root@rhel7-0 ~]# logger -p local7.notice "Log entry created on rhel7"

[root@rhel7-0 ~]# tail -1 /var/log/boot.log 
Dec 31 11:53:30 rhel7-0 root: Log entry created on rhel7

修改完rsyslog的配置之后,重启rsyslog服务让它生效。

[root@rhel7-0 ~]# systemctl restart rsyslog.service

systemd Journal

journalctl是systemd的日志系统,它可以替代rsyslog来记录日志,也可以与rsyslog共存。

用journalctl查看日志

[root@rhel7-0 ~]# journalctl 

它类似于cat /var/log/messages
journal -n 类似于 tail /var/log/messsages
journalctl -f 类似于 tail -f /var/log/messages

用journal -p 可以看特定优先级(及更高优先级)的日志内容。

[root@rhel7-0 ~]# journalctl -p err

可以指定查看日志的时间

[root@rhel7-0 ~]# journalctl --since today
[root@rhel7-0 ~]# journalctl --since "2014-12-30" --until "2014-12-31"

第二条是不显示12-31日志的。

查看更详细的信息,可以用journalctl -o verbose

[root@rhel7-0 ~]# journalctl -o verbose
-- Logs begin at Tue 2014-12-30 20:19:53 EST, end at Wed 2014-12-31 12:21:51 EST. --
Tue 2014-12-30 20:19:53.575455 EST [s=d98f189de2ef411f8a45fdb5c6e2d84d;i=1;b=76af4accd843440c8b38e33f0dea260b;m=7ea4c;t=50b78e7a0481f;x=d3a97e9fae269460]
    PRIORITY=6
    _TRANSPORT=driver
    MESSAGE=Runtime journal is using 6.2M (max 49.7M, leaving 74.5M of free 490.8M, current limit 49.7M).
    MESSAGE_ID=ec387f577b844b8fa948f33cad9a75e6
    _PID=81
    _UID=0
    _GID=0
    _COMM=systemd-journal
    _EXE=/usr/lib/systemd/systemd-journald
    _CMDLINE=/usr/lib/systemd/systemd-journald
    _CAP_EFFECTIVE=4402800cf
    _SYSTEMD_CGROUP=/system.slice/systemd-journald.service
    _SYSTEMD_UNIT=systemd-journald.service
    _SYSTEMD_SLICE=system.slice
    _SELINUX_CONTEXT=kernel
    _BOOT_ID=76af4accd843440c8b38e33f0dea260b
    _MACHINE_ID=5ae5a23249dbba212fa0c307ab9f101f
    _HOSTNAME=localhost.localdomain

_COMM 是command的名称;
_EXE 是process的路径;
_SYSTEMD_UNIT The systemd unit that started the process;

可以用这些参数作为筛选条件进行查询,多个条件则需要同时满足。

[root@rhel7-0 ~]# journalctl _SYSTEMD_UNIT=sshd.service

永久记录

默认情况下,journal在重启后就清空了。要想永久保存日志,可以按以下方法操作。

[root@rhel7-0 ~]# mkdir /var/log/journal
[root@rhel7-0 ~]# chown root:systemd-journal /var/log/journal/
[root@rhel7-0 ~]# chmod 2755 /var/log/journal/
[root@rhel7-0 ~]# killall -USR1 systemd-journald