Linux 日志管理

Linux 日志管理是指对 Linux 系统中产生的各种日志文件进行收集、分析、备份、轮转和删除等操作,以便监控系统的运行状况,诊断和解决问题,提高系统的安全性和性能。

介绍

Linux 系统中有两种主要的日志服务,一种是传统的 rsyslog 服务,它是一个灵活的日志处理器,可以将日志信息发送到不同的目标,如文件、数据库、网络等。另一种是新添加的 systemd-journal 服务,它是一个二进制日志系统,可以存储更多的元数据,如时间戳、主机名、优先级等,并支持日志查询和过滤。

Linux 系统中的日志文件通常存放在 /var/log 目录下,不同的程序和服务会生成不同的日志文件,记录了各种类型的信息,如内核消息、用户登录事件、程序错误等。常见的日志文件及其存放内容如下:

日志文件 存放内容
/var/log/message 内核消息及各种应用程序的公共日志信息,是 Red Hat Linux 中最常用的日志之一
/var/log/secure 与安全相关的日志信息
/var/log/maillog 与邮件相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/dmesg 引导过程中的各种事件信息
/var/log/lastlog 每个用户最近一次登录信息
/var/log/wtmp 每个用户登录注销及系统启动和停机事件
/var/log/btmp 失败的、错误的登录尝试及验证事件

Linux 系统中的日志文件会定期进行轮转,即将旧的日志文件重命名并压缩,创建新的日志文件。这样可以避免日志文件占用过多的磁盘空间,并保留一定时间段内的日志记录。日志轮转由 logrotate 命令实现,它根据 /etc/logrotate.conf 和 /etc/logrotate.d/ 目录下的配置文件来执行轮转操作。这些配置文件可以指定轮转周期、轮转次数、轮转方式、轮转后执行的命令等。

  • Linux 系统中有多种命令和工具可以用来查看和分析日志文件,例如:
  • tail 命令:用于查看日志文件的最后几行,常用 -f 选项实时监控日志变化。
  • grep 命令:用于在日志文件中搜索特定的关键字或模式。
  • who 命令:用于查看当前登录到系统的用户信息。
  • last 命令:用于查看成功登录到系统的用户记录。
  • lastlog 命令:用于查看系统中所有用户最近一次登录信息。
  • lastb 命令:用于查看用户错误的登录列表。
  • Logcheck 工具:用于分析系统日志并报告异常或重要事件。
  • Logcheck 工具:用于分析系统日志并报告异常或重要事件。

相关软件包和配置文件

软件包

[root@Demo01 ~]# rpm -qa | grep rsyslog
rsyslog-relp-8.24.0-57.el7_9.3.x86_64
rsyslog-libdbi-8.24.0-57.el7_9.3.x86_64
rsyslog-mmnormalize-8.24.0-57.el7_9.3.x86_64
rsyslog-mmjsonparse-8.24.0-57.el7_9.3.x86_64
rsyslog-crypto-8.24.0-57.el7_9.3.x86_64
rsyslog-gnutls-8.24.0-57.el7_9.3.x86_64
rsyslog-snmp-8.24.0-57.el7_9.3.x86_64
rsyslog-kafka-8.24.0-57.el7_9.3.x86_64
rsyslog-mysql-8.24.0-57.el7_9.3.x86_64
rsyslog-mmkubernetes-8.24.0-57.el7_9.3.x86_64
rsyslog-gssapi-8.24.0-57.el7_9.3.x86_64
rsyslog-mmaudit-8.24.0-57.el7_9.3.x86_64
rsyslog-mmsnmptrapd-8.24.0-57.el7_9.3.x86_64
rsyslog-8.24.0-57.el7_9.3.x86_64
rsyslog-pgsql-8.24.0-57.el7_9.3.x86_64
rsyslog-udpspoof-8.24.0-57.el7_9.3.x86_64
rsyslog-elasticsearch-8.24.0-57.el7_9.3.x86_64
rsyslog-doc-8.24.0-57.el7_9.3.noarch

配置文件

