Linux 日志服务管理
日志管理
1 系统日志管理
1 rsyslog系统日志服务
日志记录的内容包括: 历史事件:时间,地点,人物,事件
Jul 18 14:30:53 # 时间
ubuntu2204 # 地点 (在哪个主机上面)
systemd[1207]: # 人物 (哪个服务)
Reached target Main User Target. # 日志内容
日志级别:事件的关键性程度,Loglevel
rsyslog 是 CentOS6 以后的版本中使用的日志管理程序,是一个默认安装的服务,并且默认开机启动。
rsyslog会默认安装
[root@rocky8 ~]# rpm -q rsyslog
rsyslog-8.2102.0-7.el8.x86_64
[root@ubuntu2204 ~]#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
1.1 ELK 日志管理
rsyslog 日志服务与 ELK 日志服务的区别: rsyslog 主要用于单机日志管理,ELK 主要用于分布式集群环境中的日志管理。
2 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在新版中被弃,不建议使用
3 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 #库文件
# 在主配置文件中,将配置分为三个部份,分别是模块(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 中,分类和优先级都可以有多个,用逗号分隔
- 基于日志内容中的指定字段来过滤
- 基于表达式构建脚本来过滤
处理动作有以下几种:
- 输出到日志文件或某个特定设备
- 保存到数据库
- 发送给指定用户,该用户必须己登录,可以同时指定多个用户,用逗号分隔
- 传送到远程主机
- 通过管道传送给其它命令
- 丢弃日志,不处理
# * 所有 priority
# none 没有任何 priority,即不记录
# priority 具体的 priority,处理指定级别和指定级别以上的所有级别日志
# *priority 所有priority,处理指定级别和指定级别以上的所有级别日志
# =priority 仅处理指定级别日志
# *=priority 所有处理指定级别日志
# !priority 排除指定的 priority,这种写法不能单独使用
# action-输出到日志文件或设备
# /path/file 将日志内容写到指定文件
# -/path/file 将日志内容写到指定文件,异步写入
# /dev/null 将日志内容输出到指定设备
异步写入(Asynchronous Writing)是一种数据写入处理方式,它将写入操作交给后台任务或其他线程来处理,而不会阻塞当前线程或进程的执行。异步写入可以提高程序的性能和响应性,并确保数据的一致性。
在传统的同步写入(Synchronous Writing)中,写入操作会阻塞当前线程,直到数据写入完成。这在某些情况下可能会导致性能瓶颈,尤其是在对存储介质进行大量写入时。
相比之下,异步写入将写入操作放入后台进行,当前线程可以继续执行其他任务。这可以提高程序的并发性和吞吐量。异步写入通常涉及使用缓冲区或队列来存储待写入的数据,而后台任务会周期性或基于特定条件来处理这些数据,并将其写入目标位置。
异步写入的一个重要概念是"写入完成通知",即在后台任务完成写入操作后通知相关线程或进程。这可以通过回调函数、事件或其他机制来实现。
值得注意的是,虽然异步写入可以提高性能,但也需要考虑一些问题,比如数据一致性、错误处理和内存管理等。因此,在实现异步写入时需要权衡考虑这些因素,并采用适当的机制来处理。
#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] "使用 UPD 协议发送到远程主机(IPV6地址),启用zlib压缩,压缩级别为6
# 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.log中
*.*;auth,authpriv.none -/var/log/syslog
"在这个规则中,*.* 表示所有设备(facility)和所有日志级别(priority)的日志消息都将匹配到这条规则。
"; 表示之后是要应用的过滤条件。"
"auth,authpriv.none 表示 auth 和 authpriv 设备的日志消息不会匹配到这条规则,
"们将被排除在外。
"而 none 则表示不使用任何特定的日志级别过滤条件。
"所以这条配置规则的意思是,除了 auth 和 authpriv 设备之外的所有设备的所有日志消息都会被发送并进行处理。
#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
日志内容和模板
rocky中的日志内容
[16:25:32 root@rocky86[ ~]#tail /var/log/messages
Jul 18 17:31:48 rocky86 NetworkManager[971]: <info> [1689672708.4541] dhcp4 (eth0): state changed new lease, address=10.0.0.153
Jul 18 17:31:48 rocky86 dbus-daemon[963]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service' requested by ':1.9' (uid=0 pid=971 comm="/usr/sbin/NetworkManager --no-daemon ")
Jul 18 17:31:48 rocky86 systemd[1]: Starting Network Manager Script Dispatcher Service...
Jul 18 17:31:48 rocky86 dbus-daemon[963]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Jul 18 17:31:48 rocky86 systemd[1]: Started Network Manager Script Dispatcher Service.
Jul 18 17:31:58 rocky86 systemd[1]: NetworkManager-dispatcher.service: Succeeded.
Jul 18 17:39:29 rocky86 systemd[1]: Starting dnf makecache...
Jul 18 17:39:29 rocky86 dnf[2515]: Metadata cache refreshed recently.
Jul 18 17:39:29 rocky86 systemd[1]: dnf-makecache.service: Succeeded.
Jul 18 17:39:29 rocky86 systemd[1]: Started dnf makecache.
ubuntu中的日志内容
[root@ubuntu2204 ~]#tail /var/log/syslog
Jul 18 17:31:44 ubuntu2204 systemd-networkd[848]: eth0: DHCPv6 lease lost
Jul 18 17:31:44 ubuntu2204 systemd-timesyncd[683]: No network connectivity, watching for changes.
Jul 18 17:31:50 ubuntu2204 kernel: [11072.020378] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Jul 18 17:31:50 ubuntu2204 systemd-networkd[848]: eth0: Gained carrier
Jul 18 17:31:50 ubuntu2204 systemd-timesyncd[683]: Network configuration changed, trying to establish connection.
Jul 18 17:31:50 ubuntu2204 systemd-networkd[848]: eth0: DHCPv4 address 10.0.0.150/24 via 10.0.0.2
Jul 18 17:31:50 ubuntu2204 systemd-timesyncd[683]: Network configuration changed, trying to establish connection.
Jul 18 17:31:50 ubuntu2204 systemd-resolved[850]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 10.0.0.2.
Jul 18 17:31:51 ubuntu2204 systemd-timesyncd[683]: Initial synchronization to time server 91.189.94.4:123 (ntp.ubuntu.com).
Jul 18 17:35:02 ubuntu2204 CRON[2306]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
4 日志说明 及 相关工具
rocky中常见日志说明
[17:40:52 root@rocky86[ ~]#cat /etc/rsyslog.conf | grep -Ev '^#|^$'
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
StateFile="imjournal.state") # File to store the position in the journal
global(workDirectory="/var/lib/rsyslog")
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
include(file="/etc/rsyslog.d/*.conf" mode="optional")
*.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@ubuntu2204 ~]#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.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发给所有登录用户
日志文件 | 相关命令 | 备注 |
---|---|---|
/var/log/btmp | lastb | 当前系统上,用户的失败尝试登录相关的日志 ( bad logins ),二 进制格式 |
/var/log/lastlog | lastlog | 每一个用户最近一次的登录信息,二进制格式 |
/var/log/wtmp | last | 当前系统上,用户正常登录系统的相关日志信息 ( who was logged in ),二进制格式 |
#在 rocky 中查看
[root@rocky ~]# ll /var/log/{btmp,lastlog,wtmp}
-rw------- 1 root utmp 0 May 3 14:45 /var/log/btmp
-rw-rw-r--. 1 root utmp 295212 May 3 13:59 /var/log/lastlog
-rw-rw-r--. 1 root utmp 496896 May 3 13:59 /var/log/wtmp
[root@rocky ~]# file /var/log/{btmp,lastlog,wtmp}
/var/log/btmp: empty
/var/log/lastlog: data
/var/log/wtmp: firmware 0 v0 (revision 0) V2, 0 bytes or less, UNKNOWN2
0x6c382e78, at 0x0 0 bytes , at 0x0 0 bytes
#在 ubuntu 中查看
[root@ubuntu ~]# ll /var/log/{btmp,lastlog,wtmp}
-rw-rw---- 1 root utmp 0 May 1 12:44 /var/log/btmp
-rw-rw-r-- 1 root utmp 292292 May 3 06:00 /var/log/lastlog
-rw-rw-r-- 1 root utmp 17664 May 3 06:00 /var/log/wtmp
[root@ubuntu ~]# file /var/log/{btmp,lastlog,wtmp}
/var/log/btmp: empty
/var/log/lastlog: data
/var/log/wtmp: data
last -x # 显示系统关机项和运行级别更改
[root@ubuntu2204 ~]#last -x
root pts/0 10.0.0.1 Tue Jul 18 14:30 still logged in
runlevel (to lvl 5) 5.15.0-76-generi Tue Jul 18 14:27 still running
reboot system boot 5.15.0-76-generi Tue Jul 18 14:27 still running
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@ubuntu ~]# logger "this is test msg"
root@ubuntu2204:~# tail -n 1 /var/log/syslog
May 3 07:07:08 ubuntu2204 root: this is test msg
[root@ubuntu ~]# cat test.txt
this msg from test.txt
#从文件中读取,指定tag,指定优先级
[root@ubuntu ~]# logger -t test -f test.txt -p error
[root@ubuntu ~]# tail -n 1 /var/log/syslog
May 4 14:09:53 ubuntu test: this msg from test.txt
5 在本机中自定义服务日志
# sshd服务默认是归属于AUTH 分类,默认级别是 INFO
[root@ubuntu2204 ~]#vim /etc/ssh/sshd_config
# 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@ubuntu2204 ~]#tail -f /var/log/auth.log
Jul 18 19:05:01 ubuntu2204 CRON[2564]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Jul 18 19:05:01 ubuntu2204 CRON[2564]: pam_unix(cron:session): session closed for user root
Jul 18 19:15:01 ubuntu2204 CRON[2579]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Jul 18 19:15:01 ubuntu2204 CRON[2579]: pam_unix(cron:session): session closed for user root
Jul 18 19:17:01 ubuntu2204 CRON[2582]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Jul 18 19:17:01 ubuntu2204 CRON[2582]: pam_unix(cron:session): session closed for user root
Jul 18 19:18:52 ubuntu2204 sshd[931]: Received signal 15; terminating.
Jul 18 19:18:53 ubuntu2204 sshd[2590]: Server listening on 0.0.0.0 port 22.
Jul 18 19:18:53 ubuntu2204 sshd[2590]: Server listening on :: port 22.
Jul 18 19:18:54 ubuntu2204 sshd[2590]: Received signal 15; terminating.
.
#修改 sshd 服务日志的配置项,分类改到 LOCAL6,级别不改
[root@ubuntu2204 ~]#vim /etc/ssh/sshd_config
# Logging
#SyslogFacility AUTH
#LogLevel INFO
SyslogFacility LOCAL6
#新增配置文件,local6 分类的日志都写到 sshd.log 文件中
[root@ubuntu2204 ~]#vim /etc/rsyslog.d/sshd.conf
local6.* /var/log/sshd.log
#查看还没此日志文件
[root@ubuntu2204 ~]#ll /var/log/sshd.log
ls: cannot access '/var/log/sshd.log': No such file or directory
# 重启服务
[root@ubuntu2204 ~]#systemctl restart rsyslog
[root@ubuntu2204 ~]#systemctl restart sshd
# 再次查看
[root@ubuntu2204 ~]#ll /var/log/sshd.log
-rw-r----- 1 syslog adm 147 Jul 18 19:29 /var/log/sshd.log
# 测试
[root@ubuntu2204 ~]#ssh 127.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:ukriQdQqMD2eCwtwBcNiGPc3pM+FTeEhc3Jhq28/F4Y.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
# 查看日志
[root@ubuntu2204 ~]#tail /var/log/sshd.log
Jul 18 19:29:36 ubuntu2204 sshd[2704]: Server listening on 0.0.0.0 port 22.
Jul 18 19:29:36 ubuntu2204 sshd[2704]: Server listening on :: port 22.
Jul 18 19:29:55 ubuntu2204 sshd[2707]: Connection closed by 127.0.0.1 port 47752 [preauth]
# 测试
[root@ubuntu2204 ~]#logger -p local6.info "hello sshd"
# 查看日志
[root@ubuntu2204 ~]#tail -l /var/log/sshd.log
Jul 18 19:29:36 ubuntu2204 sshd[2704]: Server listening on 0.0.0.0 port 22.
Jul 18 19:29:36 ubuntu2204 sshd[2704]: Server listening on :: port 22.
Jul 18 19:29:55 ubuntu2204 sshd[2707]: Connection closed by 127.0.0.1 port 47752 [preauth]
Jul 18 19:33:36 ubuntu2204 root: hello sshd # 系统默认自动去重
6 使用日志网络转发
主机清单
主机ip | 操作系统 | 角色 |
---|---|---|
10.0.0.150 | ubuntu | client-1 |
10.0.0.159 | rocky | client-2 |
10.0.0.153 | rocky | log-server |
配置 client-1主机日志远程转发
# 修改主机名
[root@ubuntu2204 ~]#hostnamectl set-hostname client-1
# 重启服务
[17:30:38 root@rocky86[ ~]#systemctl restart rsyslog
# 修改10.0.0.153主机上配置文件 把udp tcp放行
[17:25:03 root@rocky86[ ~]#vim /etc/rsyslog.conf
# 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")
# 重启服务
[17:30:38 root@rocky86[ ~]#systemctl restart rsyslog
# 查看端口 已经放出
[17:31:16 root@rocky86[ ~]#ss -tunlp | grep 514
udp UNCONN 0 0 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",pid=2395,fd=4)) # ipv4
udp UNCONN 0 0 [::]:514 [::]:* users:(("rsyslogd",pid=2395,fd=5)) # ipv6
tcp LISTEN 0 25 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",pid=2395,fd=6))
tcp LISTEN 0 25 [::]:514 [::]:* users:(("rsyslogd",pid=2395,fd=7))
# 添加配置文件 client-1
[root@client-1 ~]#ls /etc/rsyslog.
rsyslog.conf rsyslog.d/ # 两个文件内都可以添加 rsyslog.conf是主配置文件 rsyslog.d 是空的
#配置远程转发,转发到10.0.0.153的udp协议514端口
[root@client-1 ~]#vim /etc/rsyslog.d/net.conf
*.info @10.0.0.153:514 #默认是514 此处可以成略不写 ip地址是转发主机的 log-server
#重启服务
[root@client-1 ~]#systemctl restart rsyslog
# 测试
[root@client-1 ~]#logger "this msg from client-1"
# 在 log-server主机查看 已经收到
[19:00:53 root@rocky86[ log]#cat /var/log/messages | grep client-1
Jul 19 18:57:17 client-1 systemd[1]: Stopping System Logging Service...
Jul 19 18:57:17 client-1 rsyslogd: [origin software="rsyslogd" swVersion="8.2112.0" x-pid="2051" x-info="https://www.rsyslog.com"] exiting on signal 15.
Jul 19 18:57:17 client-1 systemd[1]: rsyslog.service: Deactivated successfully.
Jul 19 18:57:17 client-1 systemd[1]: Stopped System Logging Service.
Jul 19 18:57:17 client-1 systemd[1]: Starting System Logging Service...
Jul 19 18:57:32 client-1 systemd[1]: Started System Logging Service.
Jul 19 18:57:32 client-1 rsyslogd: imuxsock: Acquired UNIX socket '/run/systemd/journal/syslog' (fd 3) from systemd. [v8.2112.0]
Jul 19 18:57:32 client-1 rsyslogd: rsyslogd's groupid changed to 113
Jul 19 18:57:32 client-1 rsyslogd: rsyslogd's userid changed to 107
Jul 19 18:57:32 client-1 rsyslogd: [origin software="rsyslogd" swVersion="8.2112.0" x-pid="2060" x-info="https://www.rsyslog.com"] start
Jul 19 18:57:34 client-1 root: this msg from client-1
# client-1 主机上也有该日志
[root@client-1 ~]#cat /var/log/syslog | grep client-1
Jul 19 18:57:32 client-1 rsyslogd: imuxsock: Acquired UNIX socket '/run/systemd/journal/syslog' (fd 3) from systemd. [v8.2112.0]
Jul 19 18:57:32 client-1 rsyslogd: rsyslogd's groupid changed to 113
Jul 19 18:57:32 client-1 rsyslogd: rsyslogd's userid changed to 107
Jul 19 18:57:32 client-1 rsyslogd: [origin software="rsyslogd" swVersion="8.2112.0" x-pid="2060" x-info="https://www.rsyslog.com"] start
Jul 19 18:57:34 client-1 root: this msg from client-1
配置client-2主机日志远程转发
# 修改主机名
[root@rocky8 ~]# hostnamectl set-hostname client-2
#配置远程转发,转发到10.0.0.153的tcp协议514端口
[root@client-2 etc]# vim /etc/rsyslog.d/net.conf
*.info @@10.0.0.153:514
# 测 试
[root@client-2 etc]# logger "this msg from client-2"
# 重启服务
[root@client-2 ~]# systemctl restart rsyslog
# 在本机查看
[root@client-2 etc]# tail -l /var/log/messages
Jul 19 19:14:05 client-2 systemd[1]: Stopping System Logging Service...
Jul 19 19:14:05 client-2 rsyslogd[3979]: [origin software="rsyslogd" swVersion="8.2102.0-7.el8" x-pid="3979" x-info="https://www.rsyslog.com"] exiting on signal 15.
Jul 19 19:14:05 client-2 systemd[1]: rsyslog.service: Succeeded.
Jul 19 19:14:05 client-2 systemd[1]: Stopped System Logging Service.
Jul 19 19:14:05 client-2 systemd[1]: Starting System Logging Service...
Jul 19 19:14:07 client-2 NetworkManager[1193]: <info> [1689765247.6845] dhcp4 (eth0): state changed new lease, address=10.0.0.159
Jul 19 19:14:31 client-2 rsyslogd[4033]: [origin software="rsyslogd" swVersion="8.2102.0-7.el8" x-pid="4033" x-info="https://www.rsyslog.com"] start
Jul 19 19:14:31 client-2 systemd[1]: Started System Logging Service.
Jul 19 19:14:31 client-2 rsyslogd[4033]: imjournal: journal files changed, reloading... [v8.2102.0-7.el8 try https://www.rsyslog.com/e/0 ]
Jul 19 19:14:51 client-2 root[4051]: this msg from client-2
# 在log-server查看
[20:07:38 root@rocky86[ ~]#tail -f /var/log/messages
Jul 19 20:12:21 localhost root[4932]: this msg from client-2fddfsfdsfddffdfdfddfs
Jul 19 20:13:59 rocky86 NetworkManager[977]: <info> [1689768839.8500] dhcp4 (eth0): state changed new lease, address=10.0.0.153
Jul 19 20:14:06 rocky8 NetworkManager[1171]: <info> [1689768846.0514] dhcp4 (eth0): state changed new lease, address=10.0.0.157
Jul 19 20:14:07 localhost NetworkManager[1193]: <info> [1689768847.6874] dhcp4 (eth0): state changed new lease, address=10.0.0.159
Jul 19 20:14:21 localhost root[4953]: this msg from client-2
使用MySQL 数据库转储日志
任务:将client-2和client-3的日志打到log-server,然后mysql-server存储三台主机的日志文件
主机ip | 操作系统 | 角色 |
---|---|---|
10.0.0.159 | rocky | client-2 |
10.0.0.153 | rocky | client-3 |
10.0.0.150 | ubuntu | log-server |
10.0.0.162 | ubuntu | mysql-server |
# 在 log-server 上安装 rsyslog 的 mysql 包
[09:15:31 root@rocky86[ ~]#apt install rsyslog-mysql
# 查看包文件
[root@log-server rsyslog.d]#dpkg -L rsyslog-mysql
/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/rsyslog
/usr/lib/x86_64-linux-gnu/rsyslog/ommysql.so
/usr/share
/usr/share/dbconfig-common
/usr/share/dbconfig-common/data
/usr/share/dbconfig-common/data/rsyslog-mysql
/usr/share/dbconfig-common/data/rsyslog-mysql/install
/usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql
/usr/share/doc
/usr/share/doc/rsyslog-mysql
/usr/share/doc/rsyslog-mysql/copyright
/usr/share/rsyslog-mysql
/usr/share/rsyslog-mysql/rsyslog-mysql.conf.template
/usr/share/doc/rsyslog-mysql/NEWS.Debian.gz
/usr/share/doc/rsyslog-mysql/changelog.Debian.gz
# ubuntu中查看文件 并复制文件导入数据库
[root@log-server rsyslog.d]#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
);
# 在mysql-server主机上进入数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
# 创建数据库
mysql> create database rsyslog;
# 查看数据库为空
mysql> use rsyslog;
Database changed
# 接上一步导入SQL表格数据
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
-> );
text NULL
);
Query OK, 0 rows affected (0.02 sec)
mysql>
mysql> 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
-> );
Query OK, 0 rows affected (0.02 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.02 sec)
#
mysql> select count(*) from SystemEventsPriperties;
ERROR 1146 (42S02): Table 'rsyslog.SystemEventsPriperties' doesn't exist
mysql> select count(*) from SystemEventsProperties;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
# 创建一个名为 “rsysloger” 的用户,并允许该用户从以 “10.0.0.” 开头的任何 IP 地址连接到 MySQL 数据库,并设置密码为 “123456”
mysql> create user 'rsysloger'@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
# 将 rsyslog 数据库的所有权限授予名为 “rsysloger” 的用户,并允许该用户从以 “10.0.0.” 开头的任何 IP 地址连接
mysql> grant all on rsyslog.* to 'rsysloger'@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
#刷新 MySQL 的权限缓存,以确保最新的权限更改立即生效
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
# log-server 修改配置文件
[root@log-server ~]#cd /etc/rsyslog.d/
[root@log-server rsyslog.d]#ls
20-ufw.conf 21-cloudinit.conf 50-default.conf mysql.conf
[root@log-server rsyslog.d]#vim mysql.conf
module (load="ommysql")
*.* action(type="ommysql" server="10.0.0.162" db="rsyslog" uid="rsysloger" pwd="123456")
#重启服务
[root@log-server rsyslog.d]#systemctl restart rsyslog.service
# 测试
[14:18:56 root@client-3[ ~]#logger "this msg from client-3"
[root@client-2 ~]# logger "this msg from client-2"
[root@log-server rsyslog.d]#logger "this msg from log-server"
# 查看数据库
mysql> select FromHost,Message from SystemEvents order by id desc limit 3 ;
+------------+---------------------------+
| FromHost | Message |
+------------+---------------------------+
| client-3 | this msg from client-3 |
| localhost | this msg from client-2 |
| log-server | this msg from log-server |
+------------+---------------------------+
3 rows in set (0.00 sec)
7 服务日志管理工具 journalctl
# 配置文件
cat /etc/systemd/journald.conf
#常用选项
--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@ubuntu:~# journalctl
journalctl的文件和其他日志文件是分开的 syslog中的日志删掉journalctl中还可以看到
查看日志文件元数据
root@ubuntu:~# journalctl --header
File path:
/var/log/journal/72f41ddc79b44308a161708e65544943/system@5a33791df54d481eb96a84b
38148309b-0000000000002a18-0005fb3b4880407f.journal
File ID: 86c70c45ed5d4ee48a2f6826cd2a5844
Machine ID: 72f41ddc79b44308a161708e65544943
Boot ID: dc0f2b7aa8c745c2a3ad2098d2f3eb5a
Sequential number ID: 5a33791df54d481eb96a84b38148309b
State: ARCHIVED
Compatible flags:
Incompatible flags: COMPRESSED-ZSTD KEYED-HASH
Header size: 256
Arena size: 8388352
......
......
查看日志分类
#第一例为分类ID
root@ubuntu:~# 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@'.
1c0454c1bd2241e0ac6fefb4bc631433 systemd: systemd-udev-settle.service is deprecated.
1dee0369c7fc4736b7099b38ecb46ee7 systemd: Mount point is not empty
24d8d4452573402496068381a6312df2 systemd: A virtual machine or container has been started
3354939424b4456d9802ca8333ed424a systemd: Session @SESSION_ID@ has been terminated
36db2dfa5a9045e1bd4af5f93e1cf057 systemd: DNSSEC mode has been turned off, as server doesn't support it
39f53479d3a045ac8e11786248231fbf systemd: A start job for unit @UNIT@ has finished successfully
45f82f4aef7a4bbf942ce861d1f20990 systemd: Time zone change to @TIMEZONE@
4d4408cfd0d144859184d1e65d7c8a65 systemd: A DNSSEC trust anchor has been revoked
#显示指定分类信息
[root@log-server ~]# journalctl --list-catalog d9b373ed55a64feb8242e02dbe79a49c
d9b373ed55a64feb8242e02dbe79a49c systemd: Unit failed
#详细显示分类信息
root@ubuntu:~# journalctl --dump-catalog
-- 0027229ca0644181a76c4e92458afa2e
Subject: One or more messages could not be forwarded to syslog
Defined-By: systemd
Support: http://www.ubuntu.com/support
One or more messages could not be forwarded to the syslog service
running side-by-side with journald. This usually indicates that the
syslog implementation has not been able to keep up with the speed of
messages queued.
#详细显示指定分类信息
[root@log-server ~]# journalctl --dump-catalog d9b373ed55a64feb8242e02dbe79a49c
-- d9b373ed55a64feb8242e02dbe79a49c
Subject: Unit failed
Defined-By: systemd
Support: http://www.ubuntu.com/support
The unit @UNIT@ has entered the 'failed' state with result '@UNIT_RESULT@'.
日志跟随,显示最新日志
# journalctl -f
倒序显示
# journalctl -r
查看特定时间日志
#查看 2023-06-30 12:0:0 到 2023-06-30 15:30:0 之间产生的日志
[root@log-server ~]# journalctl -S "2023-06-30 12:0:0" -U "2023-06-30 15:30:0"
#查看昨天到当前的日志
[root@log-server ~]# journalctl -S yesterday
#查看今天9点到1小时之前的日志
[root@log-server ~]# journalctl --since 09:00 --until "1 hour ago"
查看启动信息
# journalctl --list-boots
#查看本次启动日志
[root@log-server ~]# journalctl -b 0
#查看上次启动日志
[root@log-server ~]# journalctl -b -1
[root@log-server ~]# journalctl -b a77f986ef80f409c8a60a0ddfd7623cd
查看内核日志
# 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查看
# journalctl _PID=1
根据UID查看
# 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-usage
Archived and active journals take up 344.0M in the file system.
多个参数
[root@log-server ~]# journalctl -b -u nginx.service -o json-pretty
8 Logrotate 日志转储
Logrotate 介绍
在 Linux 系统中,能够帮助使用者定位问题的有效手段之一就是查日志。
如果一个服务或一个程序的日志,一直只写一个文件,则会导致该日志文件越来越大,无论是查看还是 搜索内容,备份等,都会特别不方便,而且如果服务器数量较多,日志文件大小增长较快,也会很容易 触发告警。 为了解决这种情况,我们可以使用日志转储服务,对服务日志进行分割,按照一定的规则将日志保存在 不同的文件中,这样更便于管理和归档。
当前服务器上的日志转储
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@log-server ~]# man logrotate.conf
# 主配置文件
[root@log-server rsyslog.d]#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 # 默认是用anm组
# 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@log-server ~]#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
{ #上述所有日志文件都适用于此转储规则
rotate 4 #保留最近4个文件,加上当前使用的,一个5个
weekly #每周转储
missingok #如果要转储的日志文件不存在,不提示错误,继续下一个
notifempty #如果是空文件,不转储
compress #启用gzip压缩转储后的日志文件
delaycompress #和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
sharedscripts #运行脚本,分别是转储前和转储后脚本
postrotate #转储后脚本
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
root@jose-404:~# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1 # 让nginx 重新锚定新生成的日志文件(强刷)
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 命令
# 创建测试文件
[root@log-server ~]#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.00582667 s, 360 MB/s
# 定义转储规则
[root@log-server ~]#vim /etc/logrotate.d/test1
[root@log-server ~]#cat /etc/logrotate.d/test1
/var/log/test1.log {
daily
#每天转储一次
rotate 5
#保留5个
su root root
#属主属组是root
compress
#压缩
delaycompress
#转储的日志文件到下一次转储时才压缩
missingok
#如果日志不存在,不提示错误,继续处理下一个
size 1M
#超过1兆就压缩
notifempty
#如果是空文件的话,不转储
create 0640 syslog adm
#权限是640 属主属组是syslog adm
postrotate
#转储之后写一句话到下面的文件中
echo `date +%F_%T` >> /tmp/test1-rs.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 20 18:19 /var/log/test1.log # 文件为空 自动跳过不转储
-rw-r--r-- 1 root root 2.0M Jul 20 18:08 /var/log/test1.log.1
#再次添加测试文件
[root@log-server ~]#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.00946369 s, 332 MB/s
# 再次转储 添加文件后再次手动转储
[root@log-server ~]#logrotate /etc/logrotate.d/test1
[root@log-server ~]#ls -lh /var/log/test1*
-rw-r----- 1 syslog adm 0 Jul 20 18:20 /var/log/test1.log
-rw-r----- 1 syslog adm 3.0M Jul 20 18:20 /var/log/test1.log.1 # 最新的转储
-rw-r--r-- 1 root root 2.1K Jul 20 18:08 /var/log/test1.log.2.gz # 前一个被转储的日志被压缩
Linux 日志服务管理的更多相关文章
- Linux软件服务管理
学习该课程之前先学习linux的软件安装管理 1.linux的运行级别有下面几种类型 在后面的服务启动管理之中会被使用到 [root@weiyuan httpd-2.4.20]# runlevel N ...
- linux的服务管理(centos6和Centos7)和网络管理(网卡配置),计划服务cron
服务和网络 管理 init ifcfg ens33 1.服务: Linux系统中提供的功能,统称为服务,如:at服务.cron服务.web服务.FTP服务.sshd服务等. 服务是由已经在运行的进程 ...
- Linux之服务管理
一.计划任务 1) Crontab简介 1.Crontab是一个用于设置周期性被执行任务的工具: 2.被周期性执行的任务我们称为Cron Job: 3.周期性执行的任务列表我们称为Cron Table ...
- Linux-本地日志服务管理(rsyslog基础)
目录 系统环境 1.常见的两种日志管理服务 1.1 RSYSLOG系统日志服务 1.2 ELK 2.RSYSLOG日志服务的相关知识 2.1 RSYSLOG日志消息级别 2.2 RSYSLOG日志服务 ...
- Linux系列教程(二十三)——Linux的服务管理
前面我们讲解Linux软件包管理之源码包.脚本安装包时,我们介绍了rpm包和源码包由于安装位置的不同,会对服务的启动造成影响,具体是什么,本篇博客我们来详细介绍. 1.Linux服务管理总览 我们可以 ...
- Linux学习 -- 服务管理
1 服务分类 服务管理内容 启动 自启动 查询已安装的服务 RPM包安装的服务 自启动的 chkconfig --list 2345中如果是启用,代表下次开机会自启动 正在运行的服务 p ...
- linux(十四)之linux NFS服务管理
学到这里差不多就结束了linux的基础学习了,其实linux的内容并不难,我们要经常的反复的去操作它,多多和它去联络感情才能很好的掌握这个linux. 加油!今天是星期二.没有什么比努力让人更加热血沸 ...
- Linux命令-服务管理命令:chkconfig
chkconfig --list 查看服务自启动状态列表,等同于查看服务列表 设置某一个服务为自启动服务: chkconfig 服务名 on 修改服务的启动级别为3,,5 查看某一个服务时候已经运行了 ...
- Linux 独立服务管理
RPM包安装在默认位置 /etc/init.d/:启动脚本位置 /etc/sysconfig/:初始化环境配置文件位置 /etc/:配置文件位置 /etc/xinetd.conf/:xinetd配置文 ...
- Linux网络服务管理命令
netstat命令 示例:查看指定的服务是否开启netstat | grep ssh | grep -v grep 网络下载器————wget wget是一个Linux环境下用于从WWW上提取文件的工 ...
随机推荐
- 组织树查询-Jvava实现(递归)
1.首先查询出组织机构 就是一个简单的查询 List<Dept> deptList = mapper.getDeptList(); Map<Long, OrgNode> nod ...
- 28-PWA
const { resolve } = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin') ...
- 使用ServiceSelf解决.NET应用程序做服务的难题
1 ServiceSelf 为.NET 泛型主机的应用程序提供自安装为服务进程的能力,支持windows和linux平台. 功能 自我服务安装 自我服务卸载 自我服务日志监听 2 自我服务安装 虽然. ...
- Django简介 安装下载 app概念 主要目录介绍
目录 Django简介 前戏 Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,视图V和模版T.这套框架是以比利时的吉普赛爵士吉他手Django Re ...
- 目标检测(Object Detection)
文章目录 目标检测(Object Detection) 一.基本概念 1. 什么是目标检测 2. 目标检测的核心问题 3. 目标检测算法分类 1)Tow Stage 2)One Stage 4. 目标 ...
- 2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共进行m次操作,二狗每次操作选择一个数k,
2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共进行m次操作,二狗每次操作选择一个数k, ...
- Selenium - 浏览器配置(4) - 打开无痕浏览器
Selenium - 浏览器配置 无痕浏览器 开启谷歌浏览器的无痕浏览模式: from selenium import webdriver # 引入浏览器配置 chrome_options = web ...
- docker 部署 springboot项目和直接运行 jar 文件详细步骤
目前docker发布springboot有两种方式,一种是制作镜像,另一种是直接运行jar 文件 第一种使用镜像来部署 一.创建项目目录 [root@dex ~]# mkdir /opt/backst ...
- Python 列表、字典、元组的一些小技巧
1. 字典排序 我们知道 Python 的内置 dictionary 数据类型是无序的,通过 key 来获取对应的 value.可是有时我们需要对 dictionary 中的 item 进行排序输出, ...
- 翻译:REST 和 gRPC 详细比较
译者注:在微服务架构设计,构建API和服务间通信技术选型时,对 REST 和 gRPC 的理解和应用还存在知识盲区,近期看到国外的这篇文章:A detailed comparison of REST ...