广州总部电话:020-85564311
广州总部电话:020-85564311

广州网站建设-小程序商城开发-广州小程序开发-企业微信开发公司-网站建设高端品牌-优网科技

20年
互联网应用服务商
请输入搜索关键词
知识库 知识库

优网知识库

探索行业前沿,共享知识宝库

Linux 日志服务:rsyslog 日志管理
发布日期:2025-04-17 17:45:03 浏览次数: 856 来源:SRE运维派


1 系统日志管理

1.1 常用日志服务介绍

在现实生活中,记录日志非常重要。比如,银行转账时会有转账记录,飞机飞行过程中的黑盒子(飞行数据记录器)记录着飞机的飞行过程,那么将系统和应用发生的事件记录至日志中,也很有意义,常可以助于排错和分析使用。

日志记录的内容包括:

  • 历史事件:时间,地点,人物,事件

  • 日志级别:事件的关键性程度,Loglevel


1.1.1 sysklogd 系统日志服务

在 CentOS5 以及之前的发行版中,其采用的 sysklogd 服务来记录和管理系统日志的。

sysklogd 服务有两个模块:

  • klogd:用于记录 linux kernel 相关的日志

  • syslogd:用于记录用户空间应用日志


1.1.2 rsyslog 系统日志服务

RSYSLOG is the rocket-fast system for log processing.

rsyslog 是 CentOS6 以后的版本中使用的日志管理程序,是一个默认安装的服务,并且默认开机启动。

官方网站
https://www.rsyslog.com/

rsyslog 特性

支持输出日志到各种数据库,如 MySQL,PostgreSQL,MongoDB ElasticSearch,实现使用第三方服务对日志进行存储和分析。

精细的输出格式控制以及对日志内容的强大过滤能力,可实现过滤记录日志信息中的指定部份。

通过 RELP + TCP 实现数据的可靠传输

支持数据的加密和压缩传输等

多线程

rsyslog 会默认安装 
[root@rocky ~]# rpm -q rsyslogrsyslog-8.2102.0-7.el8.x86_64
[root@ubuntu ~]# dpkg -l rsyslogDesired=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

1.1.3 ELK 日志服务

ELK 是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。在后续发展的过程中增加了一个 FileBeat,这几款软件通常在一起配合使用,各司其职。ELK 主要用于部署在企业架构中,收集多台设备上多个服务的日志信息,并将其统一整合后提供给用户。

rsyslog 日志服务与 ELK 日志服务的区别:

rsyslog 主要用于单机日志管理,ELK 主要用于分布式集群环境中的日志管理。

1.2 rsyslog 日志管理

1.2.1 系统日志相关概念

facility:设施,从功能或程序上对日志进行归类

在一台主机上会同时运行多个服务和软件,每个服务或软件都有可能会产生大量的日志,如果每个服务或软件产生的日志都独立存放管理,那文件数量就太多了,如果都放到一个文件中,似乎也不是很合适,所以 syslog 将日志进行了分类,相同类型的日志放一个文件,这样便于管理。

