美文网首页Linux/网络
Linux上journald, rsyslog,和logrota

Linux上journald, rsyslog,和logrota

作者: CodingCode | 来源:发表于2020-03-21 06:56 被阅读0次
  1. journald

收集自系统启动以来的日志信息;主要包括三类:

  1. 内核通过printk()输出的内容
  2. 系统服务打印到STDOUT/STDERR的内容
  3. 用户应用通过syslog()输出的内容

存放在/run/log/journal目录下面。

命令行查看journald的日志:

$ journalctl -k --dmesg
$ journalctl -f --follow

有两点限制:

  1. journald的日志存储空间有限,缺省配置4G,超过后会被删除。
  2. 系统重启后所有的日志都会被清除

所以为了持久化日志,引入了rsyslog。

  1. 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机制删除日志。

  1. logrotate

不细说了。

  1. 应用程序如何输出日志到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文档,这里不再细说了。

相关文章

网友评论

    本文标题:Linux上journald, rsyslog,和logrota

    本文链接:https://www.haomeiwen.com/subject/vlbeyhtx.html