日志管理目标
日志的管理,一般包括两大部分- 日志内容,合理的日志内容(日志锚点,内容格式,等)可以为应用服务的执行记录、问题排查提供最有力的帮助
- 日志存档规则,包括日志分割方式(按日期、按文件大小,等),日志存档数量,如只保存最近一个月,等
特殊日志场景
一些特殊应用服务或组件,如果没有进行特定的配置操作,默认情况下将使日志文件不受控制,为后期清理造成麻烦,常见的有- nohup方式启动应用服务,如果未配置日志重定向,或者重定向到了单文件,则系统将日志持续输出在nohup.out文件或重定向的单文件
- mysql数据库支持配置日志文件路径,但无法自动清理日志内容
- nginx支持配置日志内容模板以及日志文件路径(默认access.log、error.log),但无法自动清理日志内容
特殊工具 - 定时清理
可以使用Linux自带定时工具 crontab + 清理日志脚本的方式,实现定时清理,示例如下crontab -e # 定时清理日志,保留最近7天 1 0 * * * find /logs.dir/ -mtime +7 | xargs rm -rf特别关注 Linux系统下,有些应用服务组件如nginx与MySQL,运行过程中,对日志存储文件将使用文件句柄跟踪,如此会有以下问题:
- 将日志文件重命名,同时新建一个同名的文件,组件依然会向原来的文件中输出日志
- 将日志文件删除(rm -f),也需要同时将应用服务组件进程重启才行,否则删除的文件也会由于被占用而无法释放磁盘资源
- 删除但被占用的文件将无法通过 ls -l 命令查看,也无法通过 du -sh 命令统计磁盘占用,但 df -h 命令会显示真实磁盘占用,只能通过 lsof 命令,查看打开的文件描述符,对运维造成很大麻烦
- 如果只是单次清理文件,可以使用清空文件的方式,如 echo > log.log,或其他清空的方式,但切记不能直接 rm -f 删除
- 如果已经执行 rm -f 删除,则可以使用 lsof | grep -i deleted 命令查看被删除但无法回收的文件,然后将相应的进程重启即可回收
- 如果要保留日志内容,又要控制存储容量,则需要使用logrotate的 拷贝+清空 方式,即只是将日志文件内容拷贝一份存档,然后清空当前日志文件(而非删除)
特殊工具 - logrotate
对于不方便进行自定义日志管理的应用服务组件,可以自定义脚本维护,可以自行开发应用软件维护,但强联推荐使用Linux系统集成的日志管理工具logrotate,该工具由Linux系统crontab定时调度,支持为相关日志文件(或其他文件)自定义存储规则,但日志内容只能按照应用服务组件的实现输出。 logrotate提供的功能参数很多,比较常用的如下- 日志分割周期
- 日志文件扩展名
- 日志文件分割方式,包括新建+删除,拷贝+清空,等,适用不同应用服务场景
- 日志内容压缩
- 日志文件存档数量
附录:logrotate简易配置
MySQL /data/mysql/log/mysqld.log { daily dateext dateyesterday copytruncate notifempty missingok olddir backup rotate 60 compress } nginx /usr/local/nginx/logs/access.log /usr/local/nginx/logs/error.log { daily dateext dateyesterday copytruncate notifempty missingok olddir backup rotate 30 compress }
附录:关于常用组件运行时日志管理
- nginx不支持自动清理,默认单文件持续写入,且不会自动滚动
- mysql不支持自动清理,默认单文件持续写入,且不会自动滚动
- zookeeper默认支持自动清理(限制文件大小和个数),log4j配置文件维护
- redis不支持自动清理,只记录少量核心日志,单文件持续写入,但默认只记录少量核心日志,可以不处理
- kafka的数据记录日志(topic、offset等),支持自动清理,配置文件维护
- kafka操作日志,默认在安装目录logs目录,支持自动滚动,但不会自动清理,log4j配置文件维护