求org.apache.log4j.WriterAppender对象subAppend(LoggingEvent event)方法的使用例子
不知道怎么去取得LoggingEvent类型参数
传递null参数调用subAppend(null)方法会抛出异常问题:
1、怎么获取LoggingEvent参数
2、subAppend分割日志要LoggingEvent这个参数做什么用
3、为什么传递null会抛出异常。现在做任务遇到写入日志文件过大造成机器卡死的情况,所以希望通过subAppend来切割日志。

解决方案 »

  1.   

    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>
      

  2.   

    有些业务日志量很大不可能每分钟一个日志文件
    ——是闲太密集了还是?那可以每小时,也可以每天。有没有能在程序里控制当前日志文件大小的办法呢。
    ——没必要,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>
      

  3.   

    我想问下这样的实现方案能否实现呢:每次写入一条日志的时候判断文件的大小,如果超过限制的大小则关闭保存当前写入的日志,新建一个日志继续写入。另外能否讲解一下log4j日志比较全面的配置信息呢?我了解的有通过配置实现按分钟和按大小分割日志的,但是它这个按大小分割不会在一次写入的过程中去判断文件大小,也就是说要是一次性写入超多的日志一样会出问题。
    最后有个疑问,log4j有配置又有代码,但是代码像subAppend(LoggingEvent event)方法并不是我们自己去调用的,我怀疑是机制通过配置去调用subAppend方法,有没有高人知道实现原理的给指点一下。。
      

  4.   

    如果真的要实现自己进行细化的日志控制的话,那就自己去根据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 就是直接根据大小来控制日志的,它完全不考虑时间问题,只不过是所创建的文件名可以带上时间。