Orange的运维学习日记--15.Linux日志管理

Orange的运维学习日记–15.Linux日志管理


系统日志记录是操作与维护 Linux 服务器的核心。通过审计、故障排查、安全监控等多种方式,日志为我们描绘了系统行为的全貌。下面从本地日志、集中式日志和系统化日志三个维度,深入剖析 Linux 日志管理实践。


本地日志管理

Linux 下大部分日志存放于 /var/log 目录,以纯文本方式保存。常见工具 taillessgrepawk 等可快速定位和过滤有价值的信息。

rsyslog 服务架构

  • systemd-journald
    收集 Linux 内核消息、引导早期输出、守护进程日志以及来自传统 syslog 的消息,统一格式化后写入二进制索引。
  • rsyslog
    从 journald 或内核接收消息,按规则写入文本文件、转发至远端服务器或输出到终端。模块化设计支持加密、数据库存储与自定义模板。

配置文件概览

  • /etc/rsyslog.conf
    主配置,通常包含 /etc/rsyslog.d/*.conf 中的细分规则。
  • /etc/rsyslog.d/*.conf
    可并行编写多份子配置,如应用专属日志规则或远程转发规则。

日志记录规则

每条日志根据设备类型(facility)和优先级(priority)分类,格式如下:

facility[连接符]priority    处理方式
Syslog 设备类型(facility)
代号描述
kern内核消息
user用户级消息
mail邮件系统
daemon系统守护进程
auth验证消息
authpriv私有验证消息
syslog日志守护进程
lpr打印子系统
news新闻子系统
uucpUUCP 子系统
cron定时作业系统
ftpFTP 守护进程
local0-7本地自定义(0–7)

在这里插入图片描述

优先级(priority)
等级描述
emerg系统不可用
alert必须立即采取措施
crit严重
err错误
warning警告
notice正常但重要
info信息
debug调试

在这里插入图片描述

连接符说明
符号含义
.指定单个优先级
;指定多个优先级
=精确匹配
!排除指定优先级
*通配所有优先级

在这里插入图片描述

处理方式
  • 写入日志文件
  • 发送到终端(console)
  • 转发到远端服务器

日志轮转与归档

默认通过 logrotate 定期归档 /var/log 下日志,避免单个文件过大。

  • 主配置位于 /etc/logrotate.conf
  • 子配置目录 /etc/logrotate.d/
  • 关键参数:
    • rotate 保留份数
    • size 超过指定大小即轮转
    • compress 是否压缩旧日志
    • postrotate 轮转后重启服务

示例:每天轮转 /var/log/messages,保留 7 天并压缩

/var/log/messages {
    daily
    rotate 7
    compress
    missingok
    notifempty
    sharedscripts
    postrotate
        systemctl reload rsyslog.service > /dev/null 2>&1
    endscript
}

自定义日志记录

某些应用需要额外日志文件,可在 /etc/rsyslog.d/ 中新增规则。例如,把 local5 级别日志写入专属文件:

local5.*    /var/log/myapp.log

重启 rsyslog 后,用 logger -p local5.info "message" 测试记录

logger -p local5.info "test my log"
cat /var/log/myapp.log
# Nov 10 10:32:26 centos7 xxx: test my log

日志安全与权限

  • 确保 /var/log 下文件仅 root 或相应服务用户可写
  • 使用 chmodchown 强化权限
  • 可结合 SELinux 强制执行策略
  • 转发日志到远端或数据库时,建议启用 TLS 加密模块(imtcp + omrelp + gtls

集中式日志管理

在多机部署场景下,将各主机日志集中到一台或多台日志服务器,便于统一检索、报警与审计。

服务端配置

  1. 在上级日志服务器启用接收模块

    # /etc/rsyslog.conf
    module(load="imtcp")               # 启用 TCP
    input(type="imtcp" port="514")     # 监听 514 端口
    
  2. 按主机存放日志,可用模板自动生成路径

    template(name="PerHost" type="string"
      string="/var/log/hosts/%HOSTNAME%/%PROGRAMNAME%.log")
    *.* ?PerHost
    & stop
    
  3. 重启并关闭防火墙

    systemctl restart rsyslog
    systemctl disable --now firewalld
    

客户端配置

在各主机上,将日志转发到上级服务器:

# /etc/rsyslog.d/remote.conf
*.* @@logserver.example.com:514

@ 表示 TCP;单 @ 表示 UDP。重启 rsyslog 后,所有本地日志即推送至集中服务器。


systemd-journald 日志

二进制存储优势

  • 索引化结构,支持快速查询、按字段过滤
  • 可保存完整元数据,如 _PID、_UID、_COMM、_EXE、_CMDLINE 等
  • 自动淘汰策略(可配置最大空间和保留期限)

日志持久化

编辑 /etc/systemd/journald.conf,设置 Storage:

参数描述
persistent存储在 /var/log/journal,重启后保留
volatile存储在 /run/log/journal,运行时保留
auto自动选择:若存在持久目录则持久化
vim /etc/systemd/journald.conf
# 修改为持久化
Storage=persistent
systemctl restart systemd-journald

高级检索

  • 实时跟踪:journalctl -f
  • 按时间:--since--until
  • 按优先级:-p err
  • 按服务:-u sshd.service
  • 按字段:_PID=1234SYSLOG_IDENTIFIER=kernel
  • 导出 JSON:journalctl -o json-pretty

日志清理

  • 按空间限制:SystemMaxUse
  • 按文件数:SystemMaxFiles
  • 手动清理:journalctl --vacuum-size=200M--vacuum-time=2weeks

日志分析

# 列出所有日志条目
journalctl

# 动态跟踪
journalctl -f

# 按启动次数
journalctl -b 0      # 本次启动
journalctl -b 1      # 上次启动

# 最近 5 条
journalctl -n 5

# 错误级别
journalctl -p err

# 时间过滤
journalctl --since today
journalctl --since "2025-07-28 14:00:00" --until "2025-07-28 15:00:00"
journalctl --since "-1 hour"

# 详细格式
journalctl -o verbose

# 指定单元
journalctl -u sshd.service

故障模拟

配置文件丢失

mv /etc/ssh/sshd_config .
systemctl restart sshd

使用 journalctl -f 发现:

/etc/ssh/sshd_config: No such file or directory

恢复文件并重启:

mv sshd_config /etc/ssh/sshd_config
systemctl restart sshd

SSH 配置参数错误

echo 'PermitRootLogin hahaha' >> /etc/ssh/sshd_config
systemctl restart sshd

日志提示:

unsupported option "hahaha"

移除错误行并重启:

sed -i '/hahaha/d' /etc/ssh/sshd_config
systemctl restart sshd

Apache 配置参数错误

yum install -y httpd
sed -i 's/Listen 80/Listen 80000/g' /etc/httpd/conf/httpd.conf
systemctl restart httpd

日志提示:

AH00526: Syntax error on line 42 of /etc/httpd/conf/httpd.conf: Invalid address or port

恢复端口并重启:

sed -i 's/Listen 80000/Listen 80/g' /etc/httpd/conf/httpd.conf
systemctl restart httpd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值