日志服务管理
rsyslog系统日志服务管理
rsyslog 特性
- 支持输出日志到各种数据库,如 MySQL,PostgreSQL,MongoDB ElasticSearch,实现使用第三方服务对日志进行存储和分析;
- 精细的输出格式控制以及对日志内容的强大过滤能力,可实现过滤记录日志信息中的指定部份;
- 通过 RELP + TCP 实现数据的可靠传输
- 支持数据的加密和压缩传输等
- 多线程
系统日志相关概念
facility: 设施,从功能或程序上对日志进行归类
在一台主机上会同时运行多个服务和软件,每个服务或软件都有可能会产生大量的日志, syslog 将日志进行了分类,相同类型的日志放一个文件,这样便于管理。
#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 #不需要任何日志
syslog 服务组成
#查看所有 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 #库文件
rsyslog服务默认加开机启动
rsyslog 配置文件
配置分为三个部份,分别是模块(MODULES),全局配置(GLOBAL DIRECTIVES),日志记录规则配置(RULES)
cxn@ubuntu2:~$ ls /etc/rsyslog.conf
/etc/rsyslog.conf --MODULES --GLOBAL DIRECTIVES
cxn@ubuntu2:~$ ls /etc/rsyslog.d/
20-ufw.conf 21-cloudinit.conf 50-default.conf --RULES
target格式:
文件路径:通常在/var/log/,文件路径前的-表示异步写入
用户:将日志事件通知给指定的用户,* 表示登录的所有用户
日志服务器:@host,把日志送往至指定的远程UDP日志服务器 @@host 将日志发送到远程TCP日志服务器
管道: | COMMAND,转发给其它命令处理
实现自定义服务日志
sshd应用将日志写到rsyslog的local6分类,过滤所有级别,写入到/var/log/ssh.log。
#sshd服务日志默认是归属于 AUTH 分类,默认级别是 INFO;更改分类
root@ubuntu2:~# cat /etc/ssh/sshd_config |grep -i log
# Logging
#SyslogFacility AUTH
SyslogFacility LOCAL6
#新增ssh服务日志
root@ubuntu2:~# cat /etc/rsyslog.d/sshd.conf
local6.* /var/log/sshd.log
#重启服务后,生成ssh服务日志
root@ubuntu2:~# systemctl restart rsyslog
root@ubuntu2:~# systemctl restart sshd
root@ubuntu2:~# ll /var/log/sshd.log
-rw-r----- 1 syslog adm 145 Mar 15 13:32 /var/log/sshd.log
#验证服务
root@ubuntu2:~# logger -p local6.info "hello sshd"
root@ubuntu2:~# cat /var/log/sshd.log
Mar 15 13:32:53 ubuntu2 sshd[143533]: Server listening on 0.0.0.0 port 22.
Mar 15 13:32:53 ubuntu2 sshd[143533]: Server listening on :: port 22.
Mar 15 13:33:36 ubuntu2 root: hello sshd
实现日志网络转发
将3个主机(要求主机名为ip)的ssh日志,通过rsyslog服务将ssh日志写入到集中的主机上的rsyslog服务,写入到/var/log/all-ssh.log文件
配置 server log 主机,开启 TCP, UDP 相关功能
root@ubuntu2:~# cat /etc/rsyslog.conf|grep -Ei 'tcp|udp'
# 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@ubuntu2:~# systemctl restart rsyslog
root@ubuntu2:~# ss -tunlp|grep 514
udp UNCONN 0 0 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",pid=143567,fd=5))
udp UNCONN 0 0 [::]:514 [::]:* users:(("rsyslogd",pid=143567,fd=6))
tcp LISTEN 0 25 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",pid=143567,fd=7))
tcp LISTEN 0 25 [::]:514 [::]:* users:(("rsyslogd",pid=143567,fd=8))
root@ubuntu2:~# cat /etc/rsyslog.d/50-default.conf |grep auth
auth,authpriv.* /var/log/auth.log
客户端配置日志转发
root@ubuntu2204:~# vi /etc/rsyslog.d/net.conf
root@ubuntu2204:~# cat /etc/rsyslog.d/net.conf
*.info @10.0.0.155:514
root@ubuntu2204:~# systemctl restart rsyslog
root@ubuntu2204:~# logger "this msg from 10.0.0.151"
root@ubuntu2204:~# tail -1 /var/log/syslog
Mar 15 21:49:03 ubuntu2204 root: this msg from 10.0.0.151
#服务端更新日志
root@ubuntu2:~# tail -1 /var/log/syslog
Mar 15 21:49:03 ubuntu2204 root: this msg from 10.0.0.151
日志文件
-
/var/log/secure:系统安全日志,文本格式,应周期性分析
-
/var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行
查看 -
/var/log/wtmp:当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查看
-
/var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看
-
/var/log/dmesg:CentOS7 之前版本系统引导过程中的日志信息,文本格式,开机后的硬件变化
将不再记录专用命令dmesg查看,可持续记录硬件变化的情况 -
/var/log/boot.log 系统服务启动的相关信息,文本格式
-
/var/log/messages :系统中大部分的信息
journalctl
操作系统日志事件都由 systemd 的 journald 守护进程来处理。journald 守护进程收集所有来自 Linux 操作系统的各种日志,并将其作为二进制数据存储在文件中。
以二进制数据集中记录事件、系统问题可以以文本、JSON 对象等多种方式进行转译,以满足各种需求。另外,由于日志是按顺序存储的,通过对日志的日期/时间操作,超级容易追踪到单个事件
日志的配置文件
/etc/systemd/journald.conf
用法
#查看所有日志(默认情况下 ,只保存本次启动的日志)
journalctl
#查看内核日志(不显示应用日志)
journalctl -k
#查看系统本次启动的日志
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.serviceqq -o json-pretty
#显示日志占据的硬盘空间
journalctl --disk-usage
#指定日志文件占据的最大空间
journalctl --vacuum-size=1G
#指定日志文件保存多久
journalctl --vacuum-time=1years
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服务切割nginx日志,每天切割一次,要求大于不超过3M, 保存90天的日志, 旧日志以时间为后缀,要求压缩
root@ubuntu2:~# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 90
compress
delaycompress
notifempty
create 640 root root
size 3M
dateext
}
root@ubuntu2:~#
root@ubuntu2:~# dd if=/dev/zero of=/var/log/nginx/nginx.log bs=4M count=1
1+0 records in
1+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.00445776 s, 941 MB/s
root@ubuntu2:~# ll /var/log/nginx/nginx.log -lh
-rw-r--r-- 1 root root 4.0M Mar 15 14:13 /var/log/nginx/nginx.log
root@ubuntu2:~# logrotate /etc/logrotate.d/nginx
root@ubuntu2:~# ll /var/log/nginx/nginx.log* -lh
-rw-r----- 1 root root 0 Mar 15 14:14 /var/log/nginx/nginx.log
-rw-r--r-- 1 root root 4.0M Mar 15 14:13 /var/log/nginx/nginx.log-20240315