SpringMVC+Log4j配置定时生成、删除日志

2022年7月14日08:13:24

SpringMVC开启定时任务

建议开发者不要养成面向百度编程的习惯,可以参考,但是一定要知道利用官方文档log4j官方文档

配置SpringMVC.xml

xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task  
http://www.springframework.org/schema/task/spring-task-3.2.xsd
    // 扫描包配置
    <context:component-scan
		base-package="com.carson.test.controller" />
	<context:component-scan
	// 开启定时任务注解配置
	<task:annotation-driven />

配置log4j.properties

# rootLogger 第一参数为日志级别, 其后参数为日志载体
# 定义日志级别为INFO,那debug级别的日志将不会被打印出来,stdout、I、E可以任意但必须和后面配置的名称对应
# OFF>FATAL>ERROR>WARN>INFO>DEBUG>ALL
log4j.rootLogger=INFO,stdout,I,E
 
#定义日志输出目的地为控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=DEBUG
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method: %l%n%m%n
 
# 定义日志输出到文件 按时间划分日志文件,超过200MB重新生成另一个文件,原来文件名称由"xxx.log" -> "xxx.log1"
# info
log4j.appender.I=org.apache.log4j.DailyRollingFileAppender
log4j.appender.I.File=/Users/ksmasterasy/Desktop/logs/info/info.log
log4j.appender.I.Append=false
log4j.appender.I.Threshold=INFO
log4j.appender.I.layout=org.apache.log4j.PatternLayout
log4j.appender.I.DatePattern ='_'yyyy-MM-dd'.log'
log4j.appender.I.MaxFileSize=200MB
log4j.appender.I.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} - [%p]-[%l] %m%n
# error
log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=/Users/ksmasterasy/Desktop/logs/error/error.log
log4j.appender.E.Append=false
log4j.appender.E.Threshold=ERROR
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.DatePattern ='_'yyyy-MM-dd'.log'
log4j.appender.E.MaxFileSize=200MB
log4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} - [%p][%l] %m%n

定时任务执行类

该类配在了controller包目录下,原因参考上面配置的springmvc配置文件

@Component
public class ScheduleTask {

	private static final Logger log = Logger.getLogger(ScheduleTask.class);
	// 脚本路径
	private static String SHELL_FILE_DIR = "/usr/local/shell/";
	// 脚本名称
	private static String FILE_NAME = "auto_del_log.sh";
	
	/**
	 * @Description: 每天检查一次,每次删除30天以前产生的日志(待优化,删除时间间隔可以通过代码传参数)
	 */
    //	@Scheduled(cron = "0/10 * * * * ?")  开发测试配置10s执行一次
	// 每月10号9点执行任务
	@Scheduled(cron = "0 15 9 10 * ?")  
	public void work() throws Exception {
		log.info("执行删除日志shell脚本...");
		String shellPath = SHELL_FILE_DIR +FILE_NAME;
		LinuxCommandUtil linuxCommandUtil = new LinuxCommandUtil();
		// 返回值为0,说明命令执行成功,为1删除info日志出现错误,为2说明删除error日志错误
		int res = linuxCommandUtil.executeCommand(shellPath);
		log.info(String.format("执行删除日志shell脚本结果:%d", res));		
	}
}

LinuxCommandUtil是执行shell脚本命令的封装类,如果想简单省事的话,可以直接在服务器编写脚本,crontab -e配置定时任务,也是一样的,都是一个道理,如果强迫症非要用代码实现,可以用以下代码替代,实质上LinuxCommandUtil就是对这个命令进行的封装

// 更改脚本读写执行权限的linux命令
String permissionStr = "chmod 777 " + SHELL_FILE_DIR + FILE_NAME;
// 执行上述命令
Process process = Runtime.getRuntime().exec(permissionStr);
// 脚本执行之后exit返回的预期值
int status = process.waitFor();
// 执行脚本命令
String cmdStr = "bash  " + SHELL_FILE_DIR + FILE_NAME;
// 执行上述命令
Process process = Runtime.getRuntime().exec(cmdStr);

shell脚本

我编写shell脚本暂时不是很熟练,写的很浅显不规范,虽然能用,但我不能接受,后续优化了之后会改进,至少达到代码规范,灵活变参

# aoto del xxx day ago logfile
# 参数个数是否为3
if [ $# -ne 3 ]
then
    echo $1
    echo $2
    echo $3
    exit 100
fi
# 文件路径、时间限制变量赋值
FILE_PATH_INFO=$1
FILE_PATH_ERROR=$2
TIME_LIMIT=$3
# 删除FILE_PATH_INFO目录下30天以前的、以.out格式结尾的文件
find FILE_PATH_INFO -mtime +30 -name "*.out" -exec rm -rf {} \;
# 上述命令执行是否成功
if [ $? -ne 0 ]
then
        exit 1
fi
# 删除FILE_PATH_INFO目录下30天以前的、以.out格式结尾的文件
find FILE_PATH_ERROR -mtime +30 -name "*.out" -exec rm -rf {} \;
# 上述命令执行是否成功
if [ $? -ne 0 ]
then
        exit 2
fi
exit 0

最后也是希望大家能多提意见,不管的好的意见或者批评的话语都可以的,你如果有什么疑惑可以留言我会在1小时之内尽快为你解答,或者发邮件ksmasterasy@icloud.com我都能及时收到消息,也是希望大家能够多交流意见。

  • 作者:IT开发与架构设计
  • 原文链接:https://blog.csdn.net/KSMaster/article/details/103319999
    更新时间:2022年7月14日08:13:24 ,共 3524 字。