systemd-journald和rsyslogd日志配置详解
ubuntu20.04系统上存在多个日志收集工具,一个是systemd自带的sysemd-journald和rsyslogd。这两个日志工具并不冲突,当然也就意味着在某些配置下一条日志信息被存储了两遍即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-rotateendscript
}/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 4weeklymissingoknotifemptycompressdelaycompresssharedscriptspostrotate/usr/lib/rsyslog/rsyslog-rotateendscript
}
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)