Linux 下 MES 和 Tomcat、Nginx 日志自动清理和切割 -YB

Linux 下 MES 和 Tomcat、Nginx 日志自动清理和切割 -YB

@acted by yuanbao at 20220720

目录

Linux 下 MES 和 Tomcat、Nginx 日志自动清理和切割 1 背景 2 Tomcat 日志的切割和清理 2.1 几种方式:2.2 logrotate 方式的具体步骤 2.3 最终效果 3 MES 日志的处理 3.1 问题一:日志打印级别异常 3.2 问题二:日志未自动清理 4 其他问题解决过程 5 附件:6 另一种方式解决 catalina.out 大文件问题 7 方式:Nginx 日志 access.log 可直接通过配置实现按日自动切分 8 方式:Tomcat 日志 Catalina.out 通过 cronolog 按日自动切分 9 方式:使用 Log4j2 处理 mes 日志

1 背景

宏发项目运维阶段。正式服为 Linux 系统,交付几个月后客户反馈磁盘占满。后来通过磁盘分析(见其他笔记),发现是 tomcat 的日志文件 catalina.out 达到了几十 GB,是文件不断增长导致,需要作切割。且 mes 日志一天内不同的类型都创建了很多,日积月累,都需要定期清理掉。
注:也可切割 nginx 日志 access.log 文件,同理。

2 Tomcat 日志的切割和清理

切割方式参考:Tomcat 日志分割的三种办法

2.1 几种方式:

  1. cronolog (文章最后第 8 章有补充)

  2. log4j (文章最后第 9 章有补充)

  3. Xshell 脚本

  4. logrotate 方式

此处使用 logrotate 方式,因为可与 linux 系统自身的定时任务 cron 结合,且能通过参数设置大小、数量、是否压缩等,较为便利。

参考 1:http://www.manongjc.com/detail/17-zgpmjpnaiukwwlp.html

参考 2:https://i4t.com/2837.html

2.2 logrotate 方式的具体步骤

在 /etc/logrotate.d/ 下,新建一个 tomcat 的文件,内容为:(大括号前的地址为 tomcat 中 catalina.out 文件的地址,据实修改)

/usr/local/apache-tomcat-8.5.78/logs/catalina.out {  
 copytruncate  
 daily   
 rotate 10  
 compress   
 missingok   
 notifempty   
 minsize 20M  
 dateext  
}

立即执行方式:

  • 手动执行所有 logrotate 任务:logrotate /etc/logrotate.conf

  • 手动执行某个特定的 logrotate 任务:logrotate -vf /etc/logrotate.d/tomcat

效果:

img

发现这个 logrotate 没有按照每天去执行。没定位到原因。

** 解决办法:** 用 Xshell 脚本结合 Linux 系统的计划任务共同实现。

1> 创建 xshell 脚本 autoLogrotate.sh 去执行 logrotate 命令,同时加日志记录。

  • echo $(date "+%Y-%m-%d %H:%M:%S") "logrotate the tomcat log..." >> /usr/local/autoRecord.log  
    /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat  
    echo $(date "+%Y-%m-%d %H:%M:%S") "logrotate the tomcat log successfully. " >> /usr/local/autoRecord.log
    

2> 给 xshell 脚本授权:

  • chmod +x ./autoLogrotate.sh

3> 设置文件属性:

  • # 使用vi打开文件  
    vi ./autoLogrotate.sh  
    # 转换格式  
    :set ff=unix  
    # 保存文件  
    :wq
    

4> 创建定时任务:

  • 通过 crontab -l 进行查看

  • 修改:crontab -e

  • 最终创建的计划任务项:img

2.3 最终效果

每天 23:59 执行切割 catalina.out 文件,并作压缩,只保留十天的记录。

img

3 MES 日志的处理

3.1 问题一:日志打印级别异常

mes 日志级别设置为 INFO,但是出现了记录了 DEBUG 级别(优先级比 INFO 低等级)的日志的现象,导致每日日志爆满。又由于限制了日志文件大小为 10mb、数量为 20 个,导致可能滚动式的覆盖了日初的日志。