#syslog 内置分类LOG_AUTH #auth 安全和认证相关的日志LOG_AUTHPRIV #authpriv 安全和认证相关的日志,私有LOG_CRON #cron 系统定时任务 crontab 与 at 产生的相关日志LOG_DAEMON #daemon 各守护进程产生的日志LOG_FTP #ftp ftp守护进程产生的日志LOG_KERN #kern 内核产生的日志LOG_LOCAL0 -- LOG_LOCAL7 #local0-local7 自定义分类LOG_LPR #lpr 打印服务日志LOG_MAIL #mail 邮件服务日志LOG_NEWS #news 网络新闻服务产生的日志LOG_SYSLOG #syslog syslogd 服务自己的日志LOG_USER #user 用户等级LOG_UUCP #uucp uucp子系统的日志信息* #通配符,代表所有分类

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 #不需要任何日志     #panic,error,warn在新版中被弃,不建议使用
#查看相关说明[root@ubuntu ~]# man 3 syslog
[root@ubuntu ~]# man 5 rsyslog.conf
https://www.rsyslog.com/doc/master/index.html
1.2.2 syslog 服务组成
#查看所有 rsyslog 包中的文件[root@ubuntu ~]# 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@ubuntu ~]# systemctl status rsyslog
#查看syslogd程序打开的文件[root@ubuntu ~]# lsof -c rsyslogd
[root@ubuntu ~]# lsof -p 854
1.2.3 rsyslog 配置文件
[root@ubuntu ~]# ls /etc/rsyslog.conf/etc/rsyslog.conf
[root@ubuntu ~]# ls /etc/rsyslog.d/20-ufw.conf 21-cloudinit.conf 50-default.conf
#在主配置文件中,将配置分为三个部分,分别是模块(MODULES),全局配置(GLOBAL DIRECTIVES),日志记录规则配置(RULES)
[root@ubuntu ~]# cat /etc/rsyslog.conf
# ubuntu 系统中,默认 rule 规则是单独放在一个文件中的# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
##################### MODULES #####################
#rsyslog 在安装是有很多支持模块,但默认不是所有模块都开启,如果有需要,写在此处即可module(load="imuxsock")#module(load="immark")
#UDP模块,默认没有启用#module(load="imudp")#input(type="imudp" port="514")
#TCP 模块,默认没有启用#module(load="imtcp")#input(type="imtcp" port="514")
#内核日志需要的模块module(load="imklog" permitnonkernelfacility="on")
############################### GLOBAL DIRECTIVES ###############################
#默认日志模板$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
#默认开启重复过滤$RepeatedMsgReduction on
#创建日志文件的默认权限和属主属组$FileOwner syslog$FileGroup adm$FileCreateMode 0640$DirCreateMode 0755$Umask 0022$PrivDropToUser syslog$PrivDropToGroup syslog
#工作目录,默认目录为空$WorkDirectory /var/spool/rsyslog
#独立配置文件引用目录$IncludeConfig /etc/rsyslog.d/*.conf

rule 配置规则

每一行 rule 由两列组成,分别是选择器和处理动作,选择器将过滤后的日志交由处理动作处理。

选择器可以同时有多个,用分号分隔,处理动作也可以同时有多个,用 & 分隔,处理动作中可以指定模板,不同的模板会生成不同的日志内容,模板可以自定义。

选择器有以下几种定义方式:

  • 用分类和优先级来过滤,同一条 rule 中,分类和优先级都可以有多个,用逗号分隔

  • 基于日志内容中的指定字段来过滤

  • 基于表达式构建脚本来过滤


处理动作有以下几种:

  • 输出到日志文件或某个特定设备

  • 保存到数据库

  • 发送给指定用户,该用户必须已登录,可以同时指定多个用户,用逗号分隔

  • 传送到远程主机

  • 通过管道传送给其它命令

  • 丢弃日志,不处理


selector action
#selector-分类和优先级facility.priority[;facility.priority;...] action
#facility# * 所有 facility#priority# * 所有 priority# none 没有任何 priority,即不记录# priority 具体的 priority,处理指定级别和指定级别以上的所有级别日志# =priority 仅处理指定级别日志# !priority 排除指定的 priority,这种写法不能单独使用
#selector-基于日志内容指定字段过滤
#字段,比较表达式,要比较的值:property, [!]compare-operation, "value" action
#所有可用 propertyhttps://www.rsyslog.com/doc/master/configuration/properties.html
#比较表达式#contains 字段是否包含 value 的内容#contains_i 字段是否包含 value 的内容,不区分大小写#isequal 字段的内容是否与 value 相等#startswith 是否以 value 开头#startswith_i 是否以 value 开头,不区分大小写#regex 基本正则#ereregex 扩展正则#isempty 是否为空,不需要后面的 value
#selector-基于RainerScript设置更复杂的日志过滤https://www.rsyslog.com/doc/v8-stable/rainerscript/index.html
#action-输出到日志文件或设备# /path/file 将日志内容写到指定文件# -/path/file 将日志内容写到指定文件,异步写入# /dev/null 将日志内容输出到指定设备
#action-保存到数据库,保存到数据库要开启相应模块
module (load="ommysql")*.* action(type="ommysql" server="10.0.0.210" db="rsyslog" uid="rsysloger" pwd="123456")
#action-发送给指定用户
# root 将日志内容发送给用户 root# root,tom 将日志内容发送给用户 root 和 tom# * 将日志内容发送给所有己登录用户
#action-发送到远程主机
@192.168.2.123 使用 UDP 协议发送到远程主机,默认端口514# @@log.josedu.com:256 使用 TCP 协议发送到远程主机 256 端口,默认端口514# @(z6)[fe80::20c:29ff:fe7e:ce82] 使用 UPD 协议发送到远程主机(IPV6地址),启用zlib压缩,压缩级别为9
#action-通过管道传送给其它命令,管道必须有名管道,要事先创建,此功能在 rsyslog8 版本后才支持
#action-不处理# stop 不处理,丢弃
#ubuntu 系统中默认 rule 配置root@ubuntu:~# cat /etc/rsyslog.d/50-default.conf
auth,authpriv.* /var/log/auth.log #登录验证相关的日志记录在auth.log 中*.*;auth,authpriv.none -/var/log/syslog #除了登录校验之外的日志,都记录在 syslog 中,异步写#cron.* /var/log/cron.log#daemon.* -/var/log/daemon.logkern.* -/var/log/kern.log #内核所有日志都记录在kern.log 中,异步写#lpr.* -/var/log/lpr.logmail.* -/var/log/mail.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.warnmail.err /var/log/mail.err #邮件服务 err 及以上的日志记录在 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:* #所有致命错误信息,调用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

