首页 > 其他分享 >日志服务管理

日志服务管理

时间:2024-09-08 08:55:25浏览次数:13  
标签:服务 log 管理 -- rsyslog var 日志 root

系统日志管理

sysklogd 系统日志服务

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

sysklogd 服务有两个模块:

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

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

rsyslog 系统日志服务

RSYSLOG is the rocket-fast system for log processing.

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

rsyslog 特性

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

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

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

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

多线程

ELK 日志服务

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

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

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

rsyslog 日志管理

系统日志相关概念

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

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

#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在新版中被弃,不建议使用

rsyslog 服务组成

#查看所有 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 	#库文件

#查看syslogd程序打开的文件
lsof -c rsyslogd

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-分类和优先级
facility.priority[;facility.priority;...] action

#facility

# * 所有 facility

#priority

# * 所有 priority
# none 没有任何 priority,即不记录
# priority     具体的 priority,处理指定级别和指定级别以上的所有级别日志
# =priority 仅处理指定级别日志
# !priority 排除指定的 priority,这种写法不能单独使用

#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


#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.magedu.com:256 使用 TCP 协议发送到远程主机 256 端口,默认端口514
# @(z6)[fe80::20c:29ff:fe7e:ce82] 使用 UDP 协议发送到远程主机(IPV6地址),启用zlib压缩,压缩级别为6

#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.log
kern.* -/var/log/kern.log #内核所有日志都记录在kern.log 中,异步写
#lpr.* -/var/log/lpr.log
mail.* -/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.warn
mail.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

rsyslog 日志内容和模板

Ubuntu 中日志内容

[root@ubuntu22:~]# tail /var/log/syslog
Sep  6 13:22:22 ubuntu22 systemd[1134]: Listening on GnuPG cryptographic agent and passphrase cache.
Sep  6 13:22:22 ubuntu22 systemd[1134]: Listening on debconf communication socket.
Sep  6 13:22:22 ubuntu22 systemd[1134]: Listening on REST API socket for snapd user session agent.
...

Rocky 中日志内容

[root@Rocky-9 ~]# tail /var/log/messages
Sep  6 21:13:43 Rocky-9 chronyd[861]: Selected source 139.199.214.202 (2.rocky.pool.ntp.org)
Sep  6 21:13:43 Rocky-9 chronyd[861]: System clock TAI offset set to 37 seconds
Sep  6 21:16:30 Rocky-9 systemd[1]: packagekit.service: Deactivated successfully.
...
[root@Rocky-9 ~]# tail /var/log/secure
Sep  6 21:11:19 Rocky-9 polkitd[830]: Finished loading, compiling and executing 12 rules
Sep  6 21:11:19 Rocky-9 polkitd[830]: Acquired the name org.freedesktop.PolicyKit1 on the system bus
Sep  6 21:11:20 Rocky-9 sshd[1040]: Server listening on 0.0.0.0 port 22.
Sep  6 21:11:20 Rocky-9 sshd[1040]: Server listening on :: port 22.
...

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

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

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

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

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

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

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

常见日志及相关工具

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/btmplastb当前系统上,用户的失败尝试登录相关的日志 ( bad logins ),二 进制格式
/var/log/lastloglastlog每一个用户最近一次的登录信息,二进制格式
/var/log/wtmplast当前系统上,用户正常登录系统的相关日志信息 ( who was logged in ),二进制格式
#在 rocky 中查看
[root@Rocky-9 ~]# ll /var/log/{btmp,lastlog,wtmp}
-rw-rw----. 1 root utmp      0 Sep  2 19:11 /var/log/btmp
-rw-rw-r--. 1 root utmp 292292 Sep  6 21:12 /var/log/lastlog
-rw-rw-r--. 1 root utmp  67584 Sep  6 21:12 /var/log/wtmp
[root@Rocky-9 ~]# file /var/log/{btmp,lastlog,wtmp}
/var/log/btmp:    empty
/var/log/lastlog: data
/var/log/wtmp:    data

