systemd-journald和rsyslogd日志配置详解

        ubuntu20.04系统上存在多个日志收集工具,一个是systemd自带的sysemd-journaldrsyslogd。这两个日志工具并不冲突,当然也就意味着在某些配置下一条日志信息被存储了两遍即rsyslogd以文本的方式存储在/var/log/syslog文件中而systemd-journald以二进制的方式在/var/log/journal目录中也存储了一遍。rsyslogd是以文本方式存储日志,直接使用cat/tail -f 就可以查看日志内容,而systemd-journald是以二进制的方式存储日志,需要使用journalctl命令来查看日志。systemd服务(如 sshd、nginx)的日志会同时写入journald和syslog(通过 rsyslog转发)传统应用(如未适配 systemd 的脚本)可能仅写入 syslog。

        日志的配置重点如下:

                日志的大小(单个日志的大小或者整体日志的大小)

                日志轮转个数(能够存放几个日志)

                日志最大存储时间

1、rsyslogd日志配置详解

        syslog API​ 是Linux系统中应用程序与日志守护进程(如 syslogd、rsyslogd)通信的标准接口,通过一组C语言函数实现日志的发送、过滤和管理。它为应用程序提供了统一的日志记录方式,使得日志的格式、优先级和存储策略由系统级的配置文件统一控制,而非硬编码在应用程序中。

syslog API 包含以下核心函数,覆盖日志的初始化、发送、过滤和关闭操作:

openlog():初始化日志连接(设置标识符、选项、设施),必须在 syslog() 前调用。

syslog():发送日志消息到 syslog 守护进程(核心函数)。

closelog():关闭日志连接(释放资源,可选,程序退出时自动调用)。

setlogmask():设置日志掩码(过滤级别),控制哪些级别的日志会被发送。

下面是ubuntu下rsyslog的配置信息:/usr/sbin/rsyslogd -n -iNONE

root@mingl-ubuntu:/etc/rsyslog.d# cat 50-default.conf 
#  Default rules for rsyslog.
#
#            For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*            /var/log/auth.log
*.*;auth,authpriv.none        -/var/log/syslog
#cron.*                /var/log/cron.log
#daemon.*            -/var/log/daemon.log
kern.*                -/var/log/kern.log
#lpr.*                -/var/log/lpr.log
mail.*                -/var/log/mail.log
#user.*                -/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info            -/var/log/mail.info
#mail.warn            -/var/log/mail.warn
mail.err            /var/log/mail.err

#
# Some "catch-all" log files.
#
#*.=debug;\
#    auth,authpriv.none;\
#    news.none;mail.none    -/var/log/debug
#*.=info;*.=notice;*.=warn;\
#    auth,authpriv.none;\
#    cron,daemon.none;\
#    mail,news.none        -/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg                :omusrmsg:*

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
#    news.=crit;news.=err;news.=notice;\
#    *.=debug;*.=info;\
#    *.=notice;*.=warn    /dev/tty8

在Linux中配置​rsyslog单个日志文件的大小,核心是通过logrotate工具​(Linux 日志轮转服务)实现,而非rsyslog自身直接控制
logrotate负责定期检查日志文件大小,超过阈值时自动轮转(重命名、压缩或删除旧日志),从而限制单个日志文件的大小。
rsyslog的日志轮转配置通常存放在/etc/logrotate.d/rsyslog(部分系统可能为 /etc/logrotate.conf或 /etc/logrotate.d/syslog)。

