三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Linux 日志管理进阶

Linux 日志管理进阶

Linux 日志管理进阶

Linux 日志管理进阶笔记


一、日志轮替(logrotate)

1. 什么是日志轮替?

日志轮替是 Linux 中自动管理日志文件的机制:

  • 当日志文件达到指定条件(时间/大小)时,将旧日志改名备份,同时创建新的空日志文件。
  • 当备份日志数量超过设置值时,自动删除最旧的日志,避免日志文件过大占满磁盘。

2. 日志轮替的两种命名方式

配置方式 说明 示例
dateext 参数 按数字序号递增改名 securesecure.1secure.2 → ...
dateext 参数 以日期为后缀备份(推荐) secure-20201010secure-20201011

3. logrotate 配置详解

(1)全局配置文件

  • 主配置文件:/etc/logrotate.conf
  • 子配置目录:/etc/logrotate.d/(推荐在此目录单独配置,避免主文件过于臃肿)

(2)核心配置参数

参数 说明
daily/weekly/monthly 轮替周期:每天/每周/每月
rotate 数字 保留的备份日志数量(0=不保留备份)
compress 轮替后自动压缩旧日志
create mode owner group 创建新日志文件,并指定权限、所有者、所属组
mail address 轮替日志出错时,发送邮件通知
missingok 日志文件不存在时,忽略警告信息
notifempty 日志为空时,不执行轮替
minsize 大小 日志文件必须达到指定大小才轮替(即使时间周期到了也不轮替)
size 大小 仅按文件大小轮替,不按时间
dateext 使用日期作为备份日志的后缀
prerotate/endscript 轮替前执行的脚本命令
postrotate/endscript 轮替后执行的脚本命令

4. 配置示例:自定义日志轮替

方式1:在 /etc/logrotate.conf 中直接配置

/var/log/hsp.log {missingokdailycopytruncaterotate 7notifempty
}

方式2:在 /etc/logrotate.d/ 中创建子配置文件(推荐)

  1. 创建配置文件:/etc/logrotate.d/hsplog
    touch /etc/logrotate.d/hsplog
    
  2. 写入配置内容:
    /var/log/hsp.log {missingokdailycopytruncaterotate 7notifempty
    }
    
  3. 配置自动被主文件 include 读取,无需额外操作。

二、系统内存日志:journalctl

1. 什么是内存日志?

journalctl 用于查看 systemd 管理的内存日志,特点是:

  • 日志存储在内存中,重启系统后会被清空。
  • 可查看系统启动后的所有服务、内核日志,支持按时间、服务、进程过滤。

2. 常用命令

# 查看所有内存日志
journalctl# 查看最新的3条日志
journalctl -n 3# 查看指定时间段的日志
journalctl --since "19:00" --until "19:10:10"# 查看错误级别日志
journalctl -p err# 查看详细日志内容
journalctl -o verbose# 查看指定进程/服务的日志
journalctl _PID=1245 _COMM=sshd# 过滤sshd服务的日志
journalctl | grep sshd

三、实战案例:数据库备份 Shell 脚本

1. 需求分析

  • 每天凌晨 2:30 备份 hspedu 数据库到 /data/backup/db 目录。
  • 备份开始/结束时输出提示信息。
  • 备份文件以时间命名(如 2021-03-12_230201.tar.gz)。
  • 自动删除 10 天前的备份文件。

2. 脚本实现

#!/bin/bash# 备份目录
BACKUP=/data/backup/db
# 当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo "备份开始,时间:$DATETIME"# 数据库配置
HOST=localhost
DB_USER=root
DB_PW=hspedu100
DATABASE=hspedu# 创建备份目录(不存在则创建)
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"# 备份数据库并压缩
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/${DATETIME}.sql.gz# 打包为tar.gz格式
cd ${BACKUP}
tar -zcvf ${DATETIME}.tar.gz ${DATETIME}
rm -rf ${BACKUP}/${DATETIME}# 删除10天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;echo "备份数据库${DATABASE}成功~"

3. 定时任务配置(crontab)

# 编辑定时任务
crontab -e# 添加以下内容,每天凌晨2:30执行脚本
30 2 * * * /usr/local/bin/db_backup.sh

四、CentOS 7/8 日志管理对比

特性 CentOS 7 CentOS 8
日志服务 rsyslogd(主日志)+ journald(内存日志) 同样支持两者,journalctl 功能增强
日志轮替 logrotate 工具,配置文件路径不变 logrotate 兼容,推荐使用 /etc/logrotate.d/ 子配置
内存日志 journalctl 命令,重启清空 journalctl 命令支持更多过滤选项

五、日志管理最佳实践

  1. 轮替策略:重要日志(如 /var/log/secure)建议设置 daily 轮替,保留 30 天备份。
  2. 压缩备份:开启 compress 参数,节省磁盘空间。
  3. 定期清理:结合 find 命令,删除过期日志文件。
  4. 权限控制:日志文件权限设为 600,避免敏感信息泄露。
← 返回列表