#在 ubuntu 中查看
[root@ubuntu24 ~]# ll /var/log/{btmp,lastlog,wtmp}
-rw-rw---- 1 root utmp      0 Sep  2 09:01 /var/log/btmp
-rw-rw-r-- 1 root utmp 292292 Sep  6 21:22 /var/log/lastlog
-rw-rw-r-- 1 root utmp  85632 Sep  6 21:22 /var/log/wtmp
[root@ubuntu24 ~]# file /var/log/{btmp,lastlog,wtmp}
/var/log/btmp:    empty
/var/log/lastlog: data
/var/log/wtmp:    data

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@ubuntu24 ~]# logger "hello world"
[root@ubuntu24 ~]# tail -n 1 /var/log/syslog
2024-09-06T21:35:40.001750+08:00 ubuntu24 root: hello world
在本机自定义服务日志
#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
Jun 28 20:00:35 ubuntu2204 sshd[920]: Received signal 15; terminating.
Jun 28 20:00:35 ubuntu2204 sshd[3431]: Server listening on 0.0.0.0 port 22.
Jun 28 20:00:35 ubuntu2204 sshd[3431]: Server listening on :: port 22.


#修改 sshd 服务日志的配置项,分类改到 LOCAL6,级别不改
[root@ubuntu ~]# cat /etc/ssh/sshd_config | grep -i log
# Logging
#SyslogFacility AUTH
#LogLevel INFO
SyslogFacility LOCAL6

#新增配置文件,local6 分类的日志都写到 sshd.log 文件中
[root@ubuntu ~]# cat /etc/rsyslog.d/sshd.conf
local6.* /var/log/sshd.log

#当前还没有日志文件
[root@ubuntu ~]# ll /var/log/sshd.log
ls: 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.1
[email protected]'s password:

#查看日志
[root@ubuntu ~]# tail /var/log/sshd.log 
Jun 28 20:04:02 ubuntu sshd[3561]: Disconnected from user root 127.0.0.1 port 
52866
Jun 28 20:04:07 ubuntu sshd[3655]: Accepted password for root from 127.0.0.1 
port 38968 ssh2
Jun 28 20:04:08 ubuntu sshd[3655]: Received disconnect from 127.0.0.1 port 
38968:11: disconnected by user
Jun 28 20:04:08 ubuntu sshd[3655]: Disconnected from user root 127.0.0.1 port 
38968
Jun 28 20:04:23 ubuntu sshd[3714]: Connection closed by authenticating user root 
127.0.0.1 port 54338 [preauth]

#测试
[root@ubuntu ~]# logger -p local6.info "hello sshd"
#查看日志
[root@ubuntu ~]# tail -1 /var/log/sshd.log 
Jun 28 20:26:53 ubuntu root: hello sshd

使用网络转发日志

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

主机IP操作系统角色
10.0.0.157ubuntu 24log-server
10.0.0.158rocky9client-1
10.0.0.151ubuntu22client-2

配置 server log 主机,开启 TCP, UDP 相关功能

#启用相关模块, 去掉 UDP,TCP 模块的注释
[root@ubuntu24 ~]# vim /etc/rsyslog.conf
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")

#重启服务
[root@ubuntu24 ~]# systemctl restart rsyslog.service
[root@ubuntu24 ~]# ss -tunlp | grep 514
udp   UNCONN 0      0                              0.0.0.0:514       0.0.0.0:*    users:(("rsyslogd",pid=2058,fd=6))
udp   UNCONN 0      0                                 [::]:514          [::]:*    users:(("rsyslogd",pid=2058,fd=7))
tcp   LISTEN 0      25                             0.0.0.0:514       0.0.0.0:*    users:(("rsyslogd",pid=2058,fd=8))
tcp   LISTEN 0      25                                [::]:514          [::]:*    users:(("rsyslogd",pid=2058,fd=9))

配置 ubuntu22 主机日志远程转发