1.2.4 rsyslog 日志内容和模板

Ubuntu 中日志内容

[root@ubuntu ~]# tail /var/log/syslog[root@ubuntu ~]# tail -n 3 /var/log/auth.log

Rocky 中日志内容

[root@rocky ~]# tail /var/log/messages[root@rocky ~]# tail /var/log/secure

日志内容由template决定,如果没有显式指定,默认使用 RSYSLOG_TraditionalFileFormat,其具体内容如下:

template(name="RSYSLOG_TraditionalFileFormat" type="string"    string="%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n")

rsyslog 中有13个内置的模板,我们可以在配置文件中直接使用,其名称如下,具体定义的内容需要查询相关文档

RSYSLOG_TraditionalFileFormatRSYSLOG_FileFormatRSYSLOG_TraditionalForwardFormatRSYSLOG_SysklogdFileFormatRSYSLOG_ForwardFormatRSYSLOG_SyslogProtocol23FormatRSYSLOG_DebugFormatRSYSLOG_WallFmtRSYSLOG_StdUsrMsgFmtRSYSLOG_StdDBFmtRSYSLOG_StdPgSQLFmtRSYSLOG_spoofadrRSYSLOG_StdJSONFmt
https://www.rsyslog.com/doc/v8-stable/configuration/templates.html

除了使用内置模板外,我们还可以自定义模板。

自定义模板可以直接写在配置文件中

生成的日志内容模板决定,而模板是由 rsyslog 中的相关属性组成,这些属性在生成日志内容时会被替换成具体内容。所谓属性是指rsyslog 中的一些特殊关键字,在模板语法中,使用 %属性名% 来表示一个字段。

rsylog 常用属性

https://www.rsyslog.com/doc/v8-stable/configuration/properties.htmlhttps://www.rsyslog.com/doc/v8-stable/configuration/property_replacer.html

1.2.5 常见日志及相关工具

Rocky 中常见日志说明

