9.1. 日志介绍
日志主要记录时间、地点、任务和事件。
9.1.1. 日志基础概念
9.1.1.1. 日志的提供程序
系统 |
包 |
提供程序 |
描述 |
|---|---|---|---|
redhat5 |
sysklogd |
syslogd,klogd |
syslog记录应用,klogd记录内核 |
centos6 |
rsyslog |
rsyslogd |
兼容sysklogd,多线程,支持mysql数据库 |
centos7 |
rsyslog |
同上 |
同上 |
9.1.1.2. 日志的设施
设施 |
描述 |
|---|---|
LOG_AUTH |
安全和认证(弃用) |
LOG_AUTHPRIV |
安全和认证 |
LOG_CRON |
计划任务的,包含cron,at |
LOG_DAEMON |
系统守护 |
LOG_FTP |
ftp |
LOG_KERN |
内核 |
LOG_LOCAL[0-7] |
自定义 |
LOG_LPR |
打印机 |
LOG_MAIL |
邮件 |
LOG_NEWS |
新闻 |
LOG_SYSLOG |
syslogd |
LOG_USER |
用户 |
LOG_UUCP |
unix to unix cp |
9.1.1.3. 日志级别
级别 |
描述 |
|---|---|
LOG_EMERG |
系统恐慌 |
LOG_ALERT |
必须立即采取措施解决 |
LOG_CRIT |
严格问题 |
LOG_ERR |
错误 |
LOG_WARNING |
警告 |
LOG_NOTICE |
正常通知 |
LOG_INFO |
普通信息 |
LOG_DEBUG |
调试级别 |
9.1.2. rsyslog配置文件
rsyslog的配置文件主要包括三个大的片段
- 全局片段
全局设置,加载模块。
- 模板片段
运行你指定日志消息的格式
- 输出通道
给通道定义个规则,在输出上设置
- 规则
规则有选择器和动作构成
9.1.2.1. 模块说明
模块名 |
功能 |
|---|---|
omsnmp |
snmp陷阱输出模块 |
ommysql |
mysql输出模块 |
omrelp |
可靠的relp协议输出模块 |
ompgsql |
postgresql输出模块 |
omlibdbi |
通用数据库输出模块 |
imfile |
文件输入模块 |
imudp |
udp syslog的输入插件 |
imtcp |
tcp syslog的输入插件 |
imrelp |
可靠的relp协议输入模块 |
impgsapi |
tcp和gss-enable的输入插件 |
immark |
支持掩码消息 |
imklog |
内核日志 |
imuxsock |
unix套接字 |
9.1.2.2. 输出位置说明
输出位置 |
样例 |
描述 |
|---|---|---|
文件 |
/var/log/sample.log |
直接输出到指定的文件去 |
管道 |
command
|
直接重定向到某个命令 |
终端 |
/dev/console |
直接输出的指定的登陆终端 |
远程主机 |
@192.168.0.1 |
直接输出到远程指定主机 |
用户列表 |
root,zzjloginjiedi1992 |
直接输出到2个用户对应的登陆终端 |
所有用户 |
直接给所有登陆用户发送 |
|
数据库表 |
192.168.0.1,dbname,username,password |
连接指定主机的数据库表 |
丢弃 |
~ |
丢弃日志,不记录 |
输出通道 |
||
shell执行 |
^execute_file; template |
模板作为字一个参数去执行脚本 |
9.1.2.3. 默认配置位置的日志记录规则说明
1[root@102 ~]$vim /etc/rsyslog.conf
2#记录所有设置的info级别的信息,但是排除mail,authpriv,cron的信息。
3*.info;mail.none;authpriv.none;cron.none /var/log/messages
4
5# 安全日志的所有级别的信息都记录到本机的/var/log/secure文件中去
6authpriv.* /var/log/secure
7
8# 记录所有邮件的信息到/var/log/maillog中去,“-”代表异步写入。
9mail.* -/var/log/maillog
10
11
12# 记录计划任务(cron,at)的所有级别信息到/var/log/cron文件中去
13cron.* /var/log/cron
14
15# 不管是那个设施产生的emerg级别的信息,发送给登陆的所有用户
16*.emerg :omusrmsg:*
17
18# unix to unix cp和新闻的严格级别记录到/var/log/spooler
19uucp,news.crit /var/log/spooler
20
21# 启动信息记录到/var/log/boot.log,这个local是自定义的,系统已经占用一个
22local7.* /var/log/boot.log
9.1.3. 样例配置
9.1.3.1. 修改sshd的所有日志信息到到单独的文件
新建 /etc/rsyslog.d/sshd.conf 并添加配置:
1[root@102 ~]$vim /etc/rsyslog.d/sshd.conf
2[root@102 ~]$cat /etc/rsyslog.d/sshd.conf
3local1.* /var/log/sshd.log
修改sshd server的配置
1[root@102 ~]$vim /etc/ssh/sshd_config
2# 修改如下2行内容
3SyslogFacility LOCAL1
4LogLevel INFO
重启日志服务,使配置生效:
1[root@102 ~]$systemctl restart sshd
2[root@102 ~]$systemctl restart rsyslog
注意
CentOS6重启对应的服务,用命令 service sshd restart 把sshd换成 rsyslog,则重启系统日志服务。
测试日志记录
1[root@102 ~]$ssh localhost
2Last login: Thu Feb 1 09:41:16 2018 from localhost
3Welcom you this system
4[root@102 ~]$cat /var/log/sshd.log
5Feb 1 09:42:14 102 sshd[35620]: Accepted publickey for root from ::1 port 39986 ssh2: RSA SHA256:i9zugMHEhLi77fPoR1gpco04UbuNtRcBJZkb6lLSCt4
9.1.3.2. 修改sshd的所有日志信息到远程主机
- 整体步骤:
这里涉及到2台主机,主要思路先启用服务器端的监听,然后在客户端配置要配置要推送地址
服务器配置:
1[root@centos-158 ~]# vim /etc/rsyslog.conf
2# 解注释如下4行
3$ModLoad imudp
4$UDPServerRun 514
5$ModLoad imtcp
6$InputTCPServerRun 514
7
8[root@102 ~]$vim /etc/rsyslog.d/sshd.conf
9[root@102 ~]$cat /etc/rsyslog.d/sshd.conf
10local1.* /var/log/sshd.log
11
12[root@102 ~]$vim /etc/ssh/sshd_config
13# 修改如下2行内容
14SyslogFacility LOCAL1
15LogLevel INFO
16# 重启服务
17[root@102 ~]$systemctl restart sshd
18[root@102 ~]$systemctl restart rsyslog
19
20# 重启服务并查看监听
21[root@centos-158 ~]# service rsyslog restart
22[root@centos-158 ~]# ss -tunl |grep 514
23udp UNCONN 0 0 *:514 *:*
24udp UNCONN 0 0 :::514 :::*
25tcp LISTEN 0 25 *:514 *:*
26tcp LISTEN 0 25 :::514 :::*
客户端配置:
接下来是客户端的配置
1[root@102 ~]$vim /etc/rsyslog.d/sshd.conf
2[root@102 ~]$cat /etc/rsyslog.d/sshd.conf
3local1.* @172.19.104.175
4[root@102 ~]$vim /etc/ssh/sshd_config
5# 修改如下2行内容
6SyslogFacility LOCAL1
7LogLevel INFO
8[root@102 ~]$systemctl restart sshd
9[root@102 ~]$systemctl restart rsyslog
10
11# 102客户端尝试登陆下
12[root@102 ~]$ssh zzjlogin@localhost
13zzjlogin@localhost's password:
14jlsdfjslfs
15Permission denied, please try again.
16zzjlogin@localhost's password:
17Permission denied, please try again.
18zzjlogin@localhost's password:
19Permission denied (publickey,password).
20
21# 服务端查看日志是否记录了
22[root@centos-158 ~]# tail /var/log/sshd.log
23Feb 1 10:24:14 102 sshd[37196]: Failed password for zzjlogin from ::1 port 40016 ssh2
24Feb 1 10:24:15 102 sshd[37196]: Failed password for zzjlogin from ::1 port 40016 ssh2
25Feb 1 10:24:15 102 sshd[37196]: Failed password for zzjlogin from ::1 port 40016 ssh2
26Feb 1 10:24:15 102 sshd[37196]: Connection closed by ::1 port 40016 [preauth]
备注
如果网络不稳定,可以使用@@替换@,@@使用的tcp协议,@使用的udp协议。
9.1.3.3. 常见日志文件
文件 |
功能 |
描述 |
|---|---|---|
/var/log/message |
包含大部分的日志信息 |
|
/var/log/btmp |
失败登陆的日志信息 |
使用lastb命令查看 |
/var/log/wtpm |
成功登陆的日志信息 |
使用last命令查看 |
/var/log/lastlog |
每个用户最近一次登陆的日志信息 |
使用lastlog命令查看 |
/var/log/dmesg |
系统引导过程中的日志信息 |
使用dmesg命令查看 |
/var/log/anaconda |
anaconada的日志信息 |
9.1.3.4. journalctl命令使用
systemd统一管理所有unit的启动日志,值使用journalctl就可以管理日志。
- -a
显示所有字段
- -f
最新的信息
- -e
跳到最后一页
- -n
显示最近的几行
- -r
反转输出,新的放前面
- -o
指定输出格式
- --utc
时间为utc时间
- -k
显示内核信息
- -p
设置level
- -S
开始时间
- --since
开始时间,日志格式’2012-10-30 18:17:16’
- -U
开始时间
- --until
开始时间,日志格式’2012-10-30 18:17:16’
- -F
指定的字段
- --disk-usage
当前日志占用系统空间情况
- --no-pager
不分页
- -f
实时滚动显示
- -u
指定服务进程
9.1.3.5. 样例使用
1# 查看所有日志(默认情况下 ,只保存本次启动的日志)
2journalctl
3# 查看内核日志(不显示应用日志)
4journalctl -k
5# 查看系统本次启动的日志
6journalctl -b
7journalctl -b -0
8# 查看上一次启动的日志(需更改设置)
9journalctl -b -1
10
11# 查看指定时间的日志
12journalctl --since="2017-10-30 18:10:30"
13journalctl --since "20 min ago"
14journalctl --since yesterday
15journalctl --since "2017-01-10" --until "2017-01-11 03:00"
16journalctl --since 09:00 --until "1 hour ago"
17# 显示尾部的最新10行日志
18journalctl -n
19# 显示尾部指定行数的日志
20journalctl -n 20
21# 实时滚动显示最新日志
22journalctl -f
23
24日志管理journalctl
25# 查看指定服务的日志
26journalctl /usr/lib/systemd/systemd
27# 查看指定进程的日志
28journalctl _PID=1
29# 查看某个路径的脚本的日志
30journalctl /usr/bin/bash
31# 查看指定用户的日志
32journalctl _UID=33 --since today
33# 查看某个 Unit 的日志
34journalctl -u nginx.service
35journalctl -u nginx.service --since today
36# 实时滚动显示某个 Unit 的最新日志
37journalctl -u nginx.service -f
38# 合并显示多个 Unit 的日志
39journalctl -u nginx.service -u php-fpm.service --since today
40# 以 JSON 格式(单行)输出
41journalctl -b -u nginx.service -o json
42# 以 JSON 格式(多行)输出,可读性更好
43journalctl -b -u nginx.serviceqq -o json-pretty
44# 显示日志占据的硬盘空间
45journalctl --disk-usage
46# 指定日志文件占据的最大空间
47journalctl --vacuum-size=1G
48# 指定日志文件保存多久
49journalctl --vacuum-time=1years