#配置远程转发,转发到 10.0.0.157 的 udp 协议514端口,默认514 可以省略
[root@ubuntu22:~]# vim /etc/rsyslog.d/50-default.conf
#配置远程转发,转发到服务器514端口
*.info   @10.0.0.157:514
#本机查看
[root@ubuntu22:~]# logger "hello world"
[root@ubuntu22:~]# tail -1 /var/log/syslog
Sep  6 13:55:25 ubuntu22 root: hello world

#服务端查看
[root@ubuntu24 ~]# tail -1 /var/log/syslog
2024-09-06T13:55:25+08:00 ubuntu22 root: hello world

配置 rocky9主机日志远程转发

#配置远程转发,转发到 10.0.0.157 的 udp 协议514端口,默认514 可以省略
[root@Rocky-9 ~]# vim /etc/rsyslog.conf
#配置远程转发,转发到服务器514端口
*.info   @10.0.0.157:514
#本机查看
[root@Rocky-9 ~]# tail -1 /var/log/messages
Sep  7 09:19:17 Rocky-9 root[2424]: hello world

#服务端查看
[root@ubuntu24 ~]# tail -1 /var/log/syslog
2024-09-07T09:19:17+08:00 Rocky-9 root[2424]: hello world

使用MySQL 数据库转储日志

将日志转储到 MySQL 数据库中

在添加一台mysql-server 主机IP:10.0.0.161

配置 server log 主机

#在 log-server 上安装 rsyslog 的 mysql 包
[root@ubuntu24 ~]# apt install rsyslog-mysql
#查看包文件
[root@ubuntu24 ~]# 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表文件发送到mysql-server服务器上建表
[root@ubuntu24 install]# scp /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql 10.0.0.161:/root/

#等待mysql-server 服务器上配置好相关配置(创建数据库用户,修改配置文件,开放监听IP)
#在 log-server 服务器上配置 mysql 转发
[root@ubuntu24 ~]# vim /etc/rsyslog.d/mysql.conf	
#如果没有上述文件执行cp /usr/share/rsyslog-mysql/rsyslog-mysql.conf.template /etc/rsyslog.d/mysql.conf

#重启服务
[root@ubuntu24 install]# systemctl restart rsyslog.service

配置mysql-server 服务器(此服务器为克隆ubuntu24所以主机名相同)

#安装数据库
[root@ubuntu24 ~]# apt install mysql-server
#查看3306端口
[root@ubuntu24 ~]# ss -tnlp
LISTEN		0		151		127.0.0.1:3306		0.0.0.0:*		users:(("mysqld",pid=3310,fd=23))
#创建数据库
[root@ubuntu24 mysql.conf.d]# mysql
mysql> create database rsyslog;

#导入SQL文件建表
mysql> use rsyslog;
mysql> source /root/mysql;

#查看表
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.01 sec)


#创建用户并授权
mysql> create user 'rsysloger'@'10.0.0.%' identified by '123456';
mysql> grant all on rsysloger.* to 'rsysloger'@'10.0.0.%';
mysql> flush privileges;

#修改配置文件注释两行,不能只监听127.1
[root@ubuntu24 mysql.conf.d]# vim /etc/mysql/mysql.conf.d/mysqld.cnf
...
#bind-address = 127.0.0.1
#mysqlx-bind-address = 127.0.0.1
...

#再查看3306端口
LISTEN		0		151		*:3306		*:*		users:(("mysqld",pid=3632,fd=23))

#重启服务
[root@ubuntu24 mysql.conf.d]# systemctl restart mysql.service

#重新进入到MySQL中查看
[root@ubuntu24 mysql.conf.d]# mysql
mysql> use rsyslog;
mysql>select count(*) from SystemEvents;
+----------+
| count(*) |
+----------+
|       75 |
+----------+
1 row in set (0.01 sec)

服务日志管理工具 journalctl

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

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