/etc/rsyslog.conf       #主配置文件
/etc/rsyslog.d/*.conf   #辅配置文件
/var/log/               #日志文件存放位置
/usr/sbin/rsyslogd      #执行文件
/usr/lib64/rsyslog/     #模块路径
/usr/lib/systemd/system/rsyslog.service #服务单元
[root@Demo01 ~]# grep '####' /etc/rsyslog.conf 

#### MODULES ####定义模块
#### GLOBAL DIRECTIVES ####定义全局环境
#### RULES #### 定义规则

模块定义

module(load="imuxsock"    # 提供对本地系统日志的支持
       SysSock.Use="off") # 关闭通过本地日志接口的信息接收功能,日志信息接收通过下面的imjournal模块
module(load="imjournal"             # 提供对systemd日志的访问
       StateFile="imjournal.state") # 定义状态文件,rsyslog用于记录文件上传进度,避免日志内容混乱

全局环境设置

# 定义工作目录
global(workDirectory="/var/lib/rsyslog")

# 使用默认的时间戳格式
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")

# 定义辅助配置文件位置
include(file="/etc/rsyslog.d/*.conf" mode="optional")

规则设置

信息来源.安全级别 处理方式

信息来源
    kern:内核相关的日志
    user:用户相关的日志
        mail:邮件相关的日志
        daemon:系统服务相关的日志
        lpr:打印相关的日志
        cron:计划任务相关的日志
        authpriv:认证相关的日志
        news:新闻相关的日志
        uucp:文件copy相关的日志
        local0-local7:自定义相关的日志信息

    * 所有

安全级别

debug:  调试
info:   消息
notice: 注意
warn,warning: 警告
err,error: 错误
crit: 严重级别
alert: 需要立即修改该的信息
emerg,panic: 内核崩溃,系统接近崩溃

*:所有日志级别
none:没有任何级别,也就是不记录日志信息

表达形式

mail.err err+crit+alert+emerg
mail.=err err
mail.!err 除了err

处理方式

/PATH/FILENAME:将信息储存至 /PATH/FILENAME文件中。注意,如果要系统日志服务把信息储存到文件,该文件必须以
斜线(/ 开头的绝对路径命名之。
USERNAME:将信息送给已登录的用户。
@HOSTNAME:代表使用udp协议将信息转送到远端的日志服务器
@@hostname:代表使用tcp协议将信息传送到远端的日志服务器
*:将信息传送给所有已登录的用户。
#### RULES ####
##########  日志设备.日志级别  ##################          #########  消息发送位置  ###############
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
# Log cron stuff
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
local2.info           /tmp/test.log

日志设备

日志设备.级别 说明
auth -pam(linux中的认证机制) 产生的日志
authpriv -ssh,ftp 等登录信息的验证信息
cron 时间任务相关
kern -内核相关
lpr -打印
mail -邮件
mark(syslog) -rsyslog服务内部的信息,时间标识
news -新闻组
user -用户程序产生的相关信息
uucp -unix to unix copy unix主机之间的相关通信
local 1~7 自定义日志设备文件

日志级别

级别 说明
NONE 什么都不记录
EMERG (紧急) 导致主机系统不可用的情况
ALERT(警告) 必须马上采取解决措施
CRIT (严重) 比较严重的情况
ERR 运行时的错误
WARNING (提醒) 可能影响系统功能的事件
NOTICE(注意) 不会影响系统功能,但是值得注意
INFO 一般信息
DEBUG 调试信息

自下而上,信息记录的越来越少

常用的日志文件

/var/log/boot.log		#系统启动时的日志。
/var/log/dnf.* #dnf软件包管理器相关日志
/var/log/firewalld #防火墙日志
/var/log/lastlog #所有用户最后一次登录信息,需要使用lastlog命令查看
/var/log/maillog #电子邮件系统相关日志
/var/log/messages #整体的系统日志,具体记录范围取决于服务的配置文件
/var/log/wtmp			#记录当前登录和过去登录的用户信息,使用last命令查看

日志格式

[root@Demo01 ~]# tail -n 20 /var/log/messages 
Jul  1 05:05:41 LAMP dhclient[2115]: bound to 192.168.10.25 -- renewal in 736 seconds.
Jul  1 05:05:41 LAMP systemd: Starting Network Manager Script Dispatcher Service...
Jul  1 05:05:41 LAMP dbus[777]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Jul  1 05:05:41 LAMP systemd: Started Network Manager Script Dispatcher Service.

DATE  TIME  HOSTNAME  APPNAME[PID]: MESSAGES

每一个字段的意义如下说明:
DATE:信息发生的日期。
TIME:信息发生的时间。
HOSTNAME:信息发生的主机。
APP:产生信息的软件。
NAME:软件的名称,或是软件组件(Component)的名称。可以省略。
PID:进程标识符 Process ID)。可以省略。
MESSAGES:信息的内容。 

Sep 15 09:03:59 ecs-t6-large-2-linux-20190824103606 systemd-logind: New session 314 of user root.

    时间            主机名                          子系统名            消息字段