用java编程方式实现logback和log4j的自定义格式日志

转载 2015年11月17日 16:42:19

原创地址:http://blog.csdn.net/mw08091020/article/details/41649339

近期有个项目需要在不同的目录下打印"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.         PatternLayoutEncoder encoder = new PatternLayoutEncoder();  
  25.         encoder.setContext(loggerContext);  
  26.         encoder.setPattern("%m");  
  27.         encoder.start();  
  28.           
  29.         FileAppender<ILoggingEvent> appender = new FileAppender<ILoggingEvent>();  
  30.         String fileName = getTime("yyyyMMdd") + ".log";  
  31.         String filePath = LogPathConst.LOG_PREFIX + clazz.getSimpleName() + "/" + 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.         SimpleDateFormat sdf = 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 logger = Logger.getLogger(clazz); // 生成新的Logger  
  15.         logger.removeAllAppenders(); // 清空Appender,特別是不想使用現存實例時一定要初始化  
  16.         logger.setLevel(Level.INFO); // 设定Logger級別。  
  17.         logger.setAdditivity(false); // 设定是否继承父Logger。默认为true,继承root输出;设定false后将不输出root。  
  18.   
  19.         FileAppender appender = new RollingFileAppender(); // 生成新的Appender  
  20.         PatternLayout layout = new PatternLayout();  
  21.         layout.setConversionPattern("%m"); // log的输出形式  
  22.         appender.setLayout(layout);  
  23.         String fileName = getTime("yyyyMMdd") + ".log";  
  24.         String filePath = LogPathConst.LOG_PREFIX + clazz.getSimpleName() + "/" + fileName;  
  25.         appender.setFile(filePath); // log输出路径  
  26.         appender.setEncoding("UTF-8"); // log的字符编码  
  27.         appender.setAppend(true); // 日志合并方式: true:在已存在log文件后面追加 false:新log覆盖以前的log  
  28.         appender.activateOptions(); // 适用当前配置  
  29.   
  30.         logger.addAppender(appender); // 将新的Appender加到Logger中  
  31.         return logger;  
  32.     }  
  33.   
  34.     private static String getTime(String format) {  
  35.         SimpleDateFormat sdf = 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/

相关文章推荐

用java编程方式实现logback和log4j的自定义格式日志

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

关于jboss log4j如何编程添加自定义的日志输出

代码比较简单 添加自定义的Appender           Logger log = Logger.getRootLogger();           // Logger.ge...

log4j自定义级别并将新级别日志信息输出到指定带日期格式的log文件

参考网上各家的资料,本人实现的功能如下: 1、自定义级别:SERIOUS 2、将log.mailLog日志信息输出到指定log文件 3、按天更新日志,并将当天日期添加在文件名中 ...
  • herb777
  • herb777
  • 2012年06月29日 17:20
  • 1695

log4j自定义级别并将新级别日志信息输出到指定带日期格式的log文件

参考网上各家的资料,本人实现的功能如下: 1、自定义级别:SERIOUS 2、将log.mailLog日志信息输出到指定log文件 3、按天更新日志,并将当天日期添加在文件名中   具体参考...

java整合log4j xml 配置 自定义日志文件路径和生成年月日的html文件

下载必备的jar http://yunpan.cn/ccJEq3IQuEhA4  访问密码 a98f log4j-core-2.3.jar log4j-api-2.3.j...

java使用log4j产生日志,使用自定义日志名称

本例使用log4j 1.2版本,2.X版本变化较大,jar包下载地址:http://logging.apache.org/log4j/1.2/download.html 需导入log4j-1.2.1...

Java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)

如果对于commons-loging、log4j、slf4j、LogBack等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所帮助,当...

java日志需要知道的几件事(commons-logging,log4j,slf4j,logback)

一、 概念 Commons-logging : apache最早提供的日志的门面接口。避免和具体的日志方案直接耦合。类似于JDBC 的api 接口,具体的的JDBC driver 实现由各数据库提供商...
  • fw0124
  • fw0124
  • 2015年09月08日 22:46
  • 1174

Java日志框架:SLF4J, Apache Common-Logging, Log4J和Logback

日志组件 Apachelog4j框架JavaOSGI  转载:http://victorjan333.spaces.live.com/blog/cns!71649EBABAF09F2D!33...

java日志组件介绍(common-logging,log4j,slf4j,logback)

common-logging common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging,...
  • flqljh
  • flqljh
  • 2015年11月14日 11:55
  • 245
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用java编程方式实现logback和log4j的自定义格式日志
举报原因:
原因补充:

(最多只允许输入30个字)