原创地址:

近期有个项目需要在不同的目录下打印"yyyyMMdd.log"格式的日志,以方便flume进行日志收集,查看了相关的官方文档http://logback.qos.ch/manual/layouts.html,下面是简单的实现:

    1. <span style="font-size:12px;">import java.text.SimpleDateFormat;  
    2. import java.util.Date;  
    3.   
    4. import org.slf4j.LoggerFactory;  
    5.   
    6. import ch.qos.logback.classic.Logger;  
    7. import ch.qos.logback.classic.LoggerContext;  
    8. import ch.qos.logback.classic.encoder.PatternLayoutEncoder;  
    9. import ch.qos.logback.classic.spi.ILoggingEvent;  
    10. import ch.qos.logback.core.FileAppender;  
    11.   
    12. /**
    13.  * 根据不同的日志类型,打印不同路径下的yyyyMMdd.log格式日志,例如./logs/flume/playerLogin/20141111.log
    14.  * @author melvin0987@163.com
    15.  */  
    16. public class LoggerUtil {  
    17.   
    18. public static Logger getLogger(Class<?> clazz) {  
    19.   
    20.         Logger rootLogger = (Logger) LoggerFactory.getLogger(clazz);  
    21.         LoggerContext loggerContext = rootLogger.getLoggerContext();  
    22. //loggerContext.reset();  
    23.           
    24. new PatternLayoutEncoder();  
    25.         encoder.setContext(loggerContext);  
    26. "%m");  
    27.         encoder.start();  
    28.           
    29. new FileAppender<ILoggingEvent>();  
    30. "yyyyMMdd") + ".log";  
    31. "/" + fileName;  
    32.         appender.setFile(filePath);  
    33.         appender.setContext(loggerContext);  
    34.         appender.setEncoder(encoder);  
    35.         appender.start();  
    36.         rootLogger.addAppender(appender);  
    37.   
    38. return rootLogger;  
    39.   
    40.     }  
    41.   
    42. private static String getTime(String format) {  
    43. new SimpleDateFormat(format);  
    44. return sdf.format(new Date());  
    45.     }  
    46. }  
    47. </span>


    以下是log4j的实现方法,上面的是结合这个和官方API修改的

    1. <span style="font-size:12px;">import java.text.SimpleDateFormat;  
    2. import java.util.Date;  
    3.   
    4. import org.apache.log4j.FileAppender;  
    5. import org.apache.log4j.Level;  
    6. import org.apache.log4j.Logger;  
    7. import org.apache.log4j.PatternLayout;  
    8. import org.apache.log4j.RollingFileAppender;  
    9.   
    10. public class LoggerUtil {  
    11.   
    12. public static Logger getLogger(Class<?> clazz) {  
    13.   
    14. // 生成新的Logger  
    15. // 清空Appender,特別是不想使用現存實例時一定要初始化  
    16. // 设定Logger級別。  
    17. false); // 设定是否继承父Logger。默认为true,继承root输出;设定false后将不输出root。  
    18.   
    19. new RollingFileAppender(); // 生成新的Appender  
    20. new PatternLayout();  
    21. "%m"); // log的输出形式  
    22.         appender.setLayout(layout);  
    23. "yyyyMMdd") + ".log";  
    24. "/" + fileName;  
    25. // log输出路径  
    26. "UTF-8"); // log的字符编码  
    27. true); // 日志合并方式: true:在已存在log文件后面追加 false:新log覆盖以前的log  
    28. // 适用当前配置  
    29.   
    30. // 将新的Appender加到Logger中  
    31. return logger;  
    32.     }  
    33.   
    34. private static String getTime(String format) {  
    35. new SimpleDateFormat(format);  
    36. return sdf.format(new Date());  
    37.     }  
    38.   
    39. }</span>

    由于之前项目用的是log4j感觉性能有点慢,所以找logback替代,下面简单说说由log4j向logback转移的方法:

    首先,就是jar包的替换了,将log4j相关的包删掉,增加logback-classic .jar,slf4j -api.jar 和  logback-core.jar。下载地址:http://logback.qos.ch/download.html

    其次,由于原来的log4j配置文件是log4j.properties文件,logback只支持xml和groovy方式,所以需要转换,官方提供了便利的转换工具,地址:http://logback.qos.ch/translator/

    最后,将转换过来的内容写入到logback.xml文件中,其中有些内容需要修改。

    如果你之前打印日志的时候导入的包是apache的log4j包的话,次需要改为org.slf4j.Logger和org.slf4j.LoggerFactory;这样的话以后你更换日志框架的时候,无需再更改源码。

    最近的测试中发现这种方法的耗时相对较长,于是又看了官方的文档,发现有更好的实现方式,无需写代码,只需要配置就了,具体的配置方法,见如下实例:

      1. <!-- 服务器错误日志 -->  
      2. <appender name="ServerError" class="ch.qos.logback.core.rolling.RollingFileAppender">  
      3. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
      4. <fileNamePattern>${BaseDir}/ServerError/%d{yyyyMMdd}.log</fileNamePattern>  
      5. </rollingPolicy>  
      6. <encoder>  
      7. <pattern>${ErrorPattern}</pattern>  
      8. <charset>${Encoding}</charset>  
      9. </encoder>  
      10. <filter class="ch.qos.logback.classic.filter.LevelFilter">  
      11. <level>ERROR</level>  
      12. <onMatch>ACCEPT</onMatch>  
      13. <onMismatch>DENY</onMismatch>  
      14. </filter>  
      15. </appender></span>


      这样不指定默认的文件名称,则会自动使用yyyyMMdd.log命名,以后按日期会自动滚动文件名。

      logback-classic与slf4j版本依赖查看:http://maven.outofmemory.cn/ch.qos.logback/logback-classic/