rsyslog是CentOS 6 以后版本的系统日志管理服务
https://www.rsyslog.com/
rsyslog 特性
#内置分类
auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth),
user(default), uucp, syslog
#自定义的分类
local0-local7
debug,info, notice, warn(warning), err(error), crit(critical), alert,
emerg(panic)
参看帮助: man 3 syslog,man logger
CentOS 6:/etc/rc.d/init.d/rsyslog {start | stop | restart | status} |
/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会接受这些日志,并存储
启用接受网络日志
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 设施.级别 "消息内容"
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
客户端配置
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 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转 储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 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 #实际执行日志轮转(而不是只是模拟)
手动转储,没到指定大小,是不会转储的