问题排查:

  1. 对比 war 包中、mestar_home 项目缓存配置文件夹中的 log4j2.properties,未严格一致,修改一致后,问题仍存在。

  2. 宏发的正式服为 Linux、测试服为 Windows,客户打的 war 中偶尔存在未将 application.properties 中的 mestar_home 的路径设置准确,导致 tomcat 包中有 D:这样的文件夹。导致可能未按自己的 log4j2.properties 配置去走。

image-20220804152825893

删掉后重启服务,问题解决。

对日志的其他尝试:

  1. 后也将日志数量改大,可生效。

  2. 想要关掉滚动方式,删掉后报错导致服务起不来。未继续尝试了。

    image-20220804155252727

3.2 问题二:日志未自动清理

日志分 mes.log、error.log、interface.log、message.log、schedule.log,需要清理掉超过十天的日志,节省存储空间。

解决方式:Xshell 脚本 + 定时任务

具体步骤:

1> 创建 xshell 脚本 autodel.sh,脚本内容如下:

echo $(date "+%Y-%m-%d %H:%M:%S") "Delete the tomcat log..." >> /usr/local/autoRecord.log  
find /usr/local/apache-tomcat-8.5.78/logs/ -mtime +10 -name "*log*" -exec rm -rf {} \;    #删除10天前的日志(注意:{} \中间有空格)  
echo $(date "+%Y-%m-%d %H:%M:%S") "Delete the tomcat log successfully. " >> /usr/local/autoRecord.log  
​  
echo $(date "+%Y-%m-%d %H:%M:%S") "Delete the mes log..." >> /usr/local/autoRecord.log  
find /data/mestar/prj-hfzh/logs/ -mtime +10 -name "*log*" -exec rm -rf {} \;    #删除10天前的日志(注意:{} \中间有空格)  
echo $(date "+%Y-%m-%d %H:%M:%S") "Delete the mes log successfully. " >> /usr/local/autoRecord.log

给 xshell 脚本授权、设置文件属性此处略,参考 2.2。

2> 创建定时任务,参考 2.2。

img

4 其他问题解决过程

查看 linux 系统的定时任务运行状况,可看 /var/spool/mail/root 有报错:

img

报错: -bash:$‘\r‘: command not found

解决:https://blog.csdn.net/chenbaixing/article/details/118083528 vi 修改文件属性解决

** 结论:** 后续可通过这个 /usr/local/autoRecord.log 文件与 /var/spool/mail/root 搭配,可追踪定时任务执行情况。包含 mes 日志自动清理、tomcat 日志自动切割清理等。

5 附件:

autodel.sh

autoLogrotate.sh

6 另一种方式解决 catalina.out 大文件问题

可以不用写定时任务或 logrotate. 直接修改 tomcat 的日志配置文件。【不确定】

附:logging.properties

7 方式:Nginx 日志 access.log 可直接通过配置实现按日自动切分

在 nginx 的配置文件中,生成 access.log 的地方:

调整配置,这样当天的日志会写入当天日期命名的文件中。

log_format access-upstream '$time_iso8601|$request|$remote_addr|$upstream_response_time|$http_user_agent|$http_x_forwarded_for';   
map $time_iso8601 $logdate {  
 '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;  
 default    'date-not-found';  
}  
access_log logs/access-$logdate.log ; # access_log off; # 实在不需要的话,可以将其关闭(如心跳请求,会记录日志)        

在 window 上已亲测 ok,linux 应该也可以。

8 方式:Tomcat 日志 Catalina.out 通过 cronolog 按日自动切分

参考:https://blog.csdn.net/sinat_33151213/article/details/127571217

主要步骤:(未验证)

1、安装 cronolog

2、修改 catalina.sh 文件:

# cronolog填写你自己的位置,通过whereis cronolog查看具体位置   
org.apache.catalina.startup.Bootstrap "$@" start 2>&1 | /usr/sbin/cronolog "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out >> /dev/null &            

9 方式:使用 Log4j2 处理 mes 日志

MES 服务中使用了 Log4j2,是支持按日滚动式覆盖旧日志(超出了日限定数量),并删除超期的日志的。

在 log4j2.properties 中增加:

appender.rolling.strategy.action.type = Delete  
appender.rolling.strategy.action.basepath = ${dir}  
appender.rolling.strategy.action.condition.type = IfLastModified  
appender.rolling.strategy.action.condition.age = 30d

image-20240108112539525