#配置文件
[root@ubuntu24 ~]# cat /etc/systemd/journald.conf
#日志数据存储目录,非文本文件,无法用文本工具打开
[root@ubuntu24 ~]# tree /var/log/journal/
/var/log/journal/
└── ef062b5ca3e947e38a03f0477da3ced5
├── [email protected]~
    ├── [email protected]~
    ├── [email protected]~
    ├── [email protected]~
    ├── [email protected]~
    ├── [email protected]~
    ├── system@0d1266e161c946ac9be424f9b40d474b-00000000000036b9-00061fcb26f31429.journal
    ├── system@0d7a0408f84841d7b8eba3dcafa48f23-0000000000004868-00061fd6afc0aa2f.journal
    ├── system@0d7a0408f84841d7b8eba3dcafa48f23-0000000000005061-00061fd6b1b39a24.journal
    ├── system@2d186199ca944069ac41e9a9ecf69aa9-0000000000013bce-0006212
    ...

journalctl格式    

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标识符




#示例
#查看启动信息
#第一列是每次启动序号
#第二列是启动ID,32位
#第三列是启动后的系统运行时长
#最后一条是最新的数据
[root@ubuntu24 ~]# journalctl --list-boots
IDX BOOT ID                          FIRST ENTRY                 LAST ENTRY
-32 9247d7ea4552436abd7faf288631af92 Thu 2024-08-15 09:57:01 CST Thu 2024-08-15 10:09:48 CST
-31 3d0d379374744cada4fd267813a9a140 Thu 2024-08-15 10:10:59 CST Thu 2024-08-15 10:14:13 CST
-30 61dfaef522da45e7a1e188a4b1eac684 Thu 2024-08-15 10:14:44 CST Thu 2024-08-15 10:21:44 CST
-29 7700fa638c204957976422b46eaaeec0 Thu 2024-08-15 10:56:10 CST Thu 2024-08-15 12:17:01 CST
-28 151b6d4f445644cc84d4a144fd0281ad Thu 2024-08-15 14:07:26 CST Thu 2024-08-15 21:02:22 CST
...

##查看本次启动日志
[root@ubuntu24 ~]# journalctl -b 0

#查看内核日志
[root@ubuntu24 ~]# journalctl -k

#根据PID查看
[root@ubuntu24 ~]# journalctl _PID=1

 Logrotate 日志转储

 **Logrotate 介绍**

在 Linux 系统中,能够帮助使用者定位问题的有效手段之一就是查日志。

如果一个服务或一个程序的日志,一直只写一个文件,则会导致该日志文件越来越大,无论是查看还是 搜索内容,备份等,都会特别不方便,而且如果服务器数量较多,日志文件大小增长较快,也会很容易 触发告警。

为了解决这种情况,我们可以使用日志转储服务,对服务日志进行分割,按照一定的规则将日志保存在 不同的文件中,这样更便于管理和归档。

当前服务器上的日志转储

[root@ubuntu24 ~]# ll /var/log/dmesg*
-rw-r----- 1 root adm 140133 Sep  7 08:56 /var/log/dmesg
-rw-r----- 1 root adm 140956 Sep  6 21:12 /var/log/dmesg.0
-rw-r----- 1 root adm  27251 Sep  6 10:31 /var/log/dmesg.1.gz
-rw-r----- 1 root adm  27464 Sep  5 09:36 /var/log/dmesg.2.gz
-rw-r----- 1 root adm  26989 Sep  4 19:35 /var/log/dmesg.3.gz
-rw-r----- 1 root adm  27265 Sep  3 10:54 /var/log/dmesg.4.gzs

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转 储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执 行。

相关文件

/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 程序再配合定义好的转储规则对日志文件进行转储。

Logrotate 配置

在配置文件中定义转储规则,配置文件中的主要配置项

#主配置文件
[root@ubuntu24 ~]# 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 	#默认使用 adm 组
# 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 		#默认不启用文件压缩
# packages drop log rotation information into this directory
include /etc/logrotate.d #包含的子目录
# system-specific logs may also be configured here.
#每个服务单独的配置文件,如果在单独配置文件中没有定义的配置项,则使用主配置文件中的配置项或默认配置
[root@ubuntu24 ~]# ls /etc/logrotate.d/
alternatives  apport  apt  bootlog  btmp  chrony  cloud-init  dbconfig-common  dpkg  ppp  rsyslog  ubuntu-pro-client  ufw  unattended-upgrades  wtmp



