ck918

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

日志管理

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   # 前一个被转储的日志被压缩

posted on   0918  阅读(184)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示