日志服务管理

rsyslog是CentOS 6 以后版本的系统日志管理服务

https://www.rsyslog.com/

rsyslog 特性

Rsyslog 管理

系统日志术语

facility:设施,从功能或程序上对日志进行归类
#内置分类
auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth), 
user(default), uucp, syslog
#自定义的分类
local0-local7
Priority 优先级别,从低到高排序
debug,info, notice, warn(warning), err(error), crit(critical), alert, 
emerg(panic)

参看帮助: man 3 syslog,man logger

rsyslog 相关文件

rsyslog配置文件

/etc/rsyslog.conf 配置文件格式:由三部分组成

RULES配置格式:

facility.priority; facility.priority… target

facility格式:

*     #所有的facility  
facility1,facility2,facility3,...         #指定的facility列表

priority格式:

*: 所有级别
none:没有级别,即不记录
PRIORITY:指定级别(含)以上的所有级别
=PRIORITY:仅记录指定级别的日志信息

target格式:

文件路径:通常在/var/log/,文件路径前的-表示异步写入
用户:将日志事件通知给指定的用户,* 表示登录的所有用户
日志服务器:@host,把日志送往至指定的远程UDP日志服务器 @@host 将日志发送到远程TCP日志服务器
管道: | COMMAND,转发给其它命令处理

通常的日志文件的格式:
事件产生的日期时间 主机 进程(pid):事件内容

启用高精度时间

ubuntu,注释掉以下行
vim /etc/rsyslog.conf
# To enable high precision timestamps, comment out the following line.
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

红帽,注释掉以下行
vim /etc/rsyslog.conf
# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")

然后重启 systemctl restart rsyslog.service
logger "手动测试日志消息"
logger -p local0.info "手动测试日志消息"

自定义某些服务的日志输入位置

首先,这些服务,默认日志输出管理使用的是rsyslog,他们的日志是交由rsyslog管理的才行,否则,可能需要其他方法,才能将日志交由rsyslog管理

比如: sshd 日志服务是交由rsyslog 管理的
只需要到sshd 配置文件, 将log 位置修改为向那个设施写入
然后在 rsyslog 配置文件中,指明 这个设施 是针对那个日志文件
然后重启 rsyslog, sshd 就可以指定sshd日志写入那个日志文件中

logger -p local0.info "手动测试日志消息"

启用rsyslog的网络日志功能

rsyslog 是可以把本机日志,输出到一个目标机器上, 这个目标机器上的rsyslog会接受这些日志,并存储

启用接受网络日志
ubuntu22,rocky8,将指定的配置文件注释打开,可以启用udp或者tcp

 # provides UDP syslog reception
 #module(load="imudp")
 #input(type="imudp" port="514")
   
 # provides TCP syslog reception
 #module(load="imtcp")
 #input(type="imtcp" port="514")

centos6 或者7 配置文件不一样,详情见对应的配置文件,按照配置文件说明打开对应注释

客户端,发送日志
#在客户端指定将日志发送到远程的TCP、UDP的日志服务器
*.info;mail.none;authpriv.none;cron.none               @@10.0.0.18:514  #TCP
*.info;mail.none;authpriv.none;cron.none               @10.0.0.18:514   #UDP


服务端接收到日志,默认红帽会存储在 /var/log/messages
ubuntu 会存储在 /var/log/syslog


当然,也可以在服务端指定,这些远程过来的日志存储在什么位置
module(load="imtcp")  # 加载 TCP 模块
input(type="imtcp" port="514")  # 监听 514 端口

template(name="HostSpecificLog" type="string"  string="/var/log/%HOSTNAME%/%PROGRAMNAME%.log")

if $fromhost-ip != '127.0.0.1' then action(type="omfile"  dynaFile="HostSpecificLog")


logger "手动测试消息"
logger -p 设施.级别  "消息内容"

常见日志文件

日志管理工具 journalctl

CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用 journalctl一个命令,查看所有日志(内核日志和应用日志)

范例

#查看所有日志(默认情况下 ,从 Linux 系统最后一次启动到当前时刻的整个时间段。
#在这段时间里,systemd 和它的日志组件 journald 收集和记录所有的系统和服务日志。本次启动之前的日志,都会丢失,因为默认不会存盘)
 journalctl
#查看内核日志(不显示应用日志)
 journalctl -k -f # -f 可以持续观察内核消息
#查看系统本次启动的日志
 journalctl -b
 journalctl -b -0
#查看上一次启动的日志(需更改设置)
 journalctl -b -1
#查看指定时间的日志
 journalctl --since="2017-10-30 18:10:30"
 journalctl --since "20 min ago"
 journalctl --since yesterday
 journalctl --since "2017-01-10" --until "2017-01-11 03:00"
 journalctl --since 09:00 --until "1 hour ago"
#显示尾部的最新10行日志
 journalctl -n
 #显示尾部指定行数的日志
 journalctl -n 20
#实时滚动显示最新日志
 journalctl -f
#查看指定服务的日志
 journalctl /usr/lib/systemd/systemd
