Redian新闻
>
Linux 日志管理经验总结( crontab + logrotate )

Linux 日志管理经验总结( crontab + logrotate )

公众号新闻

链接:https://www.cnblogs.com/xiaoyaozhe/p/17671275.html

日志管理目标

日志的管理,一般包括两大部分

  1. 日志内容,合理的日志内容(日志锚点,内容格式,等)可以为应用服务的执行记录、问题排查提供最有力的帮助

  2. 日志存档规则,包括日志分割方式(按日期、按文件大小,等),日志存档数量,如只保存最近一个月,等

对于自行开发的应用服务,日志的管理可以由开发人员通过日志组件定制化,如logback,log4j等,但对于安装部署的第三方组件如MySQL、nginx、redis等,以及开发引用的第三方组件如nacos,sentinel等,除非组件开放了丰富的日志配置参数,否则将无法按照开发人员的要求管理日志文件。

 

特殊日志场景

一些特殊应用服务或组件,如果没有进行特定的配置操作,默认情况下将使日志文件不受控制,为后期清理造成麻烦,常见的有

  • 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,运行过程中,对日志存储文件将使用文件句柄跟踪,如此会有以下问题:

  1. 将日志文件重命名,同时新建一个同名的文件,组件依然会向原来的文件中输出日志

  2. 将日志文件删除(rm -f),也需要同时将应用服务组件进程重启才行,否则删除的文件也会由于被占用而无法释放磁盘资源

  3. 删除但被占用的文件将无法通过 ls -l 命令查看,也无法通过 du -sh 命令统计磁盘占用,但 df -h 命令会显示真实磁盘占用,只能通过 lsof 命令,查看打开的文件描述符,对运维造成很大麻烦

针对这种情况

  1. 如果只是单次清理文件,可以使用清空文件的方式,如 echo > log.log,或其他清空的方式,但切记不能直接 rm -f 删除

  2. 如果已经执行 rm -f 删除,则可以使用 lsof | grep -i deleted 命令查看被删除但无法回收的文件,然后将相应的进程重启即可回收

  3. 如果要保留日志内容,又要控制存储容量,则需要使用logrotate的 拷贝+清空 方式,即只是将日志文件内容拷贝一份存档,然后清空当前日志文件(而非删除)

 

特殊工具 - logrotate

对于不方便进行自定义日志管理的应用服务组件,可以自定义脚本维护,可以自行开发应用软件维护,但强联推荐使用Linux系统集成的日志管理工具logrotate,该工具由Linux系统crontab定时调度,支持为相关日志文件(或其他文件)自定义存储规则,但日志内容只能按照应用服务组件的实现输出。

 

logrotate提供的功能参数很多,比较常用的如下

  • 日志分割周期

  • 日志文件扩展名

  • 日志文件分割方式,包括新建+删除,拷贝+清空,等,适用不同应用服务场景

  • 日志内容压缩

  • 日志文件存档数量

 

logrotate 命令格式:logrotate [OPTION...] <configfile>-d, --debug :debug模式,测试配置文件是否有错误。-f, --force :强制转储文件。-m, --mail=command :压缩日志后,发送日志到指定邮箱。-s, --state=statefile :使用指定的状态文件。-v, --verbose :显示转储过程。
vi /etc/logrotate.d/nginx #在/etc/logrotate.d/目录下新建nginx文件,内容如下:/usr/share/nginx/log/*.log{dailymissingokrotate 7compressdelaycompressnotifemptycreate 644 root rootsharedscriptspostrotate[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`endscript}

#调用方法logrotate -d /etc/logrotate.d/nginx#结合crontab定时执行 echo "0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx > /dev/null 2>&1" >> /var/spool/cron/root


