0%

log4j日志文件在程序运行过程中进行清空操作

log4j是Apache基金会的一个开源项目,作为一个java日志框架,能够方便地在程序中记录日志,提供许多记录日志的选项和功能。日志文件一般是不允许修改的,在隐藏权限中加入了只能增加不能删减的权限。但是,我在近期做了一个项目,需要在程序运行过程中将日志文件上传至数据库,上传之后要清空日志文件重新记录。我尝试了一下几种方法:

  1. 将记录日志的文件删除,让日志框架重新生成
  2. 将记录日志的文件删除,并手动创建名称一致的日志文件
  3. 复制一个log4j自动生成的空的同名日志文件来覆盖旧的日志文件
  4. 调用linux命令echo > <log_file_name>来清空日志
    经过测试发现,log4j生成的日志文件只要被移动或删除,log4j就不会继续向其中写入日志,复制过来的空的同名日志文件也是一样的情况。调用linux命令清空日志文件之后,log4j能向日志文件中写入内容,但是不能被识别为txt或log文件,无法用编辑器打开查看(有例外,Atom编辑器能查看到其中的内容),gedit会说字符编码无法识别,无法打开;sublime会直接将这个文件当作二进制文件来打开,只能看到其中的0101内容。我用vim将其打开,发现在文件的开始处有许多“@^@^”这样的内容,在网上查到这是一种正常编码格式无法识别的字符,也称为“/0”。因此,只要将这些编码无法识别的内容除去即可。在网上查到了一个sed指令可以做这件事。使用如下代码来除去“@^”:
1
sed -r 's/\x0//g' -i <file_name>

除去之后果然能够用gedit、sublime等编辑器打开了,但是还是存在一个问题,当用这个语句处理过日志文件之后,相当于将日志文件做了修改(文件本身修改,echo > <log_file_name>只是内容修改),log4j框架就不能继续向其中写入日志内容了。我采用的方法是先将日志文件复制到一个临时的地方,进行sed操作之后就上传到数据库,上传完成之后就删除,然后用echo > <log_file_name>将原日志文件清空,使log4j继续记录。

清空日志文件的linux语句:

1
2
3
4
5
6
: > filename
> filename
echo "" > filename
echo /dev/null > filename
cat /dev/null > filename
truncate filename --size 0

我之后采用了最后一种方法,因为其他的方法有些会在日志文件开始产生一行空行。
此外,在用java的exec函数执行linux命令时,有些符号是不能在java中直接使用的,例如”>”、引号等。这时候,需要加上如下代码对命令进行修正:

1
2
3
String[] cmdarray = {"/bin/sh", "-c", cmd};
Process ps = Runtime.getRuntime().exec(cmdarray);
ps.waitFor();

其中cmd是要执行的linux指令的String字符串。