空间爆了,滥用System.out啊

最近,系统有出现磁盘空间被耗尽的问题(磁盘空间20G,扣除系统及部署后可用空间14G,应用程序部署在linux上);原来怀疑是应用程序中使用的文件缓存太大,占用了太大的资源;不过检查的时候发现缓存文件目录 仅占用了 3.8G,应用程序下的所有目录总计占用6G,达不到爆满的情况;

 

        在检查的时候,发现日志文件有问题,系统使用了log4j的日志框架,log4j.xml采用的配置是:

 

日志文件按照容量大小拆分,最大10M

<appender name="App" class="org.apache.log4j.RollingFileAppender">

        <param name="File" value="../logs/mapp-server.log" />

        <param name="MaxFileSize" value="10240KB" />

        <param name="MaxBackupIndex" value="3" />

        <param name="encoding" value="gbk" />

        <layout class="org.apache.log4j.PatternLayout">

                <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p [%c-%L] - %m%n" />

                 </layout>

</appender>

 

不过生成的日志文件每个都不止10M;觉得很奇怪;

昨天干脆修改为 日志文件按天拆分;

 <appender name="App" class="org.apache.log4j.DailyRollingFileAppender">

        <param name="File" value="../logs/mapp-server.log" />

        <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />

        <param name="encoding" value="gbk" />

        <layout class="org.apache.log4j.PatternLayout">

                <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p [%c-%L] - %m%n" />

        </layout>

  </appender>

 

今天早上检查日志的时候,发现2012-11-15的日志已经生成; ll 命令发现,2012-11-15的日志文件超大300M;再细看,发现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是一个玩意儿啊。。

猜你喜欢

转载自yugenning.iteye.com/blog/1727779