目录
一. 基本介绍
Linux 系统中的日志管理是一个重要的系统管理任务,它帮助管理员监控系统状态、排查问题和维护系统安全。Linux 日志管理主要涉及日志的生成、存储、轮转和分析。
二. 系统常用的日志
日志文件 | 说明 |
/var/log/boot.log | 系统启动日志 |
/var/log/cron | 系统定时任务相关日志 |
/var/log/dmesg | 内核自检信息,通过dmesg命令查看 |
/var/log/maillog | 邮件服务日志 |
/var/log/btmp | 错误登录信息,实用lastb命令查看 |
/var/log/wtmp | 用户登录和注销信息,实用last命令查看 |
/var/log/utmp | 当前登录用户信息,实用who命令查看 |
/var/log/lastlog | 用户最后一次登录时间,实用lastlog命令查看 |
/var/log/messages | 系统重要消息,记录大多数系统时间 |
/var/log/secure | 认证和授权信息,如用户登录、su命令等 |
示例:
1、查看 /var/log/messages 日志
tailf /var/log/messages
或者
cat /var/log/messages
tailf 和 cat 区别
cat 命令用于显示文件的内容。当你运行 cat /var/log/messages 时,会一次性读取并显示 messages文件中的全部内容。不会实时更新,只会显示文件在命令执行时的内容。
taif 命令是 tail 命令的一个变体,用于实时显示文件的末尾内容。当你运行 tailf /var/log/messages 时,会显示文件的最后几行(默认10行,可以通过 -n 选项指定显示的行数),并且会持续监视文件的变化,实时显示新增的内容。这使得 tailf 非常适合用于实时监控日志文件。
如 tailf -n 20 /var/log/messages
三. 日志管理服务
日志管理服务既包括 rsyslogd 也包括 rsyslog。(先有的rsyslogd,然后在rsyslogd基础上发展而来的rsyslog)
- rsyslogd 是 rsyslog 的守护进程,负责在后台运行并处理日志消息。
- rsyslog 是一个完整的日志管理系统,包括守护进程 rsyslogd 和相关的配置文件、模块等。支持多线程和异步处理。
rsyslog 的配置文件通常位于 /etc/rsyslog.conf,并且可以包含多个子配置文件,通常位于 /etc/rsyslog.d/ 目录下
rsyslog 是一个高性能的日志管理工具,用于收集、处理和分发系统日志。其核心功能是将不同来源的日志消息(如本地程序、远程主机、内核等)根据规则分类并写入指定的日志文件。
rsyslog的核心工作原理
其工作流程可以简化为以下步骤:
- 输入模块(Input Modules):接收来自不同来源的日志(如本地系统日志、远程UDP/TCP消息、文件等)
- 规则引擎(Rule Engine):根据预定义的过滤条件(filter)对日志进行匹配。
- 动作(Actions):对匹配的日志执行操作(如写入文件、转发到远程服务器等)。
- 输出模块(Output Modules):将处理后的日志发送到目标位置(文件、数据库、远程主机等)。
rsyslog架构图如下:
详细流程:
1、收集日志消息
2、预处理
将收集到的日志消息经过预处理模块进行初步处理,解决不同syslog协议实现间的差异。
3、存储到主队列
处理完后的日志消息被存储到主队列中,确保日志消息的顺序和完整性。
4、过滤和分类
主队列中的日志消息通过过滤模块进行筛选和分类。rsyslogd 支持使用RainerScript等内置脚本语言进行复杂的日志处理和过滤。
5、存储到执行队列
过滤后的日志消息被存储到执行队列中,准备发送到指定的目标。
6、分发到目标
执行队列中的日志消息通过输出模块发送到指定的目标,如本地文件、远程服务器、数据库等。
实现不同消息输入到指定日志文件
1、输入来源的多样性
rsyslog支持多种输入方式,通过加载不同的输入模块实现:
- 本地日志:通过 imuxsock 模块读取 /dev/log 中的本地系统日志。
- 内核日志:通过 imkmsg 模块读取 /proc/kmsg。
- 远程日志:通过 imtcp(TCP) 或 imudp(UDP)模块监听端口(如514)接收网络日志。
- 文件监控:通过 imfile 模块实时监控指定文件的变化(如跟踪应用程序的日志文件)。
配置示例:加载输入模块
# 加载模块
module(load="imuxsock") # 本地系统日志
module(load="imtcp") # TCP输入
module(load="imfile") # 监控文件
2、规则与过滤条件
rsyslog使用过滤条件对日志进行分类,常见的过滤方式:
- 按优先级(Priority):*.*(所有日志),*.info (所有info及以上级别)。
- 按程序名(Programname):$programname == ' nginx' 。
- 按主机/IP:$fromhost-ip == ' 192.168.1.100' 。
- 按消息内容:$msg contains 'error' 。
配置示例:定义规则
# 将 Nginx 的日志写入单独文件
if $programname == 'nginx' then /var/log/nginx.log
# 将来自特定 IP 的日志写入远程主机目录
if $fromhost-ip == '192.168.1.100' then /var/log/remote/host100.log
# 将所有错误级别的日志写入 error.log
*.error /var/log/error.log
# 默认将所有日志写入 messages
*。* /var/log/messages
3、输出到指定文件
通过 omfile 模块将日志写入文件,支持动态文件名和目录创建:
# 按日期和主机名生成动态文件名
$template DailyLog, "/var/log/%$YEAR%-%$MONTH%-%$DAY%/%HOSTNAME%.log"
*.* ?DailyLog
# 如果目录不存在,自动创建
$CreateDirs on
4、完整配置示例
# 加载输入模块
module(load="imuxsock") # 本地日志
module(load="imtcp" Port="514") # 监听TCP 514端口
#定义模板(按照程序名和日期分目录)
$template AppLog, "/var/log/%programname%/%$YEAR%-%$MONTH%-%$DAY%.log"
#规则:将不同程序的日志写入不同文件
if $programename == 'nginx' then ?AppLog
if $programename == 'mysql' then ?AppLog
if $msg contains 'ssh' then /var/log/ssh.log
#默认规则
*.* /var/log/messages
查看rsyslog服务启动状态
1、使用 systemctl 命令
systemctl status rsyslog
如果服务正在运行,输出结果中会有 active(running)字样。反之,会有 inactive(dead)字样。
2、使用 service 命令
service rsyslog status
如果服务正在运行,会显示服务的PID和其他相关信息。反之,会提示服务未找到或未启动。
3、使用ps命令
ps aux | grep "rsyslog" | grep -v "grep"
(grep -v "grep" 表示过滤掉含grep的,-v选项表示反转)
配置文件含义
/etc/rsyslog.conf
1、编辑文件时的格式
*.* 存放日志文件
(第一个*代表日志类型,第二个*代表日志级别)
2、日志类型
auth | pam产生的日志 |
authpriv | ssh、ftp等登录信息的验证信息 |
corn | 时间任务相关 |
kern | 内核 |
lpr | 打印 |
邮件 | |
mark(syslog)-rsyslog | 服务内部的信息,时间标识 |
news | 新闻组 |
user | 用户程序产生的相关信息 |
uucp | unix to nuix copy主机之间相关的通信 |
local 1-7 | 自定义的日志设备 |
3、日志级别
debug | 有调试信息的,日志通信最多 |
info | 一般信息日志,最常用 |
notice | 最具有重要性的普通条件的信息 |
warning | 警告级别 |
err | 错误级别,阻止某个功能或者模块不能正常工作的信息 |
crit | 严重级别,阻止整个系统或者整个软件不能正常工作的信息 |
alert | 需要立刻修改的信息 |
emerg | 内核奔溃等重要信息 |
none | 什么都不记录 |
注意:从上到下,级别从低到高,记录信息越来越少。
日志格式
由rsyslogd 服务记录的日志文件,格式包括以下4列:
- 事件产生的时间
- 产生事件的服务器的主机名
- 产生事件的服务名或程序名
- 事件的具体信息
/var/log/secure 日志如下图所示:
自定义日志服务
在/etc/rsyslog.conf 中添加一个日志文件 /var/log/esther.log,当有事件发送时(比如sshd服务相关事件),该文件会接收到信息并保存。
演示重启、登录的情况,日志保存内容如下图所示:
四. 日志轮替
1、基本介绍
日志轮替是一种日志管理机制,用于定期对日志文件进行处理,以防止日志文件占用过多磁盘空间,同时确保日志数据的完整性和可访问性。通过日志轮替,可以将旧的日志文件进行归档、压缩或删除,同时创建新的日志文件继续记录新的日志数据。
2、工作原理
日志轮替主要包括以下几个步骤:
- 触发条件:日志轮替可以根据时间间隔(如每天、每周、每月)或日志文件大小(如达到一定字节数)来触发。当满足触发条件时,日志轮替过程开始。
- 重命名旧日志文件:将当前的日志文件重命名为一个带有时间戳或其他标识的文件名,以便于后续的归档和管理。例如,/var/log/app.log 可能会被重命名为 /var/log/app.log.20240101。
- 创建新日志文件:在重命名旧日志文件后,系统会创建一个新的日志文件,继续记录新的日志数据。
- 压缩旧日志文件:为了节省磁盘空间,旧的日志文件可以被压缩。压缩通常在重命名之后进行,可以使用gzip等压缩工具。
- 删除过期日志文件:根据日志轮替策略,保留一定数量的旧日志文件,超过这个数量的旧日志文件将被删除,以释放磁盘空间。
日志轮替之所以可以在指定的时间备份日志,是依赖系统定时任务。在 /etc/cron.daily/ 目录,就会发现这个目录中是有logrotate文件(可执行),logrotate 通过这个文件依赖定时任务执行的。
3、配置
日志轮替的配置文件通常位于 /etc/logrotate.conf,并且可以包含多个子配置文件,通常位于 /etc/logrotate.d 目录下。
# /etc/logrotate.conf
weekly
rotate 4
create
dateext
include /etc/logrotate.d
- weekly:每周对日志文件进行一次轮替
- rotate 4:保留4个旧日志文件
- create:在日志轮替后创建新的日志文件
- dateext:使用日期作为日志轮替文件的后缀
- include /etc/logrotate.d:包含 /etc/logrotate.d/ 目录中的所有子配置文件
dateext参数作用:
如果配置文件中没有“dateext”参数,日志文件就需要进行改名了。当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志,用来保存新的日志。当第二次进行日志轮替时,“secure.1"会自动改名为“secure.2",当前的"secure"日志会自动改名为“secure.1”,然后也会新建“secure”日志,以此类推。
Nginx日志轮替配置示例如下:
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 7
compress
missingok
notifempty
create 640 root root
postrotate
killall -HUP nginx
endscript
}
- compress:压缩旧日志文件
- missingok:如果日志文件不存在,则忽略该日志的警告信息
- notifempty:如果日志文件为空,则不进行轮替
- create 640 root root:在日志轮替后创建新的日志文件,权限为640,所有着为root,所属组为root
- postrotate:在日志轮替后执行的命令,这里用于重新加载Nginx配置
4、把自己的日志加入日志轮替
方法一:在 /etc/logrotate.conf 配置文件中写入该日志的轮替策略
方法二:在 /etc/logrotate.d/ 目录中新建该日志的轮替文件,在文件中写入正确的轮替策略。轮替文件都会被 “include” 到主配置文件中,所以也可以把日志加入轮替。
推荐方法二,因为系统中需要轮替的日志非常多,如果全都直接写入 /etc/logrotate.conf配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。
配置轮替文件一览
在logrotate文件夹下创建estherlog,内容如下,效果参考/var/log 下的boot.log情况
五. 查看内存日志
journalctl 可以查看内存日志,这里我们看看常用的指令
journalctl | 查看全部 |
journalctl -n 3 | 查看最新3条 |
journalctl --since 19:00 --until 19:10:10 | 查看指定时间段的日志(可加日期) |
journalctl -p err | 报错日志 |
journalctl -o verbose | 日志详细内容 |
journalctl_PID=1245 _COMM=sshd | 查看包含这些参数的日志 |
journalctl | grep sshd |