目录
一、常用日志服务介绍
日志记录的内容包括:
⚪历史事件:时间,地点,人物,事件。
⚪日志级别:事件的关键性程度,Loglevel。
1、sysklogd 系统日志服务
在 CentOS5 以及之前的发行版中,其采用的 sysklogd 服务来记录和管理系统日志的。
sysklogd 服务有两个模块:
klogd: 用于记录 linux kernel 相关的日志
syslogd:用于记录用户空间应用日志
2、rsyslog 系统日志服务
rsyslog 是 CentOS6 以后的版本中使用的日志管理程序,是一个默认安装的服务,并且默认开机启动。
特性:
⚪支持输出日志到各种数据库,如 MySQL,PostgreSQL,MongoDB ElasticSearch,实现使用第三方服务对日志进行存储和分析。
⚪精细的输出格式控制以及对日志内容的强大过滤能力,可实现过滤记录日志信息中的指定部份。
⚪通过 RELP + TCP 实现数据的可靠传。
⚪支持数据的加密和压缩传输等。
⚪多线程。
[root@rocky8-153 ~]#rpm -q rsyslog
rsyslog-8.2102.0-15.el8_10.1.x86_64
[root@ubuntu2204-150 ~]# dpkg -l rsyslog
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-===================-============-=========================================
ii rsyslog 8.2112.0-2ubuntu2.2 amd64 reliable system and kernel logging daemon
3、ELK日志服务
ELK 是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。在后续发展的过程中增加了一个 FileBeat,这几款软件通常在一起配合使用,各司其职。ELK 主要用于部署在企业架构中,收集多台设备上多个服务的日志信息,并将其统一整合后提供给用户。
rsyslog 日志服务与 ELK 日志服务的区别:
rsyslog 主要用于单机日志管理,ELK 主要用于分布式集群环境中的日志管理。
二、rsyslog日志管理
1、系统日志相关概念
facility: 设施,从功能或程序上对日志进行归类
在一台主机上会同时运行多个服务和软件,每个服务或软件都有可能会产生大量的日志,如果每个服务或软件产生的日志都独立存放管理,那文件数量就太多了,如果都放到一个文件中,似乎也不是很合适,所以 syslog 将日志进行了分类,相同类型的日志放一个文件,这样便于管理。
LOG_AUTH # 安全和认证相关的日志(公开)
LOG_AUTHPRIV # 安全和认证相关的日志(私有,需权限访问)
LOG_CRON # 系统定时任务(crontab/at)产生的日志
LOG_DAEMON # 各守护进程(如httpd、sshd等)产生的日志
LOG_FTP # FTP守护进程(vsftpd/proftpd)产生的日志
LOG_KERN # 内核产生的日志(如内核模块、硬件错误)
LOG_LOCAL0-7 # 自定义分类(用户可自由定义用途)
LOG_LPR # 打印服务(CUPS/LPD)产生的日志
LOG_MAIL # 邮件服务(Postfix/Sendmail)产生的日志
LOG_NEWS # 网络新闻服务(NNTP)产生的日志
LOG_SYSLOG # syslogd服务自身的日志(如配置变更、启动失败)
LOG_USER # 默认用户级日志(未明确分类时使用)
LOG_UUCP # UUCP子系统(Unix-to-Unix复制协议)的日志
* # 通配符,代表所有分类(慎用,可能引发日志风暴)
Priority: 优先级别,从高到低排序
rsyslog 在记录日志的时候,将各种产生日志的事件和行为进行了优先级的排序,使用者可以根据不同环境(测试/生产)和需求,设置不同的级别来记录日志,这样可以保证,记录下来的内容都是是我们想要的。
#syslog 内置优先级分类,从高到低,如果在记录日志时,设置了优先级,则只会记录设定的优先级和高于设定优先级的日志
LOG_EMERG # emerg/panic 紧急、致命错误,系统不可用(最高优先级)
LOG_ALERT # alert 告警,需立即处理(如安全攻击)
LOG_CRIT # crit 关键错误(如硬件故障、服务崩溃)
LOG_ERR # err/error 普通错误(如文件未找到)
LOG_WARNING # warning/warn 警告(非错误但需注意)
LOG_NOTICE # notice 通知(正常但重要的事件)
LOG_INFO # info 信息性消息(常规运行日志)
LOG_DEBUG # debug 调试信息(最低优先级)
* # 所有优先级(通配符)
none # 禁用日志记录(不记录任何内容)
#查看相关说明
man 3 syslog
man 5 rsyslog.conf
https://www.rsyslog.com/doc/master/index.html
2、rsyslog服务组成
#查看所有 rsyslog 包中的文件
[root@ubuntu2204-150 ~]# dpkg -L rsyslog
/usr/sbin/rsyslogd #主程序
/lib/systemd/system/rsyslog.service #服务脚本
/etc/rsyslog.conf #主配置文件
/etc/rsyslog.d/*.conf #配置文件目录中的配置文件
/usr/lib/x86_64-linux-gnu/rsyslog/*.so #库文件
#rsyslog服务默认加开机启动
[root@ubuntu2204-150 ~]# systemctl status rsyslog
● rsyslog.service - System Logging Service
Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2025-12-11 13:51:15 CST; 6h ago
TriggeredBy: ● syslog.socket
...
#查看syslogd程序打开的文件
[root@ubuntu2204-150 ~]# lsof -c rsyslog
...
3、rsyslog配置文件
#主配置文件
[root@ubuntu2204-150 ~]# ls /etc/rsyslog.conf
/etc/rsyslog.conf
#模块化配置目录(按功能拆分的子配置)
[root@ubuntu2204-150 ~]# ls /etc/rsyslog.d/
20-ufw.conf 21-cloudinit.conf 50-default.conf
#在主配置文件中,将配置分为三个部份,分别是模块(MODULES),全局配置(GLOBAL DIRECTIVES), 日志记录规则配置(RULES)
[root@ubuntu2204-150 ~]# cat /etc/rsyslog.conf
...
# ubuntu 系统中,默认 rule 规则是单独放在一个文件中的
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
#rsyslog 在安装时是有很多支持模块,但默认不是所有模块都开启,如果有需要,写在此处即可
#################
#### MODULES ####
#################
module(load="imuxsock") #提供对本地系统日志(如syslog()系统调用)的支持
#module(load="immark") #提供--MARK--标记功能,定期插入,检测日志是否中断
# provides UDP syslog reception
#module(load="imudp") #提供UDP日志接收功能(未启用)
#input(type="imudp" port="514") #UDP监听端口514(未启用)
# provides TCP syslog reception
#module(load="imtcp") #提供TCP日志接收功能(未启用)
#input(type="imtcp" port="514") #TCP监听端口514(未启用)
# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on") #启用内核日志支持
###########################
#### GLOBAL DIRECTIVES ####
###########################
#默认日志格式模板
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
#开启重复过滤(默认开启)
$RepeatedMsgReduction on
#创建日志文件的默认权限和属主属组
$FileOwner syslog # 日志文件所有者
$FileGroup adm # 日志文件所属组
$FileCreateMode 0640 # 文件权限:用户读写,组读,其他无权限
$DirCreateMode 0755 # 目录权限:所有者读写执行,组和其他读执行
$Umask 0022 # 文件创建掩码(确保权限正确)
$PrivDropToUser syslog # 运行时降权到syslog用户
$PrivDropToGroup syslog # 运行时降权到syslog组
#工作目录,存放临时文件(如队列、状态文件)的目录,默认为空
$WorkDirectory /var/spool/rsyslog
#独立配置文件引用目录
$IncludeConfig /etc/rsyslog.d/*.conf
#
[root@rocky8-153 ~]#cat /etc/rsyslog.conf
# rsyslog configuration file
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
#### MODULES ####
module(load="imuxsock" # provides support for local system logging (e.g. via logger command)
SysSock.Use="off") # Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
module(load="imjournal" # provides access to the systemd journal
UsePid="system" # PID nummber is retrieved as the ID of the process the journal entry originates from
StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark") # provides --MARK-- message capability
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
#module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")
#### GLOBAL DIRECTIVES ####
# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")
# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
# ### sample forwarding rule ###
#action(type="omfwd"
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#queue.filename="fwdRule1" # unique name prefix for spool files
#queue.maxdiskspace="1g" # 1gb space limit (use as much as possible)
#queue.saveonshutdown="on" # save messages to disk on shutdown
#queue.type="LinkedList" # run asynchronously
#action.resumeRetryCount="-1" # infinite retries if host is down
# Remote Logging (we use TCP for reliable delivery)
# remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")
rule配置规则
每一行 rule 由两列组成,分别是选择器selector和处理动作action,选择器将过滤后的日志交由处理动作处理。
选择器可以同时有多个,用分号分隔,处理动作也可以同时有多个,用 & 分隔,处理动作中可以指定模板,不同的模板会生成不同的日志内容,模板可以自定义。
选择器定义方式:
⚪用分类和优先级来过滤,同一条 rule 中,分类和优先级都可以有多个,用逗号分隔。
⚪基于日志内容中的指定字段来过滤。
⚪基于表达式构建脚本来过滤。
处理动作分类:
⚪输出到日志文件或某个特定设备。
⚪保存到数据库。
⚪发送给指定用户,该用户必须己登录,可以同时指定多个用户,用逗号分隔。
⚪传送到远程主机。
⚪通过管道传送给其它命令。
⚪丢弃日志,不处理。
#selector-分类和优先级
facility.priority[;facility.priority;...] action
#facility
# * 所有 facility
#priority
# * 所有 priority
# none 没有任何 priority,即不记录
# priority 具体的 priority,处理指定级别和指定级别以上的所有级别日志
# =priority 仅处理指定级别日志
# !priority 排除指定的 priority,这种写法不能单独使用
1、selector-基于日志内容指定字段过滤
#字段,比较表达式,要比较的值
:property, [!]compare-operation, "value" action
#所有可用 property
https://www.rsyslog.com/doc/master/configuration/properties.html
#比较表达式
#contains 字段是否包含 value 的内容
#contains_i 字段是否包含 value 的内容,不区分大小写
#isequal 字段的内容是否与 value 相等
#startswith 是否以 value 开头
#startswith_i 是否以 value 开头,不区分大小写
#regex 基本正则
#ereregex 扩展正则
#isempty 是否为空,不需要后面的 value
2、selector-基于RainerScript设置更复杂的日志过滤
https://www.rsyslog.com/doc/v8-stable/rainerscript/index.html
1、action-输出到日志文件或设备
# /path/file 将日志内容写到指定文件
# -/path/file 将日志内容写到指定文件,异步写入
# /dev/null 将日志内容输出到指定设备
2、action-保存到数据库,保存到数据库要开启相应模块
module (load="ommysql")
*.* action(type="ommysql" server="10.0.0.x" db="rsyslog" uid="rsysloger"
pwd="12345")
3、action-发送给指定用户
# root 将日志内容发送给用户 root
# root,tom 将日志内容发送给用户 root 和 tom
# * 将日志内容发送给所有己登录用户
4、action-发送到远程主机
# @192.168.2.123 使用 UDP 协议发送到远程主机,默认端口514
# @@log.hhaoo.com:256 使用 TCP 协议发送到远程主机 256 端口,默认端口514
# @(z6)[fe80::20c:29ff:fe7e:ce82] 使用 UPD 协议发送到远程主机(IPV6地址),启用zlib压
缩,压缩级别为9
5、action-通过管道传送给其它命令
管道必须有名管道,要事先创建,此功能在 rsyslog8 版本后才支持
6、action-不处理
# stop 不处理,丢弃
[root@ubuntu2204-150 ~]# cat /etc/rsyslog.d/50-default.conf
auth,authpriv.* /var/log/auth.log # 记录认证相关日志(所有级别)到 auth.log
*.*;auth,authpriv.none -/var/log/syslog # 记录所有日志(除 auth/authpriv)到 syslog,使用非同步模式
#cron.* /var/log/cron.log # (已注释)记录 cron 任务日志到 cron.log
#daemon.* -/var/log/daemon.log # (已注释)记录守护进程日志到 daemon.log(非同步)
kern.* -/var/log/kern.log # 记录内核日志到 kern.log,使用非同步模式
#lpr.* -/var/log/lpr.log # (已注释)记录打印服务日志到 lpr.log(非同步)
mail.* -/var/log/mail.log # 记录邮件日志(所有级别)到 mail.log(非同步)
#user.* -/var/log/user.log # (已注释)记录用户级日志到 user.log(非同步)
#mail.info -/var/log/mail.info # (已注释)记录邮件 info 级别日志到 mail.info(非同步)
#mail.warn -/var/log/mail.warn # (已注释)记录邮件 warning 级别日志到 mail.warn(非同步)
mail.err /var/log/mail.err # 记录邮件 error 级别日志到 mail.err(同步模式)
#*.=debug;\ # (已注释)复杂过滤规则:
# auth,authpriv.none;\ # 记录 debug 级别日志(排除 auth/authpriv)
# news.none;mail.none # 排除 news/mail 模块的日志
# -/var/log/debug # 输出到 debug 文件(非同步)
#*.=info;*.=notice;*.=warn;\ # (已注释)记录 info/notice/warn 级别日志(排除特定模块)
# auth,authpriv.none;\ # 排除 auth/authpriv
# cron,daemon.none;\ # 排除 cron/daemon
# mail,news.none # 排除 mail/news
# -/var/log/messages # 输出到 messages 文件(非同步)
*.emerg :omusrmsg:* # 记录 emergency 级别日志并调用
omusrmsg 模块显示给所有登录用户
#daemon,mail.*;\ # (已注释)复杂规则:
# news.=crit;news.=err;news.=notice;\ # 记录 news 模块的 crit/err/notice 级别
# *.=debug;*.=info;\ # 记录所有 debug/info 级别日志
# *.=notice;*.=warn /dev/tty8 # 记录所有 notice/warn 级别日志,输出到终端 8
4、rsyslog 日志内容和模板
#Rocky
[root@rocky8-153 ~]#tail -n3 /var/log/messages
Dec 12 13:12:01 localhost systemd[1]: session-51.scope: Succeeded.
Dec 12 13:13:01 localhost systemd[1]: Started Session 52 of user root.
Dec 12 13:13:01 localhost systemd[1]: session-52.scope: Succeeded.
[root@rocky8-153 ~]#tail -n3 /var/log/secure
Dec 12 12:42:01 localhost systemd[1891]: pam_unix(systemd-user:session): session opened for user root by (uid=0)
Dec 12 12:42:06 localhost sshd[1902]: Accepted password for root from 10.0.0.1 port 50487 ssh2
Dec 12 12:42:06 localhost sshd[1902]: pam_unix(sshd:session): session opened for user root by (uid=0)
#Ubuntu
[root@ubuntu2204-150 ~]# tail -n3 /var/log/syslog
Dec 12 13:12:55 ubuntu2204-150 systemd[1]: Started PackageKit Daemon.
Dec 12 13:13:11 ubuntu2204-150 kernel: [ 2342.398367] perf: interrupt took too long (3550 > 3438), lowering kernel.perf_event_max_sample_rate to 56250
Dec 12 13:13:41 ubuntu2204-150 kernel: [ 2372.377615] perf: interrupt took too long (4602 > 4437), lowering kernel.perf_event_max_sample_rate to 43250
[root@ubuntu2204-150 ~]# tail -n3 /var/log/auth.log
Dec 12 12:42:35 ubuntu2204-150 systemd: pam_unix(systemd-user:session): session opened for user root(uid=0) by (uid=0)
Dec 12 13:09:01 ubuntu2204-150 CRON[1459]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Dec 12 13:09:01 ubuntu2204-150 CRON[1459]: pam_unix(cron:session): session closed for user root
日志内容由 template 决定,如果没有显式指定,默认使用 RSYSLOG_TraditionalFileFormat。
rsyslog 中有13个内置的模板,可以在配置文件中直接使用,具体定义的内容需要查询相关文档。
除了内置模板,还可以自定义模板,可以直接写在配置文件中。生成的日志内容模板决定,而模板是由 rsyslog 中的相关属性组成,这些属性在生成日志内容时会被替换成具体内容。所谓属性是指rsyslog 中的一些特殊关键字,在模板语法中,使用 %属性名% 来表示一个字段。
#具体内容
template(name="RSYSLOG_TraditionalFileFormat" type="string"
string="%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1stsp%%msg:::drop-last-lf%\n")
#内置模板
RSYSLOG_TraditionalFileFormat
RSYSLOG_FileFormat
RSYSLOG_TraditionalForwardFormat
RSYSLOG_SysklogdFileFormat
RSYSLOG_ForwardFormat
RSYSLOG_SyslogProtocol23Format
RSYSLOG_DebugFormat
RSYSLOG_WallFmt
RSYSLOG_StdUsrMsgFmt
RSYSLOG_StdDBFmt
RSYSLOG_StdPgSQLFmt
RSYSLOG_spoofadr
RSYSLOG_StdJSONFmt
#文档
https://www.rsyslog.com/doc/v8-stable/configuration/templates.html
#rsyslog常用属性
https://www.rsyslog.com/doc/v8-stable/configuration/properties.html
https://www.rsyslog.com/doc/v8-stable/configuration/property_replacer.html
5、常见日志及相关工具
Rocky中常见日志说明
[root@rocky8-153 ~]# cat /etc/rsyslog.conf | grep -Ev "^#|^$"
*.info;mail.none;authpriv.none;cron.none /var/log/messages # 记录所有 info 及以上级别的日志(排除 mail、authpriv、cron 模块)到 messages
authpriv.* /var/log/secure # 记录所有认证相关日志(所有级别)到 secure
mail.* -/var/log/maillog # 记录邮件相关日志(所有级别)到 maillog,使用非同步模式
cron.* /var/log/cron # 记录定时任务(cron)相关日志到 cron
*.emerg :omusrmsg:* # 记录所有 emergency 级别日志并显示给当前登录用户
uucp,news.crit /var/log/spooler # 记录 uucp 和 n新闻相关 模块的 critical 及以上级别日志到 spooler
local7.* /var/log/boot.log # 记录 local7 设施的所有日志到 boot.log(通常用于操作系统启动流程日志)
Ubuntu中常见日志说明
[root@ubuntu2204-150 ~]# cat /etc/rsyslog.d/*conf | grep -Ev "^#|^$"
:msg,contains,"[UFW " /var/log/ufw.log # 记录包含 "[UFW " 的日志到 ufw.log(UFW 防火墙日志)
:syslogtag, isequal, "[CLOUDINIT]" /var/log/cloud-init.log # 记录 syslog 标签为 "[CLOUDINIT]" 的日志到 cloud-init.log
& stop # 其他不处理
auth,authpriv.* /var/log/auth.log # 记录认证相关日志(所有级别)到 auth.log
*.*;auth,authpriv.none -/var/log/syslog # 记录所有日志(排除 auth/authpriv 模块)到 syslog,使用非同步模式
kern.* -/var/log/kern.log # 记录内核日志(所有级别)到 kern.log,非同步模式
mail.* -/var/log/mail.log # 记录邮件日志(所有级别)到 mail.log,非同步模式
mail.err /var/log/mail.err # 记录邮件错误日志(err 及以上级别)到 mail.err
*.emerg :omusrmsg:* # 记录所有 emergency 级别日志并显示给当前登录用户
btmp、lastlog、wtmp
除了在 rsyslog 中定义的日志之外,系统中默认还有 btmp, lastlog, wtmp 三个日志文件,这三个文件都是非文本格式,无法直接打开。
| 日志文件路径 | 相关命令 | 说明 |
|---|---|---|
/var/log/btmp | lastb | 当前系统上,用户的失败尝试登录相关的日志(bad logins),二进制格式。 |
/var/log/lastlog | lastlog | 每一个用户最近一次的登录信息,二进制格式。 |
/var/log/wtmp | last | 当前系统上,用户正常登录系统的相关日志信息(who was logged in),二进制格式。 |
#rocky
[root@rocky8-153 ~]# ll /var/log/{btmp,lastlog,wtmp}
-rw-rw---- 1 root utmp 0 Dec 5 14:08 /var/log/btmp
-rw-rw-r--. 1 root utmp 292876 Dec 12 12:42 /var/log/lastlog
-rw-rw-r--. 1 root utmp 197760 Dec 12 12:42 /var/log/wtmp
[root@rocky8-153 ~]# file /var/log/{btmp,lastlog,wtmp}
/var/log/btmp: empty
/var/log/lastlog: dBase III DBT, version number 0, next free block index 1765514526
/var/log/wtmp: firmware 0 v0 (revision 0) V2, 0 bytes or less, UNKNOWN2 0x302e7838, at 0x0 0 bytes , at 0x0 0 bytes
#ubuntu
[root@ubuntu2204-150 ~]# ll /var/log/{btmp,lastlog,wtmp}
-rw-rw---- 1 root utmp 0 Dec 7 13:55 /var/log/btmp
-rw-rw-r-- 1 root utmp 292292 Dec 12 12:42 /var/log/lastlog
-rw-rw-r-- 1 root utmp 172416 Dec 12 12:42 /var/log/wtmp
[root@ubuntu2204-150 ~]# file /var/log/{btmp,lastlog,wtmp}
/var/log/btmp: empty
/var/log/lastlog: data
/var/log/wtmp: data
last -x|--system #显示系统关机项和运行级别更改
dmesg命令
dmesg 命令用来查看主机硬件相关日志。
logger命令
logger 命令可以手动生成相关日志。默认写到系统日志文件(/var/log/syslog 或者 /var/log/messages)。一般没有显式指定分类和优先级的情况下,日志默认是user.notice。
logger [options] [<message>]
#常用选项
-p|--priority #指定优先级
-f|--file #从文件中读取日志内容
-t|--tag #指定日志tag
-n|--server #指定远程主机IP或主机名
-P|--port #指定远程主机端口
-T|--tcp #指定使用TCP协议传输
-d|--udp #指定使用UDP协议传输
-i #在日志中记录进程ID
#终端1
[root@ubuntu2204-150 ~]# logger "this is test msg"
#终端2-监控日志
[root@ubuntu2204-150 ~]# tail -f /var/log/syslog
...
Dec 12 13:41:35 ubuntu2204-150 root: this is test msg
[root@ubuntu2204-150 ~]# logger -i "this is test msg"
Dec 12 13:43:27 ubuntu2204-150 root[16201]: this is test msg
#
[root@ubuntu2204-150 ~]# echo "this is test msg">test.txt
[root@ubuntu2204-150 ~]# logger -f test.txt
Dec 12 14:00:06 ubuntu2204-150 root: this is test msg
#从文件中读取,指定日志标签,指定优先级
[root@ubuntu2204-150 ~]# logger -t hhaosocool -f test.txt -p error
Dec 12 14:03:43 ubuntu2204-150 hhaosocool: this is test msg
6、在本机自定义服务日志
#sshd服务日志默认是归属于 AUTH 分类,默认级别是 INFO
[root@ubuntu2204-150 ~]# cat /etc/ssh/sshd_config | grep -i "log"
# Logging
#SyslogFacility AUTH
#LogLevel INFO
#根据配置,此日志记录在 /var/log/auth.log 中
[root@ubuntu2204-150 ~]# cat /etc/rsyslog.d/50-default.conf | grep "^auth"
auth,authpriv.* /var/log/auth.log
#现在从153远程连接该150主机,然后退出
#153
[root@rocky8-153 ~]#ssh root@10.0.0.150
The authenticity of host '10.0.0.150 (10.0.0.150)' can't be established.
ECDSA key fingerprint is SHA256:VrXXP/LqUaKuHK9pNYc7bLNWWtxU7iq3/v8EEerz8J0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.0.150' (ECDSA) to the list of known hosts.
root@10.0.0.150's password:
...
[root@ubuntu2204-150 ~]# exit
logout
Connection to 10.0.0.150 closed.
#150终端
[root@ubuntu2204-150 ~]# tail -f /var/log/auth.log
...
Dec 12 14:13:48 ubuntu2204-150 sshd[16661]: Accepted password for root from 10.0.0.153 port 53776 ssh2
Dec 12 14:13:48 ubuntu2204-150 sshd[16661]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
Dec 12 14:13:48 ubuntu2204-150 systemd-logind[889]: New session 14 of user root.
#
Dec 12 14:14:32 ubuntu2204-150 sshd[16661]: Received disconnect from 10.0.0.153 port 53776:11: disconnected by user
Dec 12 14:14:32 ubuntu2204-150 sshd[16661]: Disconnected from user root 10.0.0.153 port 53776
Dec 12 14:14:32 ubuntu2204-150 sshd[16661]: pam_unix(sshd:session): session closed for user root
Dec 12 14:14:32 ubuntu2204-150 systemd-logind[889]: Session 14 logged out. Waiting for processes to exit.
Dec 12 14:14:32 ubuntu2204-150 systemd-logind[889]: Removed session 14.
#重启服务,查看日志
[root@ubuntu2204-150 ~]# systemctl restart sshd
Dec 12 14:15:12 ubuntu2204-150 sshd[950]: Received signal 15; terminating.
Dec 12 14:15:12 ubuntu2204-150 sshd[16736]: Server listening on 0.0.0.0 port 22.
Dec 12 14:15:12 ubuntu2204-150 sshd[16736]: Server listening on :: port 22.
#修改 sshd 服务日志的配置项,分类改到 LOCAL6,级别不改
[root@ubuntu2204-150 ~]# vim /etc/ssh/sshd_config
# Logging
#SyslogFacility AUTH
SyslogFacility LOCAL6
#LogLevel INFO
...
#同样新增配置文件,将local6 分类的日志都写到 sshd.log 文件中
#可以直接在主配置文件中添加一行/etc/rsyslog.conf,也可以单独写到/etc/rsyslog.d/下
[root@ubuntu2204-150 ~]# ll /etc/rsyslog.d/
20-ufw.conf 21-cloudinit.conf 50-default.conf
[root@ubuntu2204-150 ~]# vim /etc/rsyslog.d/sshd.conf
local6.* /var/log/sshd.log
#当前还不存在该日志
[root@ubuntu2204-150 ~]# ll /var/log/sshd.log
ls: /var/log/sshd.log: No such file or directory
#重启服务
[root@ubuntu2204-150 ~]# systemctl restart rsyslog
[root@ubuntu2204-150 ~]# systemctl restart sshd
[root@ubuntu2204-150 ~]# ll /var/log/sshd.log
-rw-r----- 1 syslog adm 234 Dec 12 14:43 /var/log/sshd.log
#测试
#153远程连接150
[root@rocky8-153 ~]#ssh root@10.0.0.150
root@10.0.0.150's password:
[root@ubuntu2204-150 ~]# exit
logout
Connection to 10.0.0.150 closed.
#
[root@ubuntu2204-150 ~]# tail -f /var/log/sshd.log
Dec 12 14:49:03 ubuntu2204-150 sshd[17537]: Received signal 15; terminating.
Dec 12 14:49:03 ubuntu2204-150 sshd[17623]: Server listening on 0.0.0.0 port 22.
Dec 12 14:49:03 ubuntu2204-150 sshd[17623]: Server listening on :: port 22.
Dec 12 14:49:37 ubuntu2204-150 sshd[17634]: Accepted password for root from 10.0.0.153 port 45146 ssh2
Dec 12 14:49:41 ubuntu2204-150 sshd[17634]: Received disconnect from 10.0.0.153 port 45146:11: disconnected by user
Dec 12 14:49:41 ubuntu2204-150 sshd[17634]: Disconnected from user root 10.0.0.153 port 45146
#本机测试
[root@ubuntu2204-150 ~]# logger -t hhaosocool -p local6.* "this is test msg"
logger: unknown priority name: *
[root@ubuntu2204-150 ~]# logger -t hhaosocool -p local6.info "this is test msg"
Dec 12 14:51:12 ubuntu2204-150 hhaosocool: this is test msg
7、使用日志网络转发
可以使用 rsyslog 服务中的远程转发功能,通过 TCP 或 UDP 协议将当前主机的日志转发到远程日志服务器上,进行集中存储,方便统一管理。

#配置 server log 主机,开启 TCP, UDP 相关功能
[root@ubuntu2204-152 ~]# vim /etc/rsyslog.conf
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")
#重启服务
[root@ubuntu2204-152 ~]# systemctl restart rsyslog
[root@ubuntu2204-152 ~]# ss -tunlp | grep 514
udp UNCONN 0 0 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",pid=1855,fd=5))
udp UNCONN 0 0 [::]:514 [::]:* users:(("rsyslogd",pid=1855,fd=6))
tcp LISTEN 0 25 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",pid=1855,fd=7))
tcp LISTEN 0 25 [::]:514 [::]:* users:(("rsyslogd",pid=1855,fd=8))
#配置 client-1 主机 153 日志远程转发
[root@rocky8-153 ~]#vim /etc/rsyslog.d/net.conf
*.info @10.0.0.152:514
[root@rocky8-153 ~]#systemctl restart rsyslog
#查看 server 主机 152配置
[root@ubuntu2204-152 ~]# cat /etc/rsyslog.d/50-default.conf
*.*;auth,authpriv.none -/var/log/syslog #显然命中此条rules
#测试
[root@rocky8-153 ~]#logger "this msg from 10.0.0.153"
[root@ubuntu2204-152 ~]# tail -f /var/log/syslog
...
Dec 12 15:33:23 localhost root[3077]: this msg from 10.0.0.153
#本机也有日志
[root@rocky8-153 ~]#ll /etc/rsyslog.conf
-rw-r--r-- 1 root root 3295 Nov 5 2024 /etc/rsyslog.conf
[root@rocky8-153 ~]#ll /etc/rsyslog.d/net.conf
[root@rocky8-153 ~]#vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages #命中此条rules
#查看
[root@rocky8-153 ~]#logger "this msg from 10.0.0.153"
[root@rocky8-153 ~]#tail -f /var/log/messages
...
Dec 12 15:42:10 localhost root[3178]: this msg from 10.0.0.153
#配置 client-2 主机 150 日志远程转发
[root@ubuntu2204-150 ~]# vim /etc/rsyslog.d/net.conf
*.info @@10.0.0.15
[root@ubuntu2204-150 ~]# systemctl restart rsyslog
#测试
[root@ubuntu2204-150 ~]# logger "this msg from 10.0.0.150"
[root@ubuntu2204-152 ~]# tail -f /var/log/syslog
...
Dec 12 16:09:21 ubuntu2204-150 root: this msg from 10.0.0.150
#本机日志查看
[root@ubuntu2204-150 ~]# logger "this msg from 10.0.0.150"
[root@ubuntu2204-150 ~]# tail -f /var/log/syslog
...
Dec 12 16:09:21 ubuntu2204-150 root: this msg from 10.0.0.150
8、使用Mysql数据库转储日志
#
152 - server
153,150 - client
159 - mysql-server
#server安装 rsyslog 的 mysql 包
[root@ubuntu2204-152 ~]# apt search rsyslog-mysql
Sorting... Done
Full Text Search... Done
rsyslog-mysql/jammy-updates,jammy-security,now 8.2112.0-2ubuntu2.2 amd64 [installed]
MySQL output plugin for rsyslog
[root@ubuntu2204-152 ~]# apt install rsyslog-mysql
#查看包信息
[root@ubuntu2204-152 ~]# dpkg -s rsyslog-mysql
#查看包文件
[root@ubuntu2204-152 ~]# dpkg -L rsyslog-mysql
/usr/lib/x86_64-linux-gnu/rsyslog/ommysql.so #库文件
/usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql #mysql 数据表文件
/usr/share/rsyslog-mysql/rsyslog-mysql.conf.template #rsyslog 配置文件模板
...
#mysql-server 159 创建数据库
#server将日志存储至数据库,如何建表,表有哪些字段,这些直接是写好的
[root@ubuntu2204-152 ~]# cat /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql
CREATE TABLE IF NOT EXISTS SystemEvents
(
ID int unsigned not null auto_increment primary key,
CustomerID bigint,
ReceivedAt datetime NULL,
DeviceReportedTime datetime NULL,
Facility smallint NULL,
Priority smallint NULL,
FromHost varchar(60) NULL,
Message text,
NTSeverity int NULL,
Importance int NULL,
EventSource varchar(60),
EventUser varchar(60) NULL,
EventCategory int NULL,
EventID int NULL,
EventBinaryData text NULL,
MaxAvailable int NULL,
CurrUsage int NULL,
MinUsage int NULL,
MaxUsage int NULL,
InfoUnitID int NULL ,
SysLogTag varchar(60),
EventLogType varchar(60),
GenericFileName VarChar(60),
SystemID int NULL
);
CREATE TABLE IF NOT EXISTS SystemEventsProperties
(
ID int unsigned not null auto_increment primary key,
SystemEventID int NULL ,
ParamName varchar(255) NULL ,
ParamValue text NULL
);
[root@ubuntu2204-152 ~]# scp /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql 10.0.0.159:/root/rsyslog.sql
root@10.0.0.159's password:
mysql 100% 1038 899.1KB/s 00:00
mysql> create database rsyslog;
Query OK, 1 row affected (0.01 sec)
mysql> use rsyslog;
Database changed
mysql> source /root/rsyslog.sql
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+------------------------+
| Tables_in_rsyslog |
+------------------------+
| SystemEvents |
| SystemEventsProperties |
+------------------------+
2 rows in set (0.00 sec)
#两张表内容为空
mysql> select count(*) from SystemEvents;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.05 sec)
mysql> select count(*) from SystemEventsProperties;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
#创建用户并授权
mysql> create user 'rsysloger'@'10.0.0.%' identified by '12345';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on rsyslog.* to 'rsysloger'@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#server主机 152
#配置 mysql 转发,安装 rsyslog-mysql 时已经写好直接可以用
[root@ubuntu2204-152 ~]# cat /usr/share/rsyslog-mysql/rsyslog-mysql.conf.template
### Configuration file for rsyslog-mysql
### Changes are preserved
module (load="ommysql")
*.* action(type="ommysql" server="_DBC_DBSERVER_" db="_DBC_DBNAME_" uid="_DBC_DBUSER_" pwd="_DBC_DBPASS_")
[root@ubuntu2204-152 ~]# cp /usr/share/rsyslog-mysql/rsyslog-mysql.conf.template /etc/rsyslog.d/mysql.conf
[root@ubuntu2204-152 ~]# ll /etc/rsyslog.d/
20-ufw.conf 21-cloudinit.conf 50-default.conf mysql.conf
#修改配置
[root@ubuntu2204-152 ~]# vim /etc/rsyslog.d/mysql.conf
### Configuration file for rsyslog-mysql
### Changes are preserved
module (load="ommysql")
*.* action(type="ommysql" server="10.0.0.159" db="rsyslog" uid="rsysloger" pwd="12345")
#重启服务
[root@ubuntu2204-152 ~]# systemctl restart rsyslog
#再次去mysql-server上查看表内容
mysql> select count(*) from SystemEvents;
+----------+
| count(*) |
+----------+
| 25 |
+----------+
1 row in set (0.01 sec)
#测试
[root@ubuntu2204-150 ~]# logger "this mesg from 10.0.0.150"
[root@rocky8-153 ~]#logger "this mesg from 10.0.0.153"
[root@ubuntu2204-152 ~]# logger "this mesg from 10.0.0.152"
#
mysql> select FromHost,Message from SystemEvents\G
...
*************************** 32. row ***************************
FromHost: ubuntu2204-150
Message: this mesg from 10.0.0.150
*************************** 33. row ***************************
FromHost: localhost
Message: this mesg from 10.0.0.153
*************************** 34. row ***************************
FromHost: ubuntu2204-152
Message: this mesg from 10.0.0.152
三、服务日志管理工具journalctl
systemd 提供了一个集中的方式来处理所有来自进程,应用程序等的操作系统日志,所有这些日志事件都由 systemd 的 journald 守护进程来处理。journald 守护进程收集所有来自 Linux 操作系统的各种日志,并将其作为二进制数据存储在文件中。
以二进制数据集中记录事件、系统问题的好处有很多。例如,由于系统日志是以二进制而不是文本形式存储的,可以以文本、JSON 对象等多种方式进行转译,以满足各种需求。另外,由于日志是按顺序存储的,通过对日志的日期/时间操作,非常容易追踪到单个事件。
#配置文件
[root@ubuntu2204-150 ~]# cat /etc/systemd/journald.conf
#日志数据存储目录,非文本文件,无法用文本工具打开
[root@ubuntu2204-150 ~]# tree /var/log/journal
journalctl [OPTIONS...] [MATCHES...]
# 常用选项
--system # 显示系统服务和内核相关日志
--user # 显示来自当前用户的服务日志
-M|--machine=CONTAINER # 显示本地容器中的日志
-S|--since=DATE # 显示从指定时间之后的日志(格式:YYYY-MM-DD HH:MM:SS|yesterday|today|tomorrow|now)
-U|--until=DATE # 显示从指定时间之前的日志
-c|--cursor=CURSOR # 从指定 cursor 开始显示(cursor:日志标识符)
--after-cursor=CURSOR # 从指定 cursor 之后开始显示
--show-cursor # 在最后一条日志之后显示 cursor 值
-b|--boot[=ID] # 查看详细启动日志
--list-boots # 列出系统启动日志
-k|--dmesg # 仅显示内核日志(包含 -b 及 "_TRANSPORT=kernel" 选项)
-u|--unit=UNIT # 根据单元查看日志
--user-unit=UNIT # 仅显示属于特定用户会话单元的日志(相当于添加 _SYSTEMD_USER_UNIT= 和 _UID= 条件)
-p|--priority=RANGE # 根据日志等级查看(0:emerg, 1:alert, 2:crit, 3:err, 4:warning, 5:notice, 6:info, 7:debug)
--facility=FACILITY... # 根据分类查看
-g|--grep=PATTERN # 根据正则表达式过滤
--case-sensitive[=BOOL] # 模式匹配时是否区分大小写
-e|--pager-end # 直接定位到最后
-f|--follow # 实时查看最新日志
-n|--lines[=INTEGER] # 指定行数(从最近的日志开始算,默认10行)
--no-tail # 显示所有的行(配合 -f 使用)
-r|--reverse # 反转输出(最新的在最上面显示)
-o|--output=STRING # 指定输出格式(默认 short)
--output-fields=LIST # 仅显示指定字段(在 -o 为 verbose/export/json/json-pretty/json-sse/json-seq 时有效)
# 默认显示字段:__CURSOR, __REALTIME_TIMESTAMP, __MONOTONIC_TIMESTAMP, _BOOT_ID
--utc # 使用 UTC 时区显示时间
-x|--catalog # 在日志输出中增加解释性短文本(帮助说明日志含义,非所有日志均支持)
--no-full # 如果内容超长,则以省略号代替
-a|--all # 完整显示所有字段内容(即使包含不可打印字符或内容超长)
-q|--quiet # 安静模式(不显示任何告警信息)
--no-pager # 不分页(一次显示全部)
--no-hostname # 不显示来源于本机的主机名字段(仅对 short 格式有效)
-m|--merge # 混合模式(包括远程日志在内的所有可见日志)
-D|--directory=PATH # 显示来自于特定目录中的日志
--root=ROOT # 指定日志服务的根目录(服务将以此目录为根目录)
-h|--help # 显示帮助
--version # 显示版本信息
-N|--fields # 列出所有可用字段
-F|--field=FIELD # 去重显示指定字段
--disk-usage # 显示日志占用的磁盘空间
--vacuum-size=BYTES # 指定日志最大空间(支持 K/M/G/T)
--vacuum-files=INT # 指定最大日志文件数量
--vacuum-time=TIME # 清除指定时间之前的日志(支持 s/m/h/days/weeks/months/years)
--verify # 检查日志文件的内在一致性(要求日志有 FSS 属性)
--sync # 将守护进程中未落盘的数据落盘
--flush # 将 /run/log/journal/ 中的日志转储到 /var/log/journal/(会阻塞)
--rotate # 滚动日志文件(会阻塞)
--header # 显示日志元数据
--list-catalog # 简略显示日志分类信息
--dump-catalog # 详细显示日志分类信息
--update-catalog # 更新日志分类索引二进制文件
# 输出格式说明
short # 默认值(每行一条日志)
short-precise # 时间精确到微秒
short-iso # 以 ISO 8601 格式显示时间
short-iso-precise # 时间戳零值从内核启动时开始计算(ISO 格式)
short-full # 与 short 内容相同,但时间显示更详细
short-monotonic # 时间戳零值从内核启动时开始计算
short-unix # 时间戳显示为 UNIX 时间原点(1970-1-1 00:00:00 UTC)以来的秒数(精确到微秒)
verbose # 结构化格式显示所有字段
export # 序列化为二进制字节流(适用于备份与网络传输)
json # JSON 格式(每条日志一行)
json-pretty # JSON 格式(每个字段一行,便于阅读)
json-sse # JSON 格式(每条日志一行,用大括号包围)
json-seq # JSON 格式(每条日志前加 ASCII 记录分隔符,后加换行符)
cat # 仅显示日志内容(不显示元数据)
with-unit # 类似 short-full,但前缀以 unit 名显示(而非 syslog 标识符)
#默认显示所有日志
[root@ubuntu2204-150 ~]# journalctl
Oct 15 14:54:15 ubuntu kernel: Linux version 5.15.0-157-generic (buildd@lcy02-amd64-004) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04.2) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #167-Ubuntu SMP Wed Sep 17 21:35:53 UTC 2025 (Ubuntu 5.15.0-157.167-generic 5.15.189)
...
#查看日志文件元数据
[root@ubuntu2204-150 ~]# journalctl --header
File path: /var/log/journal/8d318cf1a1a24dcb9429b3f32390e241/system@000643b1ad28b580-ebbfb1faa563d790.journal~
File ID: af3ea97213e34e3ab244f7e8c6726ada
Machine ID: 8d318cf1a1a24dcb9429b3f32390e241
Boot ID: 0cc6aee3f863435091de4dfb4e388701
Sequential number ID: af3ea97213e34e3ab244f7e8c6726ada
State: OFFLINE
Compatible flags:
Incompatible flags: COMPRESSED-ZSTD KEYED-HASH
Header size: 256
Arena size: 8388352
Data hash table size: 233016
Field hash table size: 333
Rotate suggested: no
Head sequential number: 1 (1)
Tail sequential number: 2294 (8f6)
Head realtime timestamp: Sat 2025-11-15 11:04:01 CST (643995db096f8)
Tail realtime timestamp: Sat 2025-11-15 13:57:00 CST (6439bc85d612b)
Tail monotonic timestamp: 2h 53min 8.287s (26b30b156)
Objects: 9587
Entry objects: 2294
Data objects: 5583
Data hash table fill: 2.4%
Field objects: 97
Field hash table fill: 29.1%
Tag objects: 0
Entry array objects: 1611
Deepest field hash chain: 1
Deepest data hash chain: 2
Disk usage: 8.0M
#查看日志分类
[root@ubuntu2204-150 ~]# journalctl --list-catalog
0027229ca0644181a76c4e92458afa2e systemd: One or more messages could not be forwarded to syslog
0e4284a0caca4bfc81c0bb6786972673 systemd: Unit skipped
1675d7f172174098b1108bf8c7dc8f5d systemd: DNSSEC validation failed
1b3bb94037f04bbf81028e135a12d293 systemd: Failed to generate valid unit name from path '@MOUNT_POINT@'.
...
#显示指定分类信息
[root@ubuntu2204-150 ~]# journalctl --list-catalog 1675d7f172174098b1108bf8c7dc8f5d
1675d7f172174098b1108bf8c7dc8f5d systemd: DNSSEC validation failed
#详细显示分类信息
[root@ubuntu2204-150 ~]# journalctl --dump-catalog
#日志跟随,显示最新日志
[root@ubuntu2204-150 ~]# journalctl -f
#倒序显示
[root@ubuntu2204-150 ~]# journalctl -r
#查看特定时间日志
#查看 2025-12-11 12:0:0 到 2025-12-12 18:30:0 之间产生的日志
[root@ubuntu2204-150 ~]# journalctl -S "2025-12-11 12:0:0" -U "2025-12-12 18:30:0"
#查看昨天到当前的日志
[root@ubuntu2204-150 ~]# journalctl -S yesterday
#查看今天9点到1小时之前的日志
journalctl --since 09:00 --until "1 hour ago"
#查看启动信息
#左-右
#日志优先级 0-7:依次递减
#日志唯一标识符
#日志生命周期
[root@ubuntu2204-150 ~]# journalctl --list-boots
-33 79c58bd907f84077a58b50c07abecbae Wed 2025-10-15 14:54:15 CST—Wed 2025-10-15 21:17:01 CST
-32 c06ad8a4a73544b1ae2a9eef73d23bc9 Thu 2025-10-16 16:16:34 CST—Thu 2025-10-16 21:19:12 CST
-31 b929f9a3fdda4f129c8417d9151b19fc Sat 2025-10-18 14:23:00 CST—Sat 2025-10-18 21:32:20 CST
-30 9a11823377894af192fa8ae35cc64381 Sun 2025-10-19 13:07:50 CST—Sun 2025-10-19 22:26:25 CST
...
#查看本次启动日志
journalctl -b 0
#查看上次启动日志
journalctl -b -1
#查看指定启动日志
[root@ubuntu2204-150 ~]# journalctl -b 0cfb94b2022f4e03b63ed0a957a6f090
#查看内核日志
[root@ubuntu2204-150 ~]# journalctl -k
#根据服务或程序查看
[root@ubuntu2204-150 ~]# journalctl -u nginx.service
[root@ubuntu2204-150 ~]# journalctl -u ssh.service
journalctl /usr/sbin/sshd
journalctl /usr/bin/bash
#根据PID查看
journalctl _PID=1
#根据UID查看
journalctl _UID=0
#根据等级查看
[root@ubuntu2204-150 ~]# journalctl -p err
[root@ubuntu2204-150 ~]# journalctl -p 3
#根据分类查看
journalctl --facility=auth(facility)
#指定显示格式
#short:默认格式,每行显示一条日志,类似传统 syslog 格式
#verbose:显示所有字段的详细信息,包括不可打印字符
#export:二进制格式输出,适合备份或传输
#json:JSON 格式输出,便于程序解析
#json-pretty:易读的 JSON 格式输出,适合人工查看
#json-seq: JSON 序列格式输出,每条日志独立成行
#cat:仅显示日志消息内容,不包含其他元数据
journalctl -o
#显示特定字段
journalctl -o json-pretty -n 1 --output-fields=_UID
#查询日志占用了多少磁盘空间
[root@ubuntu2204-150 ~]# journalctl --disk-usage
四、Logrotate日志转储
在 Linux 系统中,能够帮助使用者定位问题的有效手段之一就是查日志。
如果一个服务或一个程序的日志,一直只写一个文件,则会导致该日志文件越来越大,无论是查看还是搜索内容,备份等,都会特别不方便,而且如果服务器数量较多,日志文件大小增长较快,也会很容易触发告警。
为了解决这种情况,我们可以使用日志转储服务,对服务日志进行分割,按照一定的规则将日志保存在不同的文件中,这样更便于管理和归档。
[root@ubuntu2204-150 ~]# ll /var/log/dmesg*
-rw-r----- 1 root adm 128143 Dec 12 12:34 /var/log/dmesg
-rw-r----- 1 root adm 129335 Dec 11 13:51 /var/log/dmesg.0
-rw-r----- 1 root adm 26201 Dec 7 13:55 /var/log/dmesg.1.gz
-rw-r----- 1 root adm 26200 Nov 23 11:00 /var/log/dmesg.2.gz
-rw-r----- 1 root adm 26493 Nov 22 10:51 /var/log/dmesg.3.gz
-rw-r----- 1 root adm 26494 Nov 21 13:02 /var/log/dmesg.4.gz
[root@ubuntu2204-150 ~]# ll /var/log/alternatives.log*
-rw-r--r-- 1 root root 624 Dec 12 12:34 /var/log/alternatives.log
-rw-r--r-- 1 root root 2018 Nov 23 11:00 /var/log/alternatives.log.1
-rw-r--r-- 1 root root 2556 Oct 15 14:02 /var/log/alternatives.log.2.gz
logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。
#各Linux 发行版会默认安装 logrotate 包
[root@ubuntu2204-150 ~]# dpkg -l logrotate
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-=================-============-=================================
ii logrotate 3.19.0-1ubuntu1.1 amd64 Log rotation utility
[root@rocky8-153 ~]#rpm -q logrotate
logrotate-3.14.0-6.el8.x86_64
[root@ubuntu2204-150 ~]# dpkg -s logrotate
Package: logrotate
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 167
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Multi-Arch: foreign
Version: 3.19.0-1ubuntu1.1
Depends: cron | anacron | cron-daemon | systemd-sysv, libacl1 (>= 2.2.23), libc6 (>= 2.34), libpopt0 (>= 1.14), libselinux1 (>= 3.1~)
Suggests: bsd-mailx | mailx
Conffiles:
/etc/cron.daily/logrotate 31da718265eaaa2fdabcfb2743bda171
/etc/logrotate.conf b0a820970ecd7412a334ade9c98de3f6
/etc/logrotate.d/btmp 55631862595faf6432786dc335eb3f44
/etc/logrotate.d/wtmp 46cd7ecb1810441bd450987a976f5540
Description: Log rotation utility
The logrotate utility is designed to simplify the administration of
log files on a system which generates a lot of log files. Logrotate
allows for the automatic rotation compression, removal and mailing of
log files. Logrotate can be set to handle a log file daily, weekly,
monthly or when the log file gets to a certain size. Normally, logrotate
runs as a daily cron job.
Homepage: https://github.com/logrotate/logrotate
Original-Maintainer: Christian Göttsche <cgzones@googlemail.com>
相关文件
/etc/cron.daily/logrotate #定时任务脚本,放在 cron.daily 目录中,默认系统会每天执行一次
/etc/logrotate.conf #主配置文件,定义日志转储策略
/etc/logrotate.d/ #配置文件目录,定义日志转储策略
/usr/sbin/logrotate #主程序
/var/lib/logrotate/status #logrotate服务的日志文件
工作原理
系统计划任务每天执行一次脚本文件,在脚本中再执行 /usr/sbin/logrotate /etc/logrotate.conf ,即调用 logrotate 程序再配合定义好的转储规则对日志文件进行转储。
[root@ubuntu2204-150 ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
# skip in favour of systemd timer
#检查系统是否使用systemd(systemd会管理logrotate)
if [ -d /run/systemd/system ]; then
exit 0
fi
# this cronjob persists removals (but not purges)
#检查 logrotate 是否可执行
if [ ! -x /usr/sbin/logrotate ]; then
exit 0
fi
/usr/sbin/logrotate /etc/logrotate.conf #执行logrotate(/etc/logrotate.conf 全局日志轮转规则)
EXITVALUE=$? #$?获取上一条命令退出状态码 保存至变量
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit $EXITVALUE
1、logrotate配置
在配置文件中定义转储规则,配置文件中的主要配置项。
#查看帮助
man logrotate.conf
#主配置文件
[root@ubuntu2204-150 ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# global options do not affect preceding include directives
# rotate log files weekly
weekly # 默认每周轮转一次日志文件
# use the adm group by default, since this is the owning group
# of /var/log/syslog.
su root adm # 默认使用 root 用户和 adm 组(适用于 /var/log/syslog 的权限)
# keep 4 weeks worth of backlogs
rotate 4 # 保留最近 4 周的轮转日志(即最多保留 4 个旧日志文件)
# create new (empty) log files after rotating old ones
create # 轮转后自动创建新的空日志文件(保持原日志文件路径不变)
# use date as a suffix of the rotated file
#dateext # 使用日期作为轮转后日志文件的后缀(默认注释,启用需取消注释)
# uncomment this if you want your log files compressed
#compress # 如果需要压缩旧日志文件,取消此行注释(默认使用 gzip 压缩)
# packages drop log rotation information into this directory
include /etc/logrotate.d # 系统软件包可能将日志轮转配置放在此目录(优先级高于全局配置
# system-specific logs may also be configured here.
#每个服务单独的配置文件,如果在单独配置文件中没有定义的配置项,则使用主配置文件中的配置项或默认配置
[root@ubuntu2204-150 ~]# ls /etc/logrotate.d
alternatives apt btmp dpkg php8.1-fpm ubuntu-pro-client unattended-upgrades
apport bootlog cloud-init nginx rsyslog ufw wtmp
[root@ubuntu2204-150 ~]# cat /etc/logrotate.d/rsyslog
# 定义需要轮转的日志文件路径(支持通配符)
/var/log/syslog
/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
{
# 保留最近 4 个轮转后的日志文件(超过则删除最旧的)
rotate 4
# 每周轮转一次(与全局配置一致,但此处显式定义优先级更高)
weekly
# 如果日志文件不存在,不报错继续处理下一个文件
missingok
# 如果日志文件为空,则不轮转(避免生成无用空文件)
notifempty
# 压缩旧日志文件(默认使用 gzip)
compress
# 延迟压缩:本次轮转的日志下次轮转时再压缩(减少当前 I/O 压力),与compress一起使用
delaycompress
# 共享脚本:在所有日志轮转完成后仅执行一次 prerotate 和 postrotate 脚本
sharedscripts
# 转储后执行的脚本(通常用于通知日志服务重新打开日志文件)
postrotate
/usr/lib/rsyslog/rsyslog-rotate # 调用 rsyslog 的专用轮转脚本
endscript
}
[root@ubuntu2204-150 ~]# ll /var/log/syslog*
-rw-r----- 1 syslog adm 806213 Dec 12 19:39 /var/log/syslog
-rw-r----- 1 syslog adm 268614 Nov 23 19:39 /var/log/syslog.1 #delaycompress 规定前一个不压
-rw-r----- 1 syslog adm 207117 Nov 22 22:35 /var/log/syslog.2.gz
-rw-r----- 1 syslog adm 347202 Nov 15 13:57 /var/log/syslog.3.gz
常用配置项
compress # 通过gzip压缩转储以后的日志
nocompress # 不压缩
copytruncate # 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate # 用于还在打开中的日志文件,不备份不截断(与copytruncate逻辑对应)
create mode owner group # 转储文件时,使用指定权限/所有者/所属组创建新日志文件
nocreate # 不建立新的日志文件
su user group # 指定转储的用户和组(需日志文件父目录允许other写权限时使用)
delaycompress # 配合compress使用,本次转储的日志下次转储时才压缩
nodelaycompress # 覆盖delaycompress选项,转储同时立即压缩
errors address # 转储时的错误信息发送到指定Email地址
ifempty # 即使是空文件也转储(默认选项)
notifempty # 如果是空文件则不转储
mail address # 把转储的日志文件发送到指定E-mail地址
nomail # 转储时不发送日志文件
olddir directory # 转储后的日志文件放入指定目录(需与当前日志文件同文件系统)
noolddir # 转储后的日志文件与当前日志文件放在同一目录下
prerotate/endscript # 转储前需要执行的命令(需单独成行,日志路径为第一个参数)
postrotate/endscript # 转储后需要执行的命令(需单独成行,日志路径为第一个参数)
daily # 指定转储周期为每天
weekly # 指定转储周期为每周
monthly # 指定转储周期为每月
rotate count # 指定日志文件删除前保留的转储次数(0=无备份,5=保留5个备份)
tabooext [+] list # 禁止转储指定扩展名的文件(默认扩展名:.rpm-orig,.rpmsave,v,~)
size size # 当日志文件达到指定大小时才转储(默认bytes,可指定KB/MB)
sharedscripts # 对所有转储日志仅运行一次prerotate/postrotate脚本
nosharedscripts # 对每个转储日志分别运行prerotate/postrotate脚本(默认)
missingok # 日志不存在时不报错,继续处理下一个
nomissingok # 日志不存在时报错(默认)
2、logrotate自定义规则实现
logrotate [OPTION...] <configfile>
#常用选项
-?|--help #显示帮助信息
-d|--debug #不执行任何操作,仅显示错误信息,类似于测试
-f|--force #强制执行
-m|--mail=command #指定执行邮件发送的命令,默认 /usr/bin/mail
-s|--state=statefile #指定服务日志文件,默认 /var/lib/logrotate/status
-v|--verbose #显示详细信息
-l|--log=logfile #指定详细信息日志,加上此选项,会将详细信息写到指定文件
--version #显示版本信息
--skip-state-lock #不给 statefile 文件加锁
#创建测试日志文件
[root@ubuntu2204-150 ~]# dd if=/dev/zero of=/var/log/test1.log bs=2M count=1
1+0 records in
1+0 records out
2097152 bytes (2.1 MB, 2.0 MiB) copied, 0.00333139 s, 630 MB/s
[root@ubuntu2204-150 ~]# dd if=/dev/zero of=/var/log/test2.log bs=2M count=1
1+0 records in
1+0 records out
2097152 bytes (2.1 MB, 2.0 MiB) copied, 0.00555519 s, 378 MB/s
#定义转储规则
[root@ubuntu2204-150 ~]# ll -h /var/log/test*
-rw-r--r-- 1 root root 2.0M Dec 12 20:19 /var/log/test1.log
-rw-r--r-- 1 root root 2.0M Dec 12 20:19 /var/log/test2.log
#定义转储规则
[root@ubuntu2204-150 ~]# cat /etc/logrotate.d/test1
/var/log/test1.log {
daily
rotate 5
su root root
compress
delaycompress
missingok
size 1M
notifempty
create 0640 syslog adm
postrotate
echo `date +%F_%T` >> /tmp/test1.log
endscript
}
[root@ubuntu2204-150 ~]# cat /etc/logrotate.d/test2
/var/log/test2.log {
daily
rotate 5
su root root
dateext
compress
delaycompress
missingok
size 1M
notifempty
create 0644 root root
postrotate
echo `date +%F_%T` >> /tmp/test2.log
endscript
}
#手动执行转储
[root@ubuntu2204-150 ~]# logrotate /etc/logrotate.d/test1
#查看日志,生成新的空文件,权限,属主属组都符合预设
[root@ubuntu2204-150 ~]# ll -h /var/log/test1*
-rw-r----- 1 syslog adm 0 Dec 12 20:32 /var/log/test1.log
-rw-r--r-- 1 root root 2.0M Dec 12 20:19 /var/log/test1.log.1
#再次转储,先保证日志达到转储条件
[root@ubuntu2204-150 ~]# dd if=/dev/zero of=/var/log/test1.log bs=3M count=1
1+0 records in
1+0 records out
3145728 bytes (3.1 MB, 3.0 MiB) copied, 0.0332266 s, 94.7 MB/s
[root@ubuntu2204-150 ~]# logrotate /etc/logrotate.d/test1
[root@ubuntu2204-150 ~]# ll -h /var/log/test1*
-rw-r----- 1 syslog adm 0 Dec 12 20:38 /var/log/test1.log
-rw-r----- 1 syslog adm 3.0M Dec 12 20:38 /var/log/test1.log.1 #最新的转储
-rw-r--r-- 1 root root 2.1K Dec 12 20:19 /var/log/test1.log.2.gz #前一个被转储的日志被压缩
#查看日志文件,转储成功后命令被执行
[root@ubuntu2204-150 ~]# cat /tmp/test1.log
2025-12-12_20:32:42
2025-12-12_20:38:20
[root@ubuntu2204-150 ~]# logrotate /etc/logrotate.d/test{1,2}
#test1 没有达到转储条件
[root@ubuntu2204-150 ~]# ll -h /var/log/test1*
-rw-r----- 1 syslog adm 0 Dec 12 20:38 /var/log/test1.log
-rw-r----- 1 syslog adm 3.0M Dec 12 20:38 /var/log/test1.log.1
-rw-r--r-- 1 root root 2.1K Dec 12 20:19 /var/log/test1.log.2.gz
#test2 达到条件,且有日期后缀
[root@ubuntu2204-150 ~]# ll -h /var/log/test2*
-rw-r--r-- 1 root root 0 Dec 12 20:53 /var/log/test2.log
-rw-r--r-- 1 root root 2.0M Dec 12 20:19 /var/log/test2.log-20251212
646

被折叠的 条评论
为什么被折叠?