[root@ubuntu24 ~]# cat /etc/logrotate.d/rsyslog
/var/log/syslog
/var/log/mail.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/cron.log
{						#上述所有日志文件都适用于此转储规则
	rotate 4			#保留最近4个文件,加上当前使用的,一个5个
	weekly				#每周转储
	missingok			#如果要转储的日志文件不存在,不提示错误,继续下一个
	notifempty			#如果是空文件,不转储
	compress			#启用gzip压缩转储后的日志文件
	delaycompress		#和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
	sharedscripts		#运行脚本,分别是转储前和转储后脚本
	postrotate			#转储后脚本
		/usr/lib/rsyslog/rsyslog-rotate
	endscript
}


#常用配置项
compress 		#通过gzip压缩转储以后的日志
nocompress 		#不压缩
copytruncate 	#用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 	#用于还在打开中的日志文件,把当前日志备份并不截断
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 	#让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig,.rpmsave, v, 和 ~
size size 		#当日志文件到达指定的大小时才转储,默认单位是bytes,也可以指明KB或MB
sharedscripts 	#对每个转储日志运行prerotate和postrotate脚
nosharedscripts #针对每一个转储的日志文件,都执行一次prerotate 和postrotate脚本,此为默认值
missingok 		#如果日志不存在,不提示错误,继续处理下一个
nomissingok 	#如果日志不存在,提示错误,此为默认值
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@log-server ~]# dd if=/dev/zero of=/var/log/test1.log bs=2M count=1
[root@log-server ~]# dd if=/dev/zero of=/var/log/test2.log bs=2M count=1

[root@log-server ~]# ll -h /var/log/test*
-rw-r--r-- 1 root root 2.0M Jul  4 17:51 /var/log/test1.log
-rw-r--r-- 1 root root 2.0M Jul  4 17:52 /var/log/test2.log

#定义转储规则
[root@log-server ~]# cat /etc/logrotate.d/test{1,2}
/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
}
/var/log/test2.log {
 daily
 rotate 5
 su root root
 dateext
 compress
 delaycompress
 missingok
 size 1M
 notifempty
 create 644 root root
 postrotate
    echo `date +%F_%T` >> /tmp/test2.log
 endscript
}

#手动执行转储
[root@log-server ~]# logrotate /etc/logrotate.d/test1

#查看日志,生成新的空文件,权限,属主属组都符合预设
[root@log-server ~]# ls -lh /var/log/test1*
-rw-r----- 1 syslog adm     0 Jul  5 22:58 /var/log/test1.log
-rw-r--r-- 1 root   root 2.0M Jul  5 21:05 /var/log/test1.log.1

#再次转储,先保证日志达到转储条件
[root@log-server ~]# dd if=/dev/zero of=/var/log/test1.log bs=3M count=1
[root@log-server ~]# logrotate /etc/logrotate.d/test1
[root@log-server ~]# ls -lh /var/log/test1*
-rw-r----- 1 syslog adm     0 Jul  5 23:16 /var/log/test1.log
-rw-r----- 1 syslog adm  3.0M Jul  5 23:03 /var/log/test1.log.1 #最新的转储
-rw-r--r-- 1 root   root 2.1K Jul  5 21:05 /var/log/test1.log.2.gz #前一个被转储的日志被压缩

#查看日志文件,转储成功后命令被执行
[root@log-server ~]# cat /tmp/test1.log 
2023-08-05_22:58:11
2023-08-05_23:16:12

#调用主配置文件进行转储,主配置文件中包含了 test1 test2 配置,所以都会被转储
[root@log-server ~]# logrotate /etc/logrotate.conf

