Loading...

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

建议开发者不要养成面向百度编程的习惯,可以参考,但是一定要知道利用官方文档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我都能及时收到消息,也是希望大家能够多交流意见。