#参数说明:compress 通过gzip 压缩转储以后的日志nocompress 不做gzip压缩处理copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。nocopytruncate 备份日志文件不过不截断create mode owner group 轮转时指定创建新文件的属性,如create 0777 nobody nobodynocreate 不建立新的日志文件delaycompress 和compress 一起使用时,转储的日志文件到下一次转储时才压缩nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。missingok 如果日志丢失,不报错继续滚动下一个日志errors address 专储时的错误信息发送到指定的Email 地址ifempty 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。notifempty 当日志文件为空时,不进行轮转mail address 把转储的日志文件发送到指定的E-mail 地址nomail 转储时不发送日志文件olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统noolddir 转储后的日志文件和当前日志文件放在同一个目录下sharedscripts 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本prerotate 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行postrotate 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行daily 指定转储周期为每天weekly 指定转储周期为每周monthly 指定转储周期为每月rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份dateext 使用当期日期作为命名格式dateformat .%s 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数size(或minsize) log-size 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
#当日志文件 >= log-size 的时候就转储。以下为合法格式:(其他格式的单位大小写没有试过)size = 5 或 size 5 (>= 5 个字节就转储)size = 100k 或 size 100ksize = 100M 或 size 100M

附录: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}


附录:关于常用组件运行时日志管理

  1. nginx不支持自动清理,默认单文件持续写入,且不会自动滚动

  2. mysql不支持自动清理,默认单文件持续写入,且不会自动滚动

  3. zookeeper默认支持自动清理(限制文件大小和个数),log4j配置文件维护

  4. redis不支持自动清理,只记录少量核心日志,单文件持续写入,但默认只记录少量核心日志,可以不处理

  5. kafka的数据记录日志(topic、offset等),支持自动清理,配置文件维护

  6. kafka操作日志,默认在安装目录logs目录,支持自动滚动,但不会自动清理,log4j配置文件维护

END

官方站点:www.linuxprobe.com

Linux命令大全:www.linuxcool.com

刘遄老师QQ:5604215

Linux技术交流群:2636170

(新群,火热加群中……)

想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
Linux计划任务crontab运行脚本不正确的问题Linux日志管理经验总结(crontab+logrotate)高效linux 日志管理:journalctl命令The Shawnshank Redemption中文版话剧Linux 统计Web服务日志命令Java日志通关(二) - Slf4j+Logback 整合及排包马哥亲讲!4天搞定Loki日志栈!【Linux进阶云原生实战】我和老伴(七)Lindroid 开源应用:在安卓手机 / 平板上安装 GNU / Linux 发行版年薪超$170K!NVIDIA新开2024 New Graduate Program活动 | 7.16 参与哥大赋能,推动社会创新:Incite Global Change Program在线宣讲会女生来!英国NatWest Group开放Women Program申请高效日志管理:通过 Systemd Journal 收集日志的终极指南Linux之父 Linus Torvalds 编译 arm64 Linux 内核又有 “ 新欢 ”:Ampere AArch64Linux 有多重要?这么说吧,只要是干 IT 相关的,学 Linux 是绕不过去的 “ 坎儿 ”别吃了信息差的亏!快来看孟德尔随机化知识库全是过来人的经验总结,抓住机会冲一区!精选DS岗位丨Thumbtack、Micron Technology、Gallagher等公司持续热招!毁损肺患者行甲状腺手术麻醉管理经验分享一例Linux 系统日志分析与管理美股基本面 - 2024_03_11 * 晨报 * 金山云盘前涨逾14% H股大幅上涨近19% 小摩上调其评级至超配。比特币市申请美国生物医学博士的经验总结Tomcat 调优总结(Tomcat自身优化、Linux内核优化、JVM优化)eGastroenterology | PM2.5 暴露不仅会影响呼吸系统,还会损害消化系统!Work in Progress: The Changing Face of China’s Migrant Workforce西班牙语还是法语Java日志通关(四) - Logback 介绍在Linux中,如何在Linux中使用Ansible进行自动化部署?King GDC演讲:制作15000个关卡的经验总结,如何做好三消关卡?精选SDE岗位丨Micron Technology、ICF、Boeing等公司持续热招!Phantom Fame: In China, Debate Grows Over AI-Cloned CelebritiesCVPR 2024 | 知识蒸馏中的Logit标准化:辅助logit-based KD算法稳定涨点买方巨头|Partners Group 已开2025 Financial Analyst ProgramLinux 大量日志,7 个方法教你快速定位错误!从焦虑到从容:求职过程中的经验总结8000 血壮山河之军心似铁 序言
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。