【网络运维】Linux:日志管理
Linux 系统日志是监控系统运行状态、排查问题和分析性能的重要工具。本文介绍了linux系统日志的一些使用方法。
Linux 日志管理
Linux 系统日志是监控系统运行状态、排查问题和分析性能的重要工具。
操作系统内核和程序记录了发生的事件日志,这些日志用于审核系统并解决问题。日志以文本方式保存在/var/log目录中。可以使用普通文本实用程序(如less和tail)检查这些日志。
Linux 内置了基于Syslog协议的标准日志记录系统。许多程序使用此系统记录事件并将其组织到日志文件中。CentOS 7 中systemd-journald和rsyslog服务负责处理syslog消息。
- systemd-journald 服务,是操作系统事件记录体系结构的核心,收集系统各方面事件消息,包括内核、引导过程早期阶段的输出、守护程序启动和运行时的输出、syslog事件,然后将它们重组为标准格式,并写入结构化的索引系统日志中。
- rsyslog 服务,读取systemd-journald日志,然后记录到日志文件,或根据自己的配置将日志保存到不同的文件中,以及转发给其他程序。
rsyslog 日志配置
rsyslog 服务配置
配置文件位置
-
主配置: /etc/rsyslog.conf。主配置文件中以下配置作用是引入从配置目录中配置文件。
# Include all config files in /etc/rsyslog.d/ include(file="/etc/rsyslog.d/*.conf" mode="optional") -
从配置:/etc/rsyslog.d/*.conf。
日志记录规则
每一条日志消息都可以通过消息类型facility和priority分类,参考rsyslog.conf(5)。
日志记录规则格式: facility+连接符号+priority 处理方式
facility(设备类型)
priority(优先级)
连接符
处理方式
- 记录到文件
- 发送到终端
- 转发给其他服务器
配置文件内容
/etc/rsyslog.conf中部分内容如下:
#### RULES ####
# Log all kernel messages to the console.
#kern.* /dev/console
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log

查看日志内容
[root@server ~]# tail -f /var/log/messages
......
Nov 10 10:23:05 server systemd-logind: New session 15 of user furongwang.
Nov 10 10:23:05 server systemd: Started Session 15 of user furongwang.
......
Nov 10 10:23:34 server systemd-logind: Removed session 15.
日志内容说明:
- Nov 10 10:23:34,代表日志产生时间。
- server,产生日志的主机名。
- systemd-logind,产生日志的进程。
- 最后一个区域是日志内容,例如,“Removed session 15.”。
[root@server ~]# tail -f /var/log/secure
......
Nov 10 10:27:26 server sshd[2755]: Accepted password for furongwang from 10.1.8.1 port 5530 ssh2
Nov 10 10:27:27 server sshd[2755]: pam_unix(sshd:session): session opened for user furongwang by (uid=0)
Nov 10 10:27:31 server sshd[2755]: pam_unix(sshd:session): session closed for user furongwang
自定义日志记录规则
[root@server ~]# vim /etc/rsyslog.d/furongwang.conf
local5.* /var/log/furongwang.log
[root@server ~]# systemctl restart rsyslog.service
[root@server ~]# ls /var/log/furongwang.log
ls: 无法访问/var/log/furongwang.log: 没有那个文件或目录
# 手动生成一个消息
[furongwang@server ~]$ logger -p local5.info "test my log"
[root@server ~]# cat /var/log/furongwang.log
Nov 10 10:32:26 server furongwang: test my log
补充
-
虽然系统提供了日志服务,但并不会记录所有内容。
-
系统中的应用程序是否使用 rsyslog 服务记录日志,取决于应用程序设计。
例如:
-
httpd 服务使用自己的日志记录。
-
sshd 服务使用 rsyslog 服务记录登录和退出日志。
[root@server ~]# grep AUTHPRIV /etc/ssh/sshd_config SyslogFacility AUTHPRIV [root@server ~]# grep ^authpri /etc/rsyslog.conf authpriv.* /var/log/secure [root@server ~]# tail -1 /var/log/secure Jul 25 14:10:39 server sshd[20527]: pam_unix(sshd:session): session opened for user root by (uid=0)
-
rsyslog 日志集中管理
多个客户端将日志发给服务端,由服务端统计记录。
服务端配置
# 启用 tcp 监听
[root@server ~]# vim /etc/rsyslog.conf
# 取消如下两行记录注释
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
# 重启服务
[root@server ~]# systemctl restart rsyslog.service
# 关闭防火墙:停止并禁止开机自动启动
[root@server ~]# systemctl disable firewalld.service --now
客户端配置
# 将本机所有日志通过tcp协议发送给远端服务器10.1.8.10
[root@client ~]# echo '*.* @@10.1.8.10' > /etc/rsyslog.d/remote.conf
[root@client ~]# systemctl restart rsyslog.service
测试
# 服务端监控日志,客户端注销用户或者ssh登录
[root@server ~]# tail -f /var/log/secure
......
Jul 25 14:43:03 server sshd[20527]: pam_unix(sshd:session): session closed for user root
Jul 25 14:46:52 client su[4509]: pam_unix(su-l:session): session closed for user root
Jul 25 14:47:28 client su[3975]: pam_unix(su-l:session): session closed for user furongwang
Jul 25 14:47:43 client sshd[3901]: error: Received disconnect from 10.1.8.1 port 51521:0:
Jul 25 14:47:43 client sshd[3901]: Disconnected from user root 10.1.8.1 port 51521
Jul 25 14:47:43 client sshd[3897]: pam_unix(sshd:session): session closed for user root
遗留问题
如何将不同主机发来的日志分类到不同文件中?
systemd-journald 日志
systemd-journald 日志持久化保存
systemd-journald 配置文件 /etc/systemd/journald.conf
详情参考 journald.conf(5)
Storage参数,更改参数值后需要重启systemd-journald服务。
- persistent:将日志存储在/var/log/journal目录中,这可在系统重启后持久保留。如果/var/log/journal目录不存在,systemd-journald服务会创建它。
- volatile:将日志存储在易失性/run/log/journal目录中。因为/run文件系统是临时的,仅存在于运行时内存中,存储在其中的数据(包括系统日志)不会在系统启后持久保留。
- auto:如果/var/log/journal目录存在,那么rsyslog会使用持久存储,否则使用易失性存储。如果未设置Storage参数,此为默认操作。
[root@server ~]# vim /etc/systemd/journald.conf
......
[Journal]
# Storage=auto
Storage=persistent
......
[root@server ~]# systemctl restart systemd-journald
systemd-journald 日志分析
[root@server ~]# ls /var/log/journal/
b8b0960cabe3452ca432f45acb1df028
# systemd-journald日志是以二进制方式存储,不能使用常规文本工具查看
# 查看所有日志条目
[root@server ~]# journalctl
# 动态查看所有日志条目
[root@server ~]# journalctl -f
# 查看本次系统启动到现在所有日志条目
[root@server ~]# journalctl -b 0
# 1 第1次启动的日志
# 2 第2次启动的日志
# N 第n次启动的日志
# 查看最近5条日志
[root@server ~]# journalctl -n 5
# 查看error级别日志
[root@server ~]# journalctl -p err
[root@server ~]# journalctl -p err | cat
# 查看特定unit日志
[root@server ~]# journalctl -u sshd.service
# -u后接unit日志名
# 根据时间查看日志
[root@server ~]# journalctl --since today
[root@server ~]# journalctl --since "2019-02-10 20:30:00" --until "2019-02-13 12:00:00"
[root@server ~]# journalctl --since "-1 hour"
# 详细查看所有日志
[root@server ~]# journalctl -o verbose
故障模拟
故障1:配置文件丢失
# 环境模拟:移动配置文件到其他路径(近似删除)
[root@server ~]# mv /etc/ssh/sshd_config .
[root@server ~]# systemctl restart sshd
处理过程:
通过日志发现报错: /etc/ssh/sshd_config: No such file or directory,文件丢失。
# 重启服务时,动态监控日志
[root@server ~]# journalctl -f
7月 28 13:52:26 server.furongwang.cloud systemd[1]: Starting OpenSSH server daemon...
7月 28 13:52:26 server.furongwang.cloud sshd[2045]: /etc/ssh/sshd_config: No such file or directory
7月 28 13:52:26 server.furongwang.cloud systemd[1]: sshd.service: main process exited, code=exited, status=1/
7月 28 13:52:27 server.furongwang.cloud systemd[1]: Failed to start OpenSSH server
......
# 移动回来,并重启服务
[root@server ~]# mv sshd_config /etc/ssh/sshd_config
[root@server ~]# systemctl restart sshd
故障2:配置文件参数错误1
# 环境模拟:修改参数为错误格式
[root@server ~]# echo 'PermitRootLogin hahaha' >> /etc/ssh/sshd_config
[root@server ~]# systemctl restart sshd
处理过程:
通过日志发现报错:/etc/ssh/sshd_config line 141: unsupported option "hahaha".
# 重启服务时,动态监控日志
[root@server ~]# journalctl -f
7月 28 14:30:03 server.furongwang.cloud systemd[1]: Stopped OpenSSH server daemon.
7月 28 14:30:03 server.furongwang.cloud systemd[1]: Starting OpenSSH server daemon...
7月 28 14:30:03 server.furongwang.cloud sshd[2806]: /etc/ssh/sshd_config line 141: unsupported option "hahaha".
7月 28 14:30:03 server.furongwang.cloud systemd[1]: sshd.service: main process exited, code=exited, status=25
7月 28 14:30:03 server.furongwang.cloud systemd[1]: Failed to start OpenSSH server daemon.
7月 28 14:30:03 server.furongwang.cloud systemd[1]: Unit sshd.service entered failed state.
# 清理对应无效记录,并重启服务
[root@server ~ 14:33:32]# sed -i '/hahaha/d' /etc/ssh/sshd_config
[root@server ~]# systemctl restart sshd
故障3:配置文件参数错误2
[root@server ~]# yum install -y httpd
[root@server ~]# sed -i 's/Listen 80/Listen 80000/g' /etc/httpd/conf/httpd.conf
[root@server ~]# systemctl restart httpd
处理过程:
通过日志发现报错: AH00526: Syntax error on line 42 of /etc/httpd/conf/httpd.conf
# 重启服务时,动态监控日志
[root@server ~]# journalctl -f
7月 28 14:34:49 server.furongwang.cloud systemd[1]: Starting The Apache HTTP Server...
7月 28 14:34:49 server.furongwang.cloud httpd[2877]: AH00526: Syntax error on line 42 of /etc/httpd/conf/httpd.conf:
7月 28 14:34:49 server.furongwang.cloud httpd[2877]: Invalid address or port
7月 28 14:34:49 server.furongwang.cloud systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
7月 28 14:34:49 server.furongwang.cloud systemd[1]: Failed to start The Apache HTTP Server.
7月 28 14:34:49 server.furongwang.cloud systemd[1]: Unit httpd.service entered failed state.
# 修改报错部分,并重启服务
[root@server ~]# sed -i 's/Listen 80000/Listen 80/g' /etc/httpd/conf/httpd.conf
# 或直接使用vim编辑,使用:set number命令查看第42行
[root@server ~]# systemctl restart httpd
更多推荐




所有评论(0)