#查看指定进程的日志
 journalctl _PID=1
#查看某个路径的脚本的日志
 journalctl /usr/bin/bash
#查看指定用户的日志
 journalctl _UID=33 --since today
#查看某个 Unit 的日志
 journalctl -u nginx.service
 journalctl -u nginx.service --since today
#实时滚动显示某个 Unit 的最新日志
 journalctl -u nginx.service -f
#合并显示多个 Unit 的日志
 journalctl -u nginx.service -u php-fpm.service --since today
#查看指定优先级(及其以上级别)的日志,共有8级
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
 journalctl -p err -b
#日志默认分页输出,--no-pager 改为正常的标准输出
 journalctl --no-pager
#日志管理journalctl
#以 JSON 格式(单行)输出
 journalctl -b -u nginx.service -o json
#以 JSON 格式(多行)输出,可读性更好
 journalctl -b -u nginx.service -o json-pretty
#显示日志占据的硬盘空间
 journalctl --disk-usage
#指定日志文件占据的最大空间
 journalctl --vacuum-size=1G
#指定日志文件保存多久
 journalctl --vacuum-time=1years

利用MySQL存储日志信息

客户端配置
apt -y install rsyslog-mysql
这个rsyslog-mysql 包里面带有sql 脚本,可以用户创建对应的表和库,Ubuntu默认不会创建库,centos上带的脚本会创建库
rpm -ql rsyslog-mysql
dpkg -L rsyslog-mysql #查看对应包内容
mysql -usyslog -p123456 -h10.0.0.3 <  /usr/share/doc/rsyslog/mysql-createDB.sql

配置日志服务器将日志发送至指定数据库
vim /etc/rsyslog.conf
#在 MODULES 语言下面,如果是 Ubuntu22.04,20.04和CentOS8 加下面行
module(load="ommysql")
#在 MODULES 语言下面,如果是 CentOS 7,6 加下面行
$ModLoad ommysql 
#在RULES语句块加下面行的格式
#facility.priority   :ommysql:DBHOST,DBNAME,DBUSER, PASSWORD 
*.info :ommysql:10.0.0.18,Syslog,rsyslog,123456
systemctl restart rsyslog.service


其实ubuntu会自动生成rsyslog配置文件,在安装完rsyslog-mysql 之后
cat /etc/rsyslog.d/mysql.conf
module (load="ommysql")
*.* action(type="ommysql" server="10.0.0.18" db="Syslog" uid="rsyslog"pwd="123456")


服务器上配置
yum -y install mysql-server

配置 客户端连接用的账号和密码以及授权
mysql>
create user syslog@'10.0.0.%' identified by '123456';
grant all on syslog.* to syslog@'10.0.0.%' 或者 授权所有库 grant all on *.* to syslog@'10.0.0.%'


logger -p 设施.级别  "消息内容"

Logrotate 日志转储

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

相关文件

logrotate 修改完配置文件,不用重启服务,因为logrotate服务不是一直运行的,只有到定时时间,才会启动服务进行日志转储

配置文件主要参数

配置参数                        说明
compress                        通过gzip压缩转储以后的日志
nocompress                      不压缩
copytruncate                    用于还在打开中的日志文件,把当前日志备份并截断,对于哪些没法在运行中重新打开日志文件的服务,需要这个
nocopytruncate                  备份日志文件但是不截断
create mode owner group         转储文件,使用指定的权限,所有者,所属组创建新的日志文件
nocreate                        不建立新的日志文件
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脚本,日志文件
                            的绝对路径作为第一个参数传递给脚本。 这意味着单个脚本可以针对
                            与多个文件匹配的日志文件条目多次运行(例
                            如/var/log/example/*.log)。 如果指定此项sharedscripts,则无
                            论有多少个日志与通配符模式匹配,脚本都只会运行一次
nosharedscripts             针对每一个转储的日志文件,都执行一次prerotate 和 postrotate脚本,此为默认值

missingok                   如果日志不存在,不提示错误,继续处理下一个
nomissingok                 如果日志不存在,提示错误,此为默认值

范例

cat /etc/logrotate.d/nginx 
/var/log/nginx/*.log {
   daily
   rotate 100
   missingok
   compress
   delaycompress
   notifempty
   create 644 ngnix nginx
   postrotate
      if [ -f /app/nginx/logs/nginx.pid ]; then
          kill -USR1 `cat /app/nginx/logs/nginx.pid`
      fi
   endscript
}

日志转储注意

dateext  #打开这个配置,日志转储后缀以日期保存
dateformat -%Y%m%d-%s  #这个后缀,自定义日期格式,精确到秒

 logrotate -d /etc/logrotate.conf  #手动运行 logrotate 命令来测试新的配置,使用 -d(debug)选项来模拟轮转过程,查看将要发生的操作,但实际上不执行这些操作:
 logrotate -f /etc/logrotate.conf  #实际执行日志轮转(而不是只是模拟)



 手动转储,没到指定大小,是不会转储的