在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

代码解释:

  1. #!/bin/bash    解释此脚本的shell的路径(必须要有)
  2. current_date=`date -d "-1 day" "+%Y%m%d"`  #当前时间,-1 day  是当前时间-1天,0当前时间,1当前时间+1天,例如:当前2021-06-17,结果就是20210616
  3. [ ! -d log/${current_date} ] && mkdir -p log/${current_date}    #判断在this_path下面是否有log//${current_date}文件夹,没有的话会进行创建,mkdir  -p 如果上级文件夹不存在,也会创建
  4. split -b 200M -d -a 4 ./log.out ./log/${current_date}/  #切分日志,200M每块,到log文件中,格式为:20210615/0001,4表示文件名是从0000开始累加的
  5. 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 &

效果:

centos7配置 logrotate 日志切割audit linux日志切割_定时任务

centos7配置 logrotate 日志切割audit linux日志切割_java_02

切割其他文件也可以的

 

和Linux定时任务组合一起就可以,让系统自己定时切割啦,比如:我想让他每天23:55进行日志切割。