日期:2014-05-17  浏览次数:20751 次

log4j怎么用subAppend方法来分割日志
求org.apache.log4j.WriterAppender对象subAppend(LoggingEvent event)方法的使用例子
不知道怎么去取得LoggingEvent类型参数
传递null参数调用subAppend(null)方法会抛出异常

问题:
1、怎么获取LoggingEvent参数
2、subAppend分割日志要LoggingEvent这个参数做什么用
3、为什么传递null会抛出异常。

现在做任务遇到写入日志文件过大造成机器卡死的情况,所以希望通过subAppend来切割日志。

------解决方案--------------------
Log4j自带滚动日志的能力DailyRollingFileAppender,可以按分钟进行日志切割,为啥要自己来做这个事情?

比如:
<appender name="DATE_FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="threshold" value="debug" />
<param name="file" value="/juyee.log" />
<param name="append" value="true" />
<param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c] %m%n" />
</layout>
</appender>



------解决方案--------------------
有些业务日志量很大不可能每分钟一个日志文件
——是闲太密集了还是?那可以每小时,也可以每天。

有没有能在程序里控制当前日志文件大小的办法呢。
——没必要,log4j本身很强大,你自己去控制反而影响性能。
——想按文件大小来进行滚动的话,用:RollingFileAppender。
<appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
<param name="Append" value="false"/>
<param name="MaxFileSize" value="1024KB"/> 
<param name="File" value="dom/my.log"/> 
<param name="MaxBackupIndex" value="50"/> 
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n"/>
</layout>
</appender>
------解决方案--------------------
如果真的要实现自己进行细化的日志控制的话,那就自己去根据log4j的接口来实现自己的Appender,通过Event来处理也行,但我感觉性能损耗不值得。
public class MyDailyRollingFileAppender extends DailyRollingFileAppender {
@Override
protected void subAppend(LoggingEvent event) {
String modifiedMessage = String.format("**** Message modified by MyDailyRollingFileAppender ****nn%snn**** Finished modified message ****", event.getMessage());
LoggingEvent modifiedEvent = new LoggingEvent(event.getFQNOfLoggerClass(), event.getLogger(), event.getTimeStamp(), event.getLevel(), modifiedMessage,
event.getThreadName(), event.getThrowableInformation(), event.getNDC(), event.getLocationInformation(),
event.getProperties());
super.subAppend(modifiedEvent);
}
}


最详细就是直接看API了:
http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Appender.html
这个介绍也算比较完整了:
http://wwwz.iteye.com/blog/249039


RollingFileAppender 就是直接根据大小来控制日志的,它完全不考虑时间问题,只不过是所创建的文件名可以带上时间。