最近,系统有出现磁盘空间被耗尽的问题(磁盘空间20G,扣除系统及部署后可用空间14G,应用程序部署在linux上);原来怀疑是应用程序中使用的文件缓存太大,占用了太大的资源;不过检查的时候发现缓存文件目录 仅占用了 3.8G,应用程序下的所有目录总计占用6G,达不到爆满的情况;
在检查的时候,发现日志文件有问题,系统使用了log4j的日志框架,log4j.xml采用的配置是:
日志文件按照容量大小拆分,最大10M;
不过生成的日志文件每个都不止10M;觉得很奇怪;
昨天干脆修改为 日志文件按天拆分;
今天早上检查日志的时候,发现2012-11-15的日志已经生成; ll 命令发现,2012-11-15的日志文件超大300多M;再细看,发现2012-11-15的日志文件最近的写入日期是 11-16 09多;觉得不应该;
红色部分,很有问题;
使用tail -f 检查日志文件,发现文件内容还在刷新;而且输出的日志信息不是log4j日志框架所输出的格式;初步怀疑是System.out搞的鬼;
搜索工程源码目录,在一个对外接口的方法中找到System.out,经过比对,可以确认这个输出的内容就是日志中一直刷新的内容;而且,系统上线之后,该方法是对外统一入口,访问量很大;输出非常频繁;
后面将这个System.out 修改为 logger.debug 输出,一切OK;
那么为什么会出现这个问题呢?
System.out输出是输出到控制台啊,为什么会搞到日志文件中呢;
我回想起之前查看weblogic的启动命令(startWeblogic.sh)的时候,出现的一段内容:
其中标红的一段,被修改为nohup >>XXXX.log;
这个就表示了,控制台日志被输出到了日志文件了,也就是说System.out还是会输出日志文件了;
但是日志文件,在11.16被框架修改了名称为 xxxx.2012-11-15.log,那么为什么System.out还依旧那么的执着呢,不是输出到新的文件中呢?反而非要死乞白赖的输出到改名后的文件呢;;
这个是nohup的问题了。。nohup启动之后,指定输出文件,那么就生成了一个句柄;这个句柄一直在,认目标;中间如果文件被改名了,那么还是输出到改名后的文件;而不是新的同名文件;如果文件很不幸被删除了,,那么恭喜你,nohup还会一直输出,而且句柄不释放,空间不释放,而且还不断增加,而你查目录占用空间还查不出来;恭喜你,一段时间之后,你会发现空间爆了;
nohup没有错,人家就是这个样子的;
System.out也木有错,说好了是输出带控制台;
错的是有了日志框架不用,非要用System.out;尼玛,有不有,以后在正式提交的代码中,严禁看到System.out;
PS:printStackTrace 和 System.out是一个玩意儿啊。。