Linux 日志服务管理
日志是 Linux 系统排障、安全审计、性能监控的核心依据,日志服务则负责日志的采集、存储、过滤、轮转与分析。本文梳理 Linux 中常见的日志服务(从传统 syslog 到现代 systemd-journald、ELK),覆盖原理、配置、命令实战及常见问题。
一、Linux 日志服务核心概念
在学习具体服务前,先明确日志管理的核心术语,避免混淆:
| 术语 | 定义 |
|---|---|
| 日志源 | 产生日志的主体(内核、系统服务、应用程序,如 nginx、sshd) |
| 日志级别 | 标识日志紧急程度(从低到高:DEBUG、INFO、NOTICE、WARNING、ERR、CRIT、ALERT、EMERG) |
| 日志采集 | 从日志源获取日志的过程(主动推送/被动接收) |
| 日志轮转 | 自动切割大日志文件、删除旧日志,避免磁盘占满 |
| 日志聚合 | 将多台主机/多个服务的日志集中存储(如 ELK、Graylog) |
二、常见 Linux 日志服务分类与详解
Linux 日志服务的发展分为三个阶段:传统 syslog 时代 → systemd 集成时代 → 现代集中式日志时代,以下按"使用频率+重要性"排序讲解。
(一)传统日志服务:syslog(基础核心)
syslog 是 Linux 最古老、最基础的日志服务,几乎所有 Linux 发行版(CentOS 6、Ubuntu 14.04 及更早)都默认自带,基于 UDP/TCP 协议,支持本地日志存储和远程日志传输。
1. 核心原理
syslog 采用"生产者-传输者-存储者"架构:
- 生产者:产生日志的程序(如 sshd、crond),通过
syslog()系统调用发送日志; - 传输者:syslog 守护进程(
syslogd或rsyslogd),接收日志并根据规则转发/存储; - 存储者:本地文件(如
/var/log/messages)或远程日志服务器。
2. 两个核心守护进程
syslog 有两个主流实现,现代系统多使用 rsyslogd(功能更强大):
| 守护进程 | 特点 | 适用系统 |
|---|---|---|
syslogd |
基础版,仅支持本地日志存储,功能简单 | CentOS 5、Ubuntu 12.04 及更早 |
rsyslogd |
增强版,支持:① 远程日志传输 ② 日志过滤 ③ 数据库存储(MySQL/PostgreSQL)④ 日志轮转 | CentOS 6+、Ubuntu 14.04+ |
3. 关键配置文件(rsyslogd)
配置文件路径:/etc/rsyslog.conf(主配置)+ /etc/rsyslog.d/*.conf(自定义规则)
(1)配置文件结构(3部分)
ini
# 1. 模块加载(加载网络、数据库等模块)
$ModLoad imuxsock # 接收本地进程日志(核心模块)
$ModLoad imklog # 接收内核日志(核心模块)
$ModLoad imudp # 加载UDP模块(支持远程日志接收)
$UDPServerRun 514 # 监听UDP 514端口(默认端口)
$ModLoad imtcp # 加载TCP模块(比UDP可靠,避免日志丢失)
$InputTCPServerRun 514 # 监听TCP 514端口
# 2. 全局配置(日志格式、存储路径等)
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # 日志格式(默认:时间 主机 程序:日志内容)
$WorkDirectory /var/spool/rsyslog # 临时文件目录
# 3. 日志规则(核心!决定日志存储/转发规则)
# 规则格式:[日志源].[日志级别] 目标(本地文件/远程服务器)
# 日志源:auth(认证相关,如ssh登录)、authpriv(私密认证,如sudo)、daemon(守护进程)、kern(内核)、mail(邮件)、syslog(syslog自身)、local0-local7(自定义应用)
# 日志级别:用 .= 表示"等于", .>= 表示"大于等于", * 表示"所有级别"
# 示例1:本地日志存储
authpriv.* /var/log/secure # 私密认证日志(ssh登录、sudo操作)
auth.* /var/log/auth.log # 普通认证日志(Ubuntu专用)
daemon.* /var/log/daemon.log # 守护进程日志
kern.* /var/log/kern.log # 内核日志(如硬件驱动、系统启动)
mail.* -/var/log/maillog # 邮件日志(-表示异步写入,提升性能)
*.info;mail.none;authpriv.none;cron.none /var/log/messages # 通用日志(排除mail、authpriv、cron)
cron.* /var/log/cron # 定时任务日志(crond)
# 示例2:转发日志到远程服务器(常用!局域网多主机日志集中)
*.info @192.168.1.100:514 # @表示UDP协议,转发所有info及以上级别日志到192.168.1.100的514端口
*.info @@192.168.1.100:514 # @@表示TCP协议,更可靠
(2)核心规则语法详解
| 规则示例 | 含义 |
|---|---|
authpriv.* /var/log/secure |
所有级别(*)的 authpriv 日志,存储到 /var/log/secure |
kern.warning /var/log/kern_warn.log |
内核的 warning 及以上级别日志,存储到 /var/log/kern_warn.log |
mail.none /var/log/messages |
通用日志中排除 mail 相关的所有日志 |
local0.* @192.168.1.100:514 |
自定义应用(local0)的所有日志,通过 UDP 转发到远程服务器 |
4. 常用命令(rsyslogd 运维)
bash
# 1. 启动/停止/重启 rsyslogd(CentOS 6/Ubuntu 14.04)
service rsyslog start
service rsyslog stop
service rsyslog restart
# 2. 查看 rsyslogd 状态
service rsyslog status
# 或(现代系统)
systemctl status rsyslog
# 3. 查看 rsyslogd 监听端口(确认远程日志配置是否生效)
netstat -tulnp | grep 514 # 514是默认端口
# 示例输出:udp 0 0 0.0.0.0:514 0.0.0.0:* 1234/rsyslogd
# 4. 测试日志发送(手动生成一条测试日志)
logger -p local0.info "This is a test log from rsyslog"
# 参数说明:-p 指定日志源和级别(local0.info),后面是日志内容
# 查看是否生成:tail -n 1 /var/log/messages(若规则配置local0.*到messages)
5. 典型应用场景
- 单台服务器本地日志存储(基础运维);
- 局域网内多台主机日志转发到中央服务器(如公司内部 Linux 集群);
- 简单的日志过滤(如只保留 error 级别日志)。
(二)systemd 集成日志:journald(现代系统默认)
systemd-journald 是 systemd 初始化系统 (CentOS 7+、Ubuntu 16.04+)自带的日志服务,替代了传统 syslog 的部分功能,无需单独安装,与 systemd 深度集成。
1. 核心优势(对比 rsyslog)
- 日志存储在二进制文件中(而非文本文件),查询速度更快;
- 自动关联
systemd服务(如查看 nginx 服务的日志,直接关联进程 ID、启动时间); - 支持日志加密、压缩,占用磁盘空间更小;
- 无需配置日志轮转(自动管理日志大小,默认最大占用磁盘 10%)。
2. 核心原理
journald 接收来自 3 个来源的日志:
- 内核日志(通过
/dev/kmsg); - systemd 服务日志(通过
stdout/stderr输出); - 传统 syslog 日志(通过
rsyslogd转发,可共存)。
日志文件路径:/var/log/journal/(持久化存储),若该目录不存在,则日志仅存于内存(重启丢失)。
3. 关键配置文件
配置文件路径:/etc/systemd/journald.conf(主配置),常用配置项:
ini
[Journal]
Storage=persistent # 日志持久化存储(默认auto:有/var/log/journal则持久化,否则内存)
Compress=yes # 启用日志压缩(默认yes)
MaxUse=10% # 日志最大占用磁盘空间(默认10%)
MaxRetentionSec=7day # 日志最大保留时间(默认无限制)
ForwardToSyslog=yes # 将日志转发到rsyslog(默认yes,实现与传统日志兼容)
ForwardToWall=no # 不将日志发送到终端(默认no,避免干扰)
4. 核心命令:journalctl(日志查询神器)
journalctl 是 journald 的专用查询命令,功能强大,支持按服务、时间、级别过滤,必须掌握!
(1)基础查询
bash
# 1. 查看所有日志(按时间倒序,最新日志在最后)
journalctl
# 2. 查看最新N条日志(常用,避免刷屏)
journalctl -n 20 # 查看最新20条
journalctl -n 20 -f # 实时跟踪最新日志(类似tail -f)
# 3. 按时间范围查询(精准定位问题时间点)
journalctl --since "2024-05-01 08:00:00" --until "2024-05-01 09:00:00"
journalctl --since "1h ago" # 查看1小时内的日志
journalctl --since "yesterday" # 查看昨天的日志
(2)按服务/进程过滤(最常用场景)
bash
# 1. 查看指定systemd服务的日志(如nginx、sshd)
journalctl -u nginx.service # 查看nginx所有日志
journalctl -u nginx.service -f # 实时跟踪nginx日志
journalctl -u nginx.service --since "10min ago" # 查看10分钟内nginx日志
# 2. 查看指定进程的日志(通过PID)
journalctl _PID=1234 # 查看PID为1234的进程日志
# 3. 查看指定用户的日志(通过UID)
journalctl _UID=1000 # 查看UID为1000的普通用户日志
(3)按日志级别过滤(排障核心)
bash
# 日志级别对应参数:0=emerg(-p emerg),1=alert(-p alert),2=crit(-p crit),3=err(-p err),4=warning(-p warning),5=notice(-p notice),6=info(-p info),7=debug(-p debug)
journalctl -p err # 查看所有error及以上级别日志(排障优先)
journalctl -p warning # 查看warning及以上级别日志
journalctl -u sshd.service -p err # 查看sshd服务的error日志
(4)其他实用查询
bash
# 1. 查看内核日志(类似dmesg)
journalctl -k # 查看所有内核日志
journalctl -k -p err # 查看内核error日志
# 2. 查看日志统计信息(日志大小、时间范围)
journalctl --disk-usage # 查看日志占用磁盘空间
journalctl --list-boots # 查看系统启动记录(每个启动对应一个ID,可按启动ID查询日志)
journalctl -b 0 # 查看当前启动的日志(0=当前,-1=上一次启动)
# 3. 导出日志(归档或分享)
journalctl -u nginx.service --since "1h ago" --output=short > nginx_log_1h.txt
5. 与 rsyslog 的关系(重点)
journald 和 rsyslog 并非对立,而是互补共存:
journald:负责快速采集、短期存储(默认7天或10%磁盘),适合实时查询和短期排障;rsyslog:负责长期存储、远程转发、日志轮转,适合日志归档和集中管理。
默认情况下,journald 会将日志转发给 rsyslog,因此 /var/log/messages、/var/log/secure 等传统日志文件依然会生成。
(三)日志轮转服务:logrotate(必备工具)
无论是 rsyslog 还是 syslogd,都会生成大量文本日志文件,若不处理,日志会无限增大,占用大量磁盘空间。logrotate 是 Linux 默认的日志轮转工具,专门解决这个问题。
1. 核心原理
logrotate 按配置规则,定期(默认每天)执行以下操作:
- 切割当前日志文件(如将
/var/log/messages重命名为/var/log/messages.1); - 创建新的空日志文件(
/var/log/messages),供后续日志写入; - 压缩旧日志(如
/var/log/messages.1压缩为/var/log/messages.1.gz); - 删除超过保留期限的旧日志(如保留7天的日志)。
2. 关键配置文件
logrotate 的配置分为"全局配置"和"日志文件配置",路径如下:
| 配置文件 | 作用 |
|---|---|
/etc/logrotate.conf |
全局配置(默认轮转规则,如轮转周期、保留天数) |
/etc/logrotate.d/* |
单个日志文件的自定义配置(如 nginx、sshd 的日志轮转规则) |
(1)全局配置示例(/etc/logrotate.conf)
ini
weekly # 轮转周期(weekly=每周,daily=每天,monthly=每月)
rotate 4 # 保留4个轮转文件(默认保留4周)
create # 切割后创建新的空日志文件
dateext # 轮转文件以日期命名(如 messages-20240501,而非 messages.1)
compress # 压缩旧日志文件(默认gzip压缩)
include /etc/logrotate.d # 加载自定义日志的轮转规则
(2)自定义日志轮转配置(示例:nginx 日志)
创建文件 /etc/logrotate.d/nginx,配置如下:
ini
# nginx 日志路径(根据实际安装路径调整)
/var/log/nginx/*.log {
daily # 每天轮转(nginx日志量大,建议每天)
rotate 7 # 保留7天的日志(7个文件)
create 0640 nginx nginx # 新日志文件权限:0640,属主nginx,属组nginx
compress # 压缩旧日志
missingok # 若日志文件不存在,不报错
notifempty # 若日志文件为空,不执行轮转
sharedscripts # 所有日志文件轮转后,只执行一次postrotate脚本
postrotate # 轮转后执行的脚本(重启nginx,让nginx写入新日志文件)
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
3. 常用命令(手动触发轮转)
bash
# 1. 手动执行所有日志的轮转(按配置规则)
logrotate /etc/logrotate.conf
# 2. 手动执行指定日志的轮转(如nginx)
logrotate /etc/logrotate.d/nginx
# 3. 测试轮转规则(不实际执行,仅输出执行计划)
logrotate -d /etc/logrotate.d/nginx # -d=debug模式
# 4. 强制执行轮转(即使未到轮转周期)
logrotate -f /etc/logrotate.d/nginx # -f=force模式
4. 典型问题解决
- 问题1:轮转后应用无法写入新日志?→ 需在
postrotate脚本中重启应用(如 nginx、apache),或发送信号让应用重新打开日志文件(如kill -USR1 nginx_pid); - 问题2:旧日志未被删除?→ 检查
rotate参数(保留数量)和maxage参数(最大保留天数)是否配置。
(四)现代集中式日志服务(企业级必备)
当 Linux 主机数量超过 3 台时,传统的"单台存储日志"方式已无法满足需求(需登录每台主机查日志,效率极低)。集中式日志服务将多台主机的日志统一采集、存储、分析,是企业运维的标配。
1. 主流集中式日志架构:ELK Stack(最常用)
ELK 是 Elasticsearch、Logstash、Kibana 的组合,三者各司其职,构成完整的日志生命周期管理:
| 组件 | 作用 | 核心功能 |
|---|---|---|
| Logstash | 日志采集/过滤/转发 | 1. 接收多源日志(rsyslog、filebeat、应用直接推送);2. 过滤无用日志(如删除重复日志);3. 格式化日志(统一字段,如添加主机名、时间戳);4. 转发到 Elasticsearch |
| Elasticsearch | 日志存储/检索 | 1. 分布式存储日志(支持PB级数据);2. 全文检索(快速查询关键字,如"error""login failed");3. 实时分析(按级别、主机、服务统计日志数量) |
| Kibana | 日志可视化/监控 | 1. 生成日志仪表盘(如按级别统计日志占比、按主机统计日志数量);2. 实时监控(设置告警,如 error 日志超过100条时通知管理员);3. 导出日志报表 |
(1)ELK 工作流程(局域网场景)
- 客户端(局域网内的 Linux 主机):通过
rsyslog或Filebeat(轻量级采集器)将日志发送到 Logstash; - Logstash:过滤、格式化日志,转发到 Elasticsearch 集群;
- Elasticsearch:存储日志并建立索引;
- 管理员:通过 Kibana 网页端查询、分析、监控日志。
(2)简化版方案:Filebeat + Elasticsearch + Kibana
Logstash 占用资源较高(JVM 进程),小规模场景(<10台主机)可使用 Filebeat 替代 Logstash(轻量级,无 JVM 依赖),流程更简单:
Linux 主机日志 → Filebeat 采集 → Elasticsearch 存储 → Kibana 可视化
2. 其他集中式日志方案
| 方案 | 特点 | 适用场景 |
|---|---|---|
| Graylog | 比 ELK 部署更简单,自带告警功能,支持 LDAP 认证 | 中小企业、运维人员较少的团队 |
| Fluentd | 轻量级,适合容器化环境(Docker/K8s),与云原生工具兼容性好 | 云原生集群、容器日志管理 |
| Splunk | 商业软件,功能强大(日志分析、安全审计、威胁检测),但收费 | 大型企业、对安全要求极高的场景 |
三、Linux 常见日志文件路径
无论使用哪种日志服务,以下核心日志文件的路径和用途都是固定的,是排障的"第一手资料":
| 日志文件路径 | 用途 | 关联服务 |
|---|---|---|
/var/log/messages |
通用系统日志(内核、守护进程、应用程序,排除 mail、authpriv、cron) | rsyslog |
/var/log/secure |
安全认证日志(ssh 登录、sudo 操作、密码错误、用户创建/删除) | rsyslog |
/var/log/cron |
定时任务日志(crond 服务的执行记录,如脚本执行成功/失败) | rsyslog |
/var/log/maillog |
邮件服务日志(sendmail、postfix 等邮件服务的发送/接收记录) | rsyslog |
/var/log/boot.log |
系统启动日志(内核初始化、服务启动成功/失败,如 nginx 启动失败) | systemd-journald |
/var/log/httpd/ |
Apache 服务日志(access.log:访问记录,error.log:错误记录) | Apache |
/var/log/nginx/ |
Nginx 服务日志(access.log:访问记录,error.log:错误记录) | Nginx |
/var/log/mysql/ |
MySQL 服务日志(error.log:错误记录,slow.log:慢查询记录) | MySQL |
四、日志服务常见问题排查
1. 问题:日志文件为空,没有日志生成
排查步骤:
- 检查日志服务是否运行:
systemctl status rsyslog、systemctl status systemd-journald; - 检查日志规则配置:查看
/etc/rsyslog.conf,确认日志源和级别是否配置正确(如 authpriv.* 是否指向/var/log/secure); - 测试日志发送:使用
logger命令手动发送日志,查看是否生成(logger "test log",然后tail /var/log/messages); - 检查磁盘权限:日志目录
/var/log/的权限是否为 755,属主属组是否为 root:root(权限不足会导致无法写入)。
2. 问题:远程日志无法转发到中央服务器
排查步骤(局域网场景):
- 检查中央服务器(接收端):
- 确认 rsyslog 已加载 UDP/TCP 模块(
grep -E "imudp|imtcp" /etc/rsyslog.conf); - 确认监听 514 端口(
netstat -tulnp | grep 514); - 检查防火墙是否开放 514 端口(
firewall-cmd --list-ports | grep 514,若未开放,执行firewall-cmd --add-port=514/udp --permanent并重启防火墙)。
- 确认 rsyslog 已加载 UDP/TCP 模块(
- 检查客户端(发送端):
- 确认 rsyslog 配置中已添加远程转发规则(
grep "@" /etc/rsyslog.conf); - 测试网络连通性:
telnet 192.168.1.100 514(TCP)或nc -zv 192.168.1.100 514 -u(UDP); - 重启 rsyslog 服务:
systemctl restart rsyslog。
- 确认 rsyslog 配置中已添加远程转发规则(
3. 问题:journalctl 无法查看历史日志(重启后日志丢失)
原因:
systemd-journald 默认未配置持久化存储,日志仅存于内存,重启后丢失。
解决方法:
- 创建 journal 持久化目录:
mkdir -p /var/log/journal; - 修改目录权限:
chown root:systemd-journal /var/log/journal、chmod 2775 /var/log/journal; - 重启 journald 服务:
systemctl restart systemd-journald; - 验证:
journalctl --disk-usage查看日志占用磁盘空间,重启后再用journalctl查看,确认历史日志存在。
五、日志服务学习与归档建议
结合你"记录整理知识"的习惯,建议按以下方式归档日志服务相关内容:
1. 归档结构(文件夹分类)
Linux日志服务/
├─ 1.基础概念/ # 日志级别、日志源、核心术语(本文第一部分)
├─ 2.syslog-rsyslog/ # 配置文件、命令、远程转发实战(本文第二部分一)
├─ 3.systemd-journald/ # journalctl命令手册、配置文件(本文第二部分二)
├─ 4.logrotate/ # 自定义轮转规则示例(nginx、mysql)、手动触发命令(本文第二部分三)
├─ 5.ELK部署/ # 局域网ELK部署步骤、Filebeat配置、Kibana仪表盘创建
└─ 6.常见问题/ # 本文第四部分的排查步骤,补充自己遇到的问题及解决方案
六、总结
Linux 日志服务的学习核心的是"从基础到进阶":
- 先掌握
rsyslog和journald(本地日志管理,解决单台主机排障); - 再掌握
logrotate(日志轮转,避免磁盘占满); - 最后学习 ELK 等集中式日志方案(企业级多主机日志管理)。