[root@rocky ~]# cat /etc/rsyslog.conf | grep -Ev "^#|^$"*.info;mail.none;authpriv.none;cron.none /var/log/messages #除了mail,authpriv,cron之外都记录authpriv.* /var/log/secure #安全认证相关日志mail.* -/var/log/maillog #邮件服务相关日志cron.* /var/log/cron #定时任务相关日志*.emerg :omusrmsg:* #所有致命错误信息,调用omusrmsg发给所有登录用户uucp,news.crit /var/log/spooler #uucp,新闻相关日志local7.* /var/log/boot.log #操作系统启动流程日志
ubuntu 中常见日志说明
[root@ubuntu ~]# cat /etc/rsyslog.d/*conf | grep -Ev "^#|^$":msg,contains,"[UFW " /var/log/ufw.log #ufw 服务日志:syslogtag, isequal, "[CLOUDINIT]" /var/log/cloud-init.log #cloud-init服务日志& stop #其它不处理auth,authpriv.* /var/log/auth.log #auth,authpriv 之外的日志*.*;auth,authpriv.none -/var/log/syslog #除了auth,authpriv之外的日志kern.* -/var/log/kern.log #内核产生的日志mail.* -/var/log/mail.log #邮件服务日志mail.err /var/log/mail.err #邮件服务err(含)以上日志*.emerg :omusrmsg:* #所有致命错误信息,调用omusrmsg发给所有登录用户

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@rocky86 ~]# ll /var/log/{btmp,lastlog,wtmp}-rw-------  1 root utmp 321024 Feb 19 04:05 /var/log/btmp-rw-rw-r--. 1 root utmp    292 Feb 19 16:07 /var/log/lastlog-rw-rw-r--. 1 root utmp   8832 Feb 19 16:07 /var/log/wtmp
[root@rocky86 ~]# file /var/log/{btmp,lastlog,wtmp}/var/log/btmp:    data/var/log/lastlog: data/var/log/wtmp:    dBase III DBT, version number 0next free block index 8
#在 ubuntu 中查看[root@unbutu2204 ~]# ll /var/log/{btmp,lastlog,wtmp}-rw-rw---- 1 root utmp 170027136 Feb 19 16:07 /var/log/btmp-rw-rw-r-- 1 root utmp     33288 Feb 19 10:59 /var/log/lastlog-rw-rw-r-- 1 root utmp      7680 Feb 19 10:59 /var/log/wtmp
[root@unbutu2204 ~]# file /var/log/{btmp,lastlog,wtmp}/var/log/btmp:    data/var/log/lastlog: data/var/log/wtmp:    data
last -x|--system #显示系统关机项和运行级别更改

dmesg 命令

dmesg 命令用来查看主机硬件相关日志

logger 命令

logger 命令可以手动生成相关日志

logger [options] [<message>]
#常用选项-p|--priority #指定优先级-f|--file #从文件中读取日志内容-t|--tag #指定日志tag-n|--server #指定远程主机IP或主机名-P|--port #指定远程主机端口-T|--tcp #指定使用TCP协议传输-d|--udp #指定使用UDP协议传输
#无选项[root@ubuntu2204 ~]# logger "this is test msg"root@ubuntu2204:~# tail -n 1 /var/log/syslogMay 3 07:07:08 ubuntu2204 root: this is test msg
[root@ubuntu ~]# cat test.txtthis msg from test.txt
#从文件中读取,指定tag,指定优先级[root@ubuntu ~]# logger -t test -f test.txt -p error[root@ubuntu ~]# tail -n 1 /var/log/syslogMay 4 14:09:53 ubuntu test: this msg from test.txt
1.2.6 在本机自定义服务日志
#sshd服务日志默认是归属于 AUTH 分类,默认级别是 INFO[root@ubuntu ~]# cat /etc/ssh/sshd_config | grep -i log# Logging#SyslogFacility AUTH#LogLevel INFO
#根据配置,此日志记录在 /var/log/auth.log 中[root@ubuntu ~]# cat /etc/rsyslog.d/50-default.conf | grep "^auth"auth,authpriv.* /var/log/auth.log
#重启服务[root@ubuntu ~]# systemctl restart sshd
#查看日志,能看到相关内容[root@ubuntu ~]# tail -n 3 /var/log/auth.log
#修改 sshd 服务日志的配置项,分类改到 LOCAL6,级别不改[root@ubuntu ~]# cat /etc/ssh/sshd_config | grep -i log# Logging#SyslogFacility AUTH#LogLevel INFOSyslogFacility LOCAL6
#新增配置文件,local6 分类的日志都写到 sshd.log 文件中[root@ubuntu ~]# cat /etc/rsyslog.d/sshd.conflocal6.* /var/log/sshd.log
#当前还没有日志文件[root@ubuntu ~]# ll /var/log/sshd.logls: cannot access '/var/log/sshd.log': No such file or directory
#重启服务[root@ubuntu ~]# systemctl restart rsyslog[root@ubuntu ~]# systemctl restart sshd[root@ubuntu ~]# ll /var/log/sshd.log-rw-r----- 1 syslog adm 139 Jun 28 20:03 /var/log/sshd.log
#测试[root@ubuntu ~]# ssh 127.1root@127.0.0.1's password:
#查看日志[root@ubuntu ~]# tail /var/log/sshd.log
#测试[root@ubuntu ~]# logger -p local6.info "hello sshd"
#查看日志[root@ubuntu ~]# tail -1 /var/log/sshd.logJun 28 20:26:53 ubuntu root: hello sshd

