美文网首页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