#test1 没有达到转储条件
[root@log-server ~]# ls -lh /var/log/test1*
-rw-r----- 1 syslog adm     0 Jul  5 23:16 /var/log/test1.log
-rw-r----- 1 syslog adm  3.0M Jul  5 23:03 /var/log/test1.log.1
-rw-r--r-- 1 root   root 2.1K Jul  5 21:05 /var/log/test1.log.2.gz
#test2 达到条件,且有日期后缀
[root@log-server ~]# ls -lh /var/log/test2*
-rw-r--r-- 1 root root    0 Jul  5 23:26 /var/log/test2.log
-rw-r--r-- 1 root root 2.0M Jul  4 17:52 /var/log/test2.log-20230705

标签:服务,log,管理,--,rsyslog,var,日志,root
From: https://blog.csdn.net/qq_59349464/article/details/141996013

相关文章

  • 时间同步服务
    多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协议,日志,集群等。利用NTP(NetworkTimeProtocol)协议使网络中的各个计算机时间达到同步。目前NTP协议属于运维基础架构中必备的基本服务之一。主流的时间同步有两种实现方案ntpntp是......
  • PHP代码是如何在服务器上执行的?
    PHP代码在服务器上执行的过程可以总结如下:用户请求:当用户在浏览器地址栏输入要访问的PHP页面文件名并回车,这会触发一个Web请求,并将请求传送到支持PHP的Web服务器(如Apache、IIS或Nginx)。服务器接收请求:Web服务器接收到这个请求后,根据其后缀名识别出这是一个PHP文件,并将其传......
  • 2025年25届最新:如何打造Java SpringBoot个人健康档案管理系统,集成Vue,实现高效信息管理
    ✍✍计算机毕业编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、微信小程序、大数据实战项目集⚡⚡......
  • 基于SpringBoot+Vue+uniapp的医院住院综合服务管理系统设计与开发+vue的详细设计和实
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • C语言之动态内存管理、柔性数组
    目录前言一、为什么要有动态内存分配二、常用函数(都声明在stdlib.h头文件中)三、常见的动态内存的错误四、柔性数组总结前言    本文讲述C语言动态内存管理的基础知识,另外包括柔性数组的基本知识。❤️感谢支持,点赞关注不迷路❤️一、为什么要有动态......
  • Arch搭建Nas系统(3)之三:磁盘管理
    3.1数据磁盘分配说明3.1.1数据文件系统我的nas总共有7块硬盘,分配如下:a)1块M2固态硬盘:大小为1T,做Nas系统盘使用。b)6块SATA机械硬盘:每块大小为4T,5块做数据盘,1块做校验盘。为了方便使用,不碎片话,需要把5块磁盘整合然后挂到同一个目录下。因此使用联合文件系统mergerfs。a)......
  • java毕业设计-基于springboot+vue的大学生竞赛管理系统设计和实现,基于springboot的大
    博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业......
  • ubuntu 和windows用samba服务器实现数据传输
    1,linux安装samba服务器sudoapt-getinstallsambasamba-common2,linux配置权限,修改目录权限,linux下共享的文件权限设置。sudochmod777/home/lark-R3.添加samba用户 sudosmbpasswd-a lark4,配置共享目录打开/smb.conf在文件末尾添加如下信息: vim/et......
  • 基于SpringBoot和Vue的宿舍管理系统设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示论文参考具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我自己的网站([小蔡coding](https://xiaocaicoding.cn/))代码参考数据库参考源码获取前言......
  • 优爱酷爱图图像管理系统是专业的批量图像处理工具,支持无缝拼接、全景图像融合、滚动长
    优爱酷爱图图像管理系统是专业的批量图像处理工具,支持无缝拼接、全景图像融合、滚动长截图、自动拖拽截图、AI智能扩图、照片图像裁剪、纠偏漂白、证照换色、去水印、底片翻新、黑白上色,黑白彩色漂白等 >>视频介绍:http://cloud.video.taobao.com/play/u/null/p/1/e/6/t/......