需求:因为公司项目的日志输出在nohup.out中,一段时间后nohup.out文件会过大,导致日志无法写入,导致程序报错。
思路:采用定时器的方式,写一个定时器去执行linux服务器上的命令行,再通过命令行备份原有的nohup.out ,并修改为具体的日期,以便后续排查日志,并将原先的nohup.out清空,以便新的日志可以正常存入。
主启动类 :
//需要加一个注解开启定时器
@SpringBootApplication
//需要加一个注解开启定时器
@EnableScheduling
public class SmartBootApplication {
public static void main(String[] args) {
SpringApplication.run(SmartBootApplication.class, args);
}
}
//要把定时器的类作为组件注入,否则扫描不到就不会去执行定时器
@Component
//要把定时器的类作为组件注入,否则扫描不到就不会去执行定时器
@Component
public class TimingTask {
//具体的Cron表达式,根据Cron表达式设置具体是什么时间执行定时器
@Scheduled(cron = "0 0 2 * * ?")
// @Scheduled(cron = "* 59 17 * * ?")
public void dailyLogDeal() {
try {
//Java如何执行linux服务器上的.sh文件
Runtime.getRuntime().exec("/xxxx/xxx/xxxxxxx/xxxx/xxxxx.sh").waitFor();
System.out.println("定时任务执行 - > 每日日志保存成功");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
具体实现日志备份与清空的命令行怎么写:
即java代码中的
Runtime.getRuntime().exec("/data/auto_del_30_log.sh").waitFor();
中的.sh文件该怎么写
#获取前一天的日期
date=`date -d "yesterday" +%Y_%m_%d`
#复制原始nohup.out到备份目录,并以前一天的日期进行命名
cp /home/lgq/smartBoot/java/nohup.out /home/lgq/smartBoot/java/nohupLogs/$date.out
#清空原始nohup.out中的内容 /dev/null 这个文件是本身就自带的 里面的值就是空 因此可以直接拷贝过去来实现清空nohup.out
cat /dev/null > /home/lgq/smartBoot/java/nohup.out
vim auto_del_30_log.sh
#清理1个月前日志文件
find /data/nohupLogs -mtime +30 -exec rm -f {} \;
if [ ! -d /data/nohupLogs ];then
mkdir /data/nohupLogs
echo dir exist
fi
#取前一天的日期
date=`date -d "yesterday" +%Y_%m_%d`
cp /data/nohup.out /data/nohupLogs/$date.out
#清空原始nohup.out中的内容 /dev/null 这个文件是本身就自带的 里面的值就是空 因此可以直接拷贝过去来实现清空nohup.out
cat /dev/null > /data/nohup.out