mingl@mingl-ubuntu:/etc/logrotate.d$ cat rsyslog 
/var/log/syslog
{
    rotate 7         #保留最近7个轮转后的日志文件
    daily              #每天检查一次(可选,若设置size则此参数可忽略)
    missingok        #若日志文件不存在,不报错
    notifempty      #若日志文件为空,不轮转
    delaycompress    #延迟压缩(下次轮转时压缩前一个日志,避免立即压缩)
    compress        #轮转后的旧日志压缩(生成.gz文件)
    postrotate        #轮转后执行的脚本
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
    rotate 4
    weekly
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
    /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

2、systemd-journald日志配置详解

        journald.conf配置文件内容如下,这些参数是systemd-journald的核心配置项,用于控制日志的速率、存储、保留、转发及级别过滤。


mingl@mingl-ubuntu:/var/log/journal$ cat /etc/systemd/journald.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.

[Journal]
#Storage=auto		日志存储介质:- auto:优先使用持久化存储(/var/log/journal);- 若目录不存在,回退到内存(/run/log/journal);- 可选 volatile(仅内存)、none(禁用存储)。
#Compress=yes		是否压缩旧日志(节省磁盘空间,默认启用)
#Seal=yes			是否对日志文件进行加密密封(防篡改,默认启用,需 systemd-journald支持)
#SplitMode=uid		日志文件分割方式:- uid:按用户 ID 分割(默认);- none:不分割;- size:按大小分割(需配合 MaxFileSize)。
#SyncIntervalSec=5m		日志从内存缓冲区写入磁盘的最小时间间隔。

速率限制L:防止日志"洪水",用于控制日志写入的频率,避免单个进程/服务疯狂写日志导致系统资源(磁盘、内存、CPU)耗尽。
#RateLimitIntervalSec=30s	日志速率限制的时间窗口​(默认 30 秒)
#RateLimitBurst=10000		每个时间窗口内允许的最大日志条数​(默认 10000 条)

systemd-journald的日志分为持久化存储​(/var/log/journal)和内存临时存储​(/run/log/journal)
持久化存储(/var/log/journal)
#SystemMaxUse=		持久化存储的最大磁盘使用量​,超过则自动删除旧日志
#SystemKeepFree=		持久化存储需保持的最小空闲空间,不足则删除旧日志
#SystemMaxFileSize=		单个持久化日志文件的最大大小​,超过则轮转
#SystemMaxFiles=100		持久化日志文件的最大数量​(超过则删除最早的文件)

内存临时存储(/run/log/journal)
#RuntimeMaxUse=		内存临时存储的最大使用量​,超过则删除旧日志
#RuntimeKeepFree=		内存临时存储需保持的最小空闲空间,不足则删除旧日志
#RuntimeMaxFileSize=		单个持久化日志文件的最大大小,超过则轮转
#RuntimeMaxFiles=100		持久化日志文件的最大数量​,超过则删除最早的文件

日志保留策略,控制日志生命周期
#MaxRetentionSec=		日志的总保留时长​,如7d,保留最近7天的日志;未设置则由存储限制自动管理
#MaxFileSec=1month		单个日志文件的最大保留时长​,默认1个月,超过则轮转

日志转发:控制日志流向,systemd-journald可将日志转发给其他服务如rsyslog、控制台,以下参数控制转发目标和行为
#ForwardToSyslog=yes		是否转发给rsyslogd,默认 yes,日志会写入 /var/log/syslog
#ForwardToKMsg=no 		是否转发给内核消息缓冲区(默认 no)
#ForwardToConsole=no		是否转发到物理控制台(默认 no)
#ForwardToWall=yes		是否转发到wall(控制台广播,默认 yes,紧急日志会显示在终端)
#TTYPath=/dev/console	wall消息的目标控制台路径(默认 /dev/console)

日志级别过滤:控制存储/转发的详细程度
systemd-journald支持按日志级别过滤存储或转发的内容(级别从高到低:emerg> alert> crit> err> warning> notice> info> debug)

#MaxLevelStore=debug		存储到journald的最高日志级别​(debug表示存储所有级别)
#MaxLevelSyslog=debug	转发给rsyslog的最高日志级别​(debug表示所有级别都转发)
#MaxLevelKMsg=notice		转发给内核消息的最高日志级别​(仅 notice及以上级别会被转发)
#MaxLevelConsole=info		转发到控制台的最高日志级别​(info及以上级别才会显示)
#MaxLevelWall=emerg		转发到wall的最高日志级别​(仅 emerg紧急级别会广播)

#LineMax=48K		单条日志的最大长度​(超过部分会被截断,默认 48KB)
#ReadKMsg=yes		是否读取内核消息​(默认 yes,内核日志会进入 journald)

Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 1 be/4 root 0.00 B/s 0.00 B/s ?unavailable? systemd --system --deserialize 35 2 be/4 root 0.00 B/s 0.00 B/s ?unavailable? init 9 be/4 root 0.00 B/s 0.00 B/s ?unavailable? init [Interop] 7 be/4 root 0.00 B/s 0.00 B/s ?unavailable? plan9 --control-socket 7 --log-level 4 --server-fd 8 --pipe-fd 10 --log-truncate 8 be/4 root 0.00 B/s 0.00 B/s ?unavailable? plan9 --control-socket 7 --log-level 4 --server-fd 8 --pipe-fd 10 --log-truncate 184 be/4 root 0.00 B/s 0.00 B/s ?unavailable? cron -f -P 186 be/4 messageb 0.00 B/s 0.00 B/s ?unavailable? @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only 191 be/4 root 0.00 B/s 0.00 B/s ?unavailable? python3 /usr/bin/networkd-dispatcher --run-startup-triggers 203 be/4 root 0.00 B/s 0.00 B/s ?unavailable? systemd-logind 223 be/4 root 0.00 B/s 0.00 B/s ?unavailable? agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220 228 be/4 root 0.00 B/s 0.00 B/s ?unavailable? agetty -o -p -- \u --noclear tty1 linux 229 be/4 root 0.00 B/s 0.00 B/s ?unavailable? python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal 256 be/4 root 0.00 B/s 0.00 B/s ?unavailable? python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal [gmain] 280 be/4 root 0.00 B/s 0.00 B/s ?unavailable? init 282 be/4 root 0.00 B/s 0.00 B/s ?unavailable? login -f 313 be/4 gapinyc 0.00 B/s 0.00 B/s ?unavailable? systemd --user 314 be/4 gapinyc 0.00 B/s 0.00 B/s ?unavailable? (sd-pam) 325 be/4 gapinyc 0.00 B/s 0.00 B/s ?unavailable? -bash 707 be/4 root 0.00 B/s 0.00 B/s ?unavailable? packagekitd 708 be/4 root 0.00 B/s 0.00 B/s ?unavailable? packagekitd [gmain] 709 be/4 root 0.00 B/s 0.00 B/s ?unavailable? packagekitd [gdbus] 711 be/4 root 0.00 B/s 0.00 B/s ?unavailable? polkitd --no-debug 712 be/4 root 0.00 B/s 0.00 B/s ?unavailable? polkitd --no-debug [gmain] 714 be/4 root 0.00 B/s 0.00 B/s ?unavailable? polkitd --no-debug [gdbus] 3897 be/4 root 0.00 B/s 0.00 B/s ?unavailable? systemd-udevd 4231 be/4 systemd- 0.00 B/s 0.00 B/s ?unavailable? systemd-resolved 4234 be/3 root 0.00 B/s 0.00 B/s ?unavailable? systemd-journald 4450 be/4 systemd- 0.00 B/s 0.00 B/s ?unavailable? systemd-timesyncd 4451 be/4 systemd- 0.00 B/s 0.00 B/s ?unavailable? systemd-timesyncd [sd-resolve] 4954 be/4 syslog 0.00 B/s 0.00 B/s ?unavailable? rsyslogd -n -iNONE 4955 be/4 syslog 0.00 B/s 0.00 B/s ?unavailable? rsyslogd -n -iNONE [in:imuxsock] 4956 be/4 syslog 0.00 B/s 0.00 B/s ?unavailable? rsyslogd -n -iNONE [in:imklog] 4957 be/4 syslog 0.00 B/s 0.00 B/s ?unavailable? rsyslogd -n -iNONE [rs:main Q:Reg] 5992 be/4 root 0.00 B/s 0.00 B/s ?unavailable? nginx: master process /usr/sbin/nginx -g daemon on; master_process on; 5994 be/4 www-data 0.00 B/s 0.00 B/s ?unavailable? nginx: worker process 5995 be/4 www-data 0.00 B/s 0.00 B/s ?unavailable? nginx: worker process 5996 be/4 www-data 0.00 B/s 0.00 B/s ?unavailable? nginx: worker process 5997 be/4 www-data 0.00 B/s 0.00 B/s ?unavailable? nginx: worker process 5998 be/4 www-data 0.00 B/s 0.00 B/s ?unavailable? nginx: worker process keys: any: refresh q: quit i: ionice o: active p: procs a: accum sort: r: asc left: SWAPIN right: COMMAND home: TID end: COMMAND CONFIG_TASK_DELAY_ACCT not enabled in kernel, cannot determine SWAPIN and IO %
最新发布
10-26
### 功能 `systemd-journald.service` 是 `systemd` 组件之一,负责收集并存储来自内核、应用程序服务的日志数据。该服务通过多种方式接收消息,包括但不限于 Unix 域套接字 `/run/systemd/journal/dev-log` 审计框架接口。日志条目不仅限于文本形式;它们还可以携带结构化字段其他元数据,从而增强了过滤检索能力[^1]。 ### 配置 配置文件位于 `/etc/systemd/journald.conf` 或者 `/etc/systemd/journald.conf.d/*.conf` 中。此文件允许管理员调整日志记录行为的关键参数: - **Storage**: 定义日志持久化的策略,默认设置为 `auto` 表示当有可用磁盘空间时保存到硬盘上;其他选项还包括 `volatile`(仅存放在内存),`persistent`(强制写入磁盘)以及 `none`(不保留任何历史)[^2]。 - **Compress**: 启用压缩长期储存的日志以节省空间。 - **MaxFileSec**: 控制单个日志文件的最大生存时间。 要应用更改后的配置,需重启 `systemd-journald` 服务: ```bash sudo systemctl restart systemd-journald ``` 对于不再希望启用的服务组件,可以通过停止并禁用相应单元来实现: ```bash sudo systemctl stop systemd-journald systemd-journald-dev-log.socket systemd-journald.socket systemd-journald-audit.socket sudo systemctl disable systemd-journald ``` ### 使用方法 为了查看当前系统的日志信息,可利用命令行工具 `journalctl` 。它提供了灵活的时间范围筛选器(-S, -U),优先级过滤(--priority=),关键字匹配等特性。例如获取最近三天内的警告及以上级别的错误报告可以用下面的方式执行: ```bash journalctl --since "3 days ago" --until "now" --priority=warning.. ``` 此外,在新版本的 Linux 发行版如 CentOS 7 上,得益于优化过的架构设计,即使面对海量的数据量也能够保持高效的查询响应速度[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值