在Linux环境上,有些java项目日志量太多,导致不方便查询日志。有些将日志堆在一个文件里,导致日志量太多,不方便查看历史日志。
这个时候可以在java代码里进行日志分割。
此文章是另一种日志分割,在Linux系统上对已生成的日志按照日期和文件大小进行切割,最终的结果就是一个天一个文件夹,每个文件夹里有那一天对应的历史日志。日志切割之后 ,会将原来的文件给清空。.
切割日志脚本:
创建一个shell脚本,例如:splitLog.sh
#!/bin/bash
# Author: haodage
# log.out 日志分割
this_path=/logs #日志所在路径
current_date=`date -d "-1 day" "+%Y%m%d"` #时间
cd $this_path
echo $this_path
echo $current_date
do_split(){
[ ! -d log/${current_date} ] && mkdir -p log/${current_date}
split -b 200M -d -a 4 ./log.out ./log/${current_date}/ #切分日志,200M每块,到log文件中,格式为:20210615/0001
if [ $? -eq 0 ];then
echo "Split is finished!"
else
echo "Split is Failed!"
exit 1
fi
}
do_del_log(){
cat /dev/null > log.out #清空日志文件
# > log.out
}
if do_split ;then
do_del_log
echo "shch is split Success"
else
echo "shch is split Failure"
exit 2
fi
代码解释:
- #!/bin/bash 解释此脚本的shell的路径(必须要有)
- current_date=`date -d "-1 day" "+%Y%m%d"` #当前时间,-1 day 是当前时间-1天,0当前时间,1当前时间+1天,例如:当前2021-06-17,结果就是20210616
- [ ! -d log/${current_date} ] && mkdir -p log/${current_date} #判断在this_path下面是否有log//${current_date}文件夹,没有的话会进行创建,mkdir -p 如果上级文件夹不存在,也会创建
- split -b 200M -d -a 4 ./log.out ./log/${current_date}/ #切分日志,200M每块,到log文件中,格式为:20210615/0001,4表示文件名是从0000开始累加的
- cat /dev/null > log.out #清空日志文件
如果切割的文件是在实时写进去的话,这个时候如果清空文件,会产生“文件空洞”(文件大小暂时是0,当有写入的话,打下会立马回到清空之前的大小,但是之前的都是空。这就是文件空洞)。解决方法:对于java项目来说,在指定写入日志的配置地方,需要用两个 ">" ,这样的话清空文件时,写入位置置零,追加写入会从起始位置开始写入,不会产生文件空洞
例如
nohup java -jar /app/web.jar --spring.config.location=/app/application-ali.yml > /app/log.out 2>&1 &
改成
nohup java -jar /app/web.jar --spring.config.location=/app/application-ali.yml >> /app/log.out 2>&1 &
效果:
切割其他文件也可以的
和Linux定时任务组合一起就可以,让系统自己定时切割啦,比如:我想让他每天23:55进行日志切割。