1.2.7 使用日志网络转发

可以使用 rsyslog 服务中的远程转发功能,通过 TCP 或 UDP 协议将当前主机的日志转发到远程日志服务器上,进行集中存储,方便统一管理。

主机清单
主机IP 
操作系统 
角色
10.0.0.206 
ubuntu 
log-server
10.0.0.150 
rocky 
client-1
10.0.0.208 
ubuntu 
client-2
配置 server log 主机,开启 TCP,UDP 相关功能
#启用相关模块,去掉 UDP,TCP 模块的注释[root@ubuntu ~]# vim /etc/rsyslog.conf# provides UDP syslog receptionmodule(load="imudp")input(type="imudp" port="514")# provides TCP syslog receptionmodule(load="imtcp")input(type="imtcp" port="514")
#重启服务[root@ubuntu ~]# systemctl restart rsyslog
#查看端口[root@ubuntu ~]# ss -tunlp | grep 514
配置 client-1 主机日志远程转发
[root@rocky ~]# hostnamectl set-hostname client-1
#配置远程转发,转发到 10.0.0.206 的 udp 协议514端口,默认514 可以省略[root@client-1 ~]# cat /etc/rsyslog.d/net.conf*.info @10.0.0.206:514
#重启服务[root@client-1 ~]# systemctl restart rsyslog
根据 log-server 主机中的配置,转发过来的日志会被写到 /var/log/syslog 文件中
[root@ubuntu ~]# cat /etc/rsyslog.d/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
#测试-在client-1主机上写入日志[root@client-1 ~]# logger "this msg from client-1"
#client-1 主机上也有该日志[root@client-1 ~]# tail -1 /var/log/messagesJun 28 21:02:29 client-1 root[11509]: this msg from client-1
#在 log-server 上查看[root@ubuntu ~]# tail -1 /var/log/syslogJun 28 21:02:29 client-1 root[11509]: this msg from client-1
配置 client-2 主机日志远程转发
[root@ubuntu ~]# hostnamectl hostname client-2
#配置远程转发,转发到 10.0.0.206 的 tcp 协议514端口,默认514 可以省略[root@client-2 ~]# cat /etc/rsyslog.d/net.conf*.info @@10.0.0.206:514
#重启服务[root@client-2 ~]# systemctl restart rsyslog.service
#测试[root@client-2 ~]# logger "this msg from client-2"
#本机查看[root@client-2 ~]# tail -1 /var/log/syslogJun 28 21:55:12 cdl-lb-1356093980 root: this msg from client-2
#log-server 查看[root@ubuntu ~]# tail -1 /var/log/syslogJun 28 21:55:12 cdl-lb-1356093980 root: this msg from client-2

1.2.8 使用MySQL 数据库转储日志

在网络转发的基础上,将日志转储到 MySQL 数据库中

主机清单

主机IP 
操作系统 
角色
10.0.0.210 
ubuntu 
mysql-server
10.0.0.206 
ubuntu 
log-server
10.0.0.150 
rocky 
client-1
10.0.0.208 
ubuntu 
client-2

#在 log-server 上安装 rsyslog 的 mysql 包[root@log-server ~]# apt search rsyslog-mysql
[root@log-server ~]# apt install rsyslog-mysql
#查看包信息[root@log-server ~]# dpkg -s rsyslog-mysql
#查看包文件[root@log-server ~]# 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 配置文件模板
#在数据库服务器上建表[root@log-server ~]# scp /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql 10.0.0.210:/root/rsyslog.sql
#创建数据库mysql> create database rsyslog;Query OK, 1 row affected (0.01 sec)
mysql> use rsyslog;Database changed
#导入SQL文件建表mysql> source /root/rsyslog.sql;Query OK, 0 rows affected (0.01 sec)
#查看表mysql> show tables;+------------------------+| Tables_in_rsyslog      |+------------------------+| SystemEvents           || SystemEventsProperties |+------------------------+2 rows in set (0.01 sec)
#两张表都为空mysql> select count(*from SystemEvents;+----------+| count(*|+----------+| 0        |+----------+1 row in set (0.01 sec)
mysql> select count(*from SystemEventsProperties;+----------+| count(*|+----------+| 0        |+----------+1 row in set (0.00 sec)
#创建用户并授权mysql> create user 'rsysloger'@'10.0.0.%' identified by '123456';Query OK, 0 rows affected (0.00 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)
#在 log-server 服务器上配置 mysql 转发[root@log-server ~]# cp /usr/share/rsyslog-mysql/rsyslog-mysql.conf.template /etc/rsyslog.d/mysql.conf
#修改配置[root@log-server ~]# cat /etc/rsyslog.d/mysql.confmodule (load="ommysql")*.* action(type="ommysql" server="10.0.0.210" db="rsyslog" uid="rsysloger" pwd="123456")
#重启服务[root@log-server ~]# systemctl restart rsyslog.service
#在 log-server 上查看mysql> select count(*from SystemEvents;+----------+| count(*|+----------+| 14       |+----------+1 row in set (0.00 sec)
#测试[root@client-1 ~]# logger "this msg from client-1"[root@client-2 ~]# logger "this msg from client-2"[root@log-server ~]# logger "this msg from log-server"
#查看数据库mysql> select FromHost,Message from SystemEvents order by id desc limit 3;+------------+---------------------------+| FromHost   | Message                   |+------------+---------------------------+| log-server | this msg from log-server  || client-2   | this msg from client-2    || client-1   | this msg from client-1    |+------------+---------------------------+3 rows in set (0.00 sec)
在此基础上,我们可以再实现一个 Web 服务,将 Mysql 中的日志数据在页面上显示出来
#推荐的开源程序https://loganalyzer.adiscon.com/

1.3 服务日志管理工具 journalctl

在 systemd 为 1号进程的系统版本中,systemd 提供了一个集中的方式来处理所有来自进程,应用程序等的操作系统日志,所有这些日志事件都由 systemd 的 journald 守护进程来处理。journald 守护进程收集所有来自 Linux 操作系统的各种日志,并将其作为二进制数据存储在文件中。

以二进制数据集中记录事件、系统问题的好处有很多。例如,由于系统日志是以二进制而不是文本形式存储的,你可以以文本、JSON 对象等多种方式进行转译,以满足各种需求。另外,由于日志是按顺序存储的,通过对日志的日期/时间操作,超级容易追踪到单个事件。

#配置文件[root@log-server ~]# cat /etc/systemd/journald.conf
#日志数据存储目录,非文本文件,无法用文本工具打开[root@log-server ~]# 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 开始显示--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 #将时间戳字段的零值从内核启动时开始计算short-full #与 short 内容相同,但时间显示更详细short-monotonic #将时间戳字段的零值从内核启动时开始计算short-unix #将时间戳字段显示为从"UNIX时间原点"(1970-1-1 00:00:00UTC)以来的秒数。精确到微秒级别verbose #以结构化的格式显示每条日志的所有字段export #将日志序列化为二进制字节流(大部分依然是文本) 以适用于备份与网络传输json #将日志项按照JSON数据结构格式化, 每条日志一行json-pretty #将日志项按照JSON数据结构格式化, 但是每个字段一行, 以便于人类阅读json-sse #将日志项按照JSON数据结构格式化,每条日志一行,但是用大括号包围json-seq #将日志项按照JSON数据结构格式化,每条日志前面加上ASCII记录分隔符,后面加上ASCII换行符cat #仅显示日志的实际内容, 而不显示与此日志相关的任何元数据(包括时间戳)with-unit #类似于 short-full,前缀以unit 名来显示,而不是syslog标识符
查看所有日志
#默认显示所有日志[root@log-server ~]# journalctl
[root@log-server ~]# ll /var/log/syslog*-rw-r----- 1 syslog adm 1450696 Jun 30 11:50 /var/log/syslog-rw-r----- 1 syslog adm 1178030 Jun 26 13:56 /var/log/syslog.1
#内容和 syslog 中一样[root@log-server ~]# head -1 /var/log/syslog.1
#但删除掉 syslog ,journalctl 还是能查看[root@log-server ~]# mv /var/log/syslog.1 /tmp/
[root@log-server ~]# journalctl
查看日志文件元数据
[root@log-server ~]# journalctl --headerFile path:/var/log/journal/72f41ddc79b44308a161708e65544943/system@5a33791df54d481eb96a84b38148309b-0000000000002a18-0005fb3b4880407f.journalFile ID: 86c70c45ed5d4ee48a2f6826cd2a5844Machine ID: 72f41ddc79b44308a161708e65544943Boot ID: dc0f2b7aa8c745c2a3ad2098d2f3eb5aSequential number ID: 5a33791df54d481eb96a84b38148309bState: ARCHIVEDCompatible flags:Incompatible flags: COMPRESSED-ZSTD KEYED-HASHHeader size: 256Arena size: 8388352......
查看日志分类
#第一列为分类ID[root@log-server ~]# journalctl --list-catalog0027229ca0644181a76c4e92458afa2e systemd: One or more messages could not beforwarded to syslog0e4284a0caca4bfc81c0bb6786972673 systemd: Unit skipped1675d7f172174098b1108bf8c7dc8f5d systemd: DNSSEC validation failed1b3bb94037f04bbf81028e135a12d293 systemd: Failed to generate valid unit name frompath '@MOUNT_POINT@'.
#显示指定分类信息[root@log-server ~]# journalctl --list-catalog d9b373ed55a64feb8242e02dbe79a49cd9b373ed55a64feb8242e02dbe79a49c systemd: Unit failed
#详细显示分类信息[root@log-server ~]# journalctl --dump-catalog......
#详细显示指定分类信息[root@log-server ~]# journalctl --dump-catalog d9b373ed55a64feb8242e02dbe79a49c-- d9b373ed55a64feb8242e02dbe79a49cSubject: Unit failedDefined-By: systemdSupport: http://www.ubuntu.com/supportThe unit @UNIT@ has entered the 'failed' state with result '@UNIT_RESULT@'.
日志跟随,显示最新日志
[root@log-server ~]# journalctl -f
倒序显示
[root@log-server ~]# journalctl -r
查看特定时间日志
#查看 2024-06-30 12:0:0 到 2024-06-30 15:30:0 之间产生的日志[root@log-server ~]# journalctl -S "2024-06-30 12:0:0" -U "2024-06-30 15:30:0"
#查看昨天到当前的日志[root@log-server ~]# journalctl -S yesterday
#查看今天9点到1小时之前的日志[root@log-server ~]# journalctl --since 09:00 --until "1 hour ago"
查看启动信息
#第一列是每次启动序号#第二列是启动ID,32位#第三列第三列是启动后的系统运行时长#最后一条是最新的数据[root@log-server ~]# journalctl --list-boots
#查看本次启动日志[root@log-server ~]# journalctl -b 0
#查看上次启动日志[root@log-server ~]# journalctl -b -1
[root@log-server ~]# journalctl -b a77f986ef80f409c8a60a0ddfd7623cd
查看内核日志
[root@log-server ~]# journalctl -k
根据服务或程序查看
[root@log-server ~]# journalctl -u nginx.service[root@log-server ~]# journalctl -u ssh.service[root@log-server ~]# journalctl /usr/sbin/sshd[root@log-server ~]# journalctl /usr/bin/bash
根据PID查看
[root@log-server ~]# journalctl _PID=1
根据UID查看
[root@log-server ~]# journalctl _UID=0
根据等级查看
[root@log-server ~]# journalctl -p warning[root@log-server ~]# journalctl -p 4
根据分类查看
[root@log-server ~]# journalctl --facility=auth
指定显示格式
[root@log-server ~]# journalctl -o json-pretty -n 1[root@log-server ~]# journalctl -o cat -n 1
显示特定字段
[root@log-server ~]# journalctl -o json-pretty -n 1 --output-fields=_UID
查询日志占用了多少磁盘空间
[root@log-server ~]# journalctl --disk-usageArchived and active journals take up 80.0M in the file system.
多个参数
[root@log-server ~]# journalctl -b -u nginx.service -o json-pretty

— END —

优网科技,优秀企业首选的互联网供应服务商

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!

优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、DIY体验、720全景展厅及3D虚拟仿真)、移动端应用(手机站APP开发)、微信定制开发(微信官网、微信商城、企业微信)、微信小程序定制开发等一系列互联网应用服务。


我要投稿

姓名

文章链接

提交即表示你已阅读并同意《个人信息保护声明》

专属顾问 专属顾问
扫码咨询您的优网专属顾问!
专属顾问
马上咨询
扫一扫马上咨询
扫一扫马上咨询

扫一扫马上咨询