- journald
收集自系统启动以来的日志信息;主要包括三类:
- 内核通过printk()输出的内容
- 系统服务打印到STDOUT/STDERR的内容
- 用户应用通过syslog()输出的内容
存放在/run/log/journal目录下面。
命令行查看journald的日志:
$ journalctl -k --dmesg
$ journalctl -f --follow
有两点限制:
- journald的日志存储空间有限,缺省配置4G,超过后会被删除。
- 系统重启后所有的日志都会被清除
所以为了持久化日志,引入了rsyslog。
- rsyslog
journald的日志不是主动导出到rsyslog的,相反是rsyslog主动从journald导入日志的。
这在rsyslog的配置文件里面指定:/etc/rsyslog.conf
# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark # provides --MARK-- message capability
imjournal (im= import module)表示从系统日志导入。
其实上journald也可以配置成主动向rsyslog导出日志:/etc/systemd/journald.conf
#ForwardToSyslog=no
但通常有不打开这个开关,为了保持系统级别资源的健壮性。
和journald对资源的限制一样,rsyslog也不能在磁盘无限存储日志,所以引入logrotate机制删除日志。
- logrotate
不细说了。
- 应用程序如何输出日志到journald
用到API syslog()
#include <syslog.h>
int main(int argc, char *argv[]) {
syslog(LOG_NOTICE, "Hello World");
return 0;
}
编译运行,查看journald
$ journalctl -f
-- Logs begin at Fri 2020-03-20 16:58:04 UTC. --
...
Mar 20 22:41:42 <hostname> a.out[24770]: Hello World
...
包含时间戳,应用程序名以及PID信息。
与此同时,在rsyslog里面也能看到输出/var/log/messages
关于syslog的更高级API用法,例如修改程序名,指定facility等,可以参考API文档,这里不再细说了。
网友评论