linux/日志管理.md
2025-03-17 16:20:30 +08:00

5.4 KiB
Raw Permalink Blame History

日志管理


一:简介

在 Linux 系统中,日志管理是系统维护和故障排查的核心环节。系统和服务通过日志记录运行状态、错误信息和用户操作,合理管理日志有助于快速定位问题并保障系统安全。

二:日志管理

1. 日志文件的位置与类型

Linux 日志文件通常存储在 /var/log 目录下,常见日志文件如下:

日志文件 说明
/var/log/messages 系统级日志
/var/log/secure 与系统安全相关的日志
/var/log/yum.log 记录通过 yum 安装或更新的软件包信息。
/var/log/maillog 记录邮件服务
/var/log/cron 记录 cron 定时任务的执行情况
/var/log/dmesg 记录内核启动时的硬件检测和驱动加载信息。
var/log/audit/audit.log 记录系统审计日志
/var/log/btmp 记录失败的登录尝试
/var/log/wtmp 记录所有用户的登录、注销及系统启动/关机事件
/var/log/lastlog 记录每个用户最后一次登录的时间
/var/log/mysqld.log MySQL 数据库日志

2. 查看日志的工具

1. 基础工具

tail / head :查看日志尾部或头部内容

[root@wxin ~]# tail -n 100 /var/log/messages     # 查看最后 100 行
[root@wxin ~]# tail -f /var/log/nginx/access.log  # 实时追踪日志更新

grep:按关键词过滤日志

[root@wxin ~]# grep "error" /var/log/messages     # 查找包含 "error" 的行
[root@wxin ~]# grep -C 3 "failed" /var/log/audit/audit.log      # 显示匹配行及其前后 3 行

less:分页浏览日志

[root@wxin ~]# less +F /var/log/messages  # 进入实时滚动模式(按 Ctrl+C 退出)

2. 高级工具

journalctlsystemd 系统日志管理工具)

[root@wxin ~]# journalctl -u nginx.service      # 查看 nginx 服务日志
[root@wxin ~]# journalctl --since "2024-01-01" --until "2024-01-02"
[root@wxin ~]# journalctl -p err -b             # 查看本次启动后的错误日志

logrotate:日志轮转工具

[root@wxin ~]# logrotate -vf /etc/logrotate.conf  # 手动触发日志轮转并显示详情

三:日志轮转

日志轮转Log Rotation是系统管理中用于管理日志文件的重要机制其主要目的是避免单个日志文件过大导致磁盘空间耗尽同时保留历史日志以方便后续排查问题。

1. 日志轮转的核心功能

  • 分割日志:将单个日志文件按时间或大小分割成多个文件(例如 access.log1access.log2
  • 压缩旧日志:减少日志占用的磁盘空间(如使用 gzip )。
  • 删除过期日志:根据保留策略清理旧日志。
  • 无缝切换:轮转过程中不中断正在写入的日志(通过重命名文件或信号通知应用重新打开日志)。

2. 日志轮转策略

按时间轮转

  • 每日轮转:每天生成一个新日志文件(例如 nginx_20231101.log
  • 每周/每月轮转:适用于低频日志场景。
daily       # 每天轮转
rotate 7    # 保留最近7天的日志

按大小轮转

  • 当日志文件达到指定大小时触发轮转(如 100MB
size 100M   # 文件超过100MB时轮转
rotate 5    # 保留5个历史文件

混合策略

  • 同时限制时间和大小例如每天轮转但超过1GB立即轮转。

3. 示例

基础配置

/var/log/nginx/*.log {
    daily             # 按天轮转
    missingok         # 如果日志不存在,不报错
    rotate 30         # 保留30个历史文件
    compress          # 压缩旧日志默认用gzip
    delaycompress     # 延迟压缩前一个日志文件(方便排查最新日志)
    notifempty        # 如果日志为空,不轮转
    create 0640 www-data adm  # 新日志文件的权限、属主和属组
    sharedscripts     # 所有日志处理完后执行一次脚本
    postrotate
        systemctl reload nginx  # 通知Nginx重新打开日志文件
    endscript
}

按大小轮转

/var/log/app/app.log {
    size 100M         # 超过100MB时轮转
    rotate 5          # 保留5个历史文件
    compress
    dateext           # 使用日期后缀如app.log-20231101.gz
}

4. 高级配置选项

  • dateext:用日期格式作为轮转后的后缀(例如 access.log-20231101
  • dateformat:自定义日期格式(如 %Y%m%d-%H
  • olddir:将旧日志移动到指定目录。
  • maxage:删除超过指定天数的旧日志(例如 maxage 30
  • su:指定轮转时使用的用户/组(如 su www-data adm

5. 手动触发日志轮转

# 测试配置(不实际执行)
[root@wxin ~]# logrotate -d /etc/logrotate.d/nginx

# 强制执行轮转
[root@wxin ~]# logrotate -vf /etc/logrotate.d/nginx