原创地址:http://blog.csdn.net/mw08091020/article/details/41649339
近期有个项目需要在不同的目录下打印"yyyyMMdd.log"格式的日志,以方便flume进行日志收集,查看了相关的官方文档http://logback.qos.ch/manual/layouts.html,下面是简单的实现:
- <span style="font-size:12px;">import java.text.SimpleDateFormat;
- import java.util.Date;
-
- import org.slf4j.LoggerFactory;
-
- import ch.qos.logback.classic.Logger;
- import ch.qos.logback.classic.LoggerContext;
- import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
- import ch.qos.logback.classic.spi.ILoggingEvent;
- import ch.qos.logback.core.FileAppender;
-
-
-
-
-
- public class LoggerUtil {
-
- public static Logger getLogger(Class<?> clazz) {
-
- Logger rootLogger = (Logger) LoggerFactory.getLogger(clazz);
- LoggerContext loggerContext = rootLogger.getLoggerContext();
-
-
- PatternLayoutEncoder encoder = new PatternLayoutEncoder();
- encoder.setContext(loggerContext);
- encoder.setPattern("%m");
- encoder.start();
-
- FileAppender<ILoggingEvent> appender = new FileAppender<ILoggingEvent>();
- String fileName = getTime("yyyyMMdd") + ".log";
- String filePath = LogPathConst.LOG_PREFIX + clazz.getSimpleName() + "/" + fileName;
- appender.setFile(filePath);
- appender.setContext(loggerContext);
- appender.setEncoder(encoder);
- appender.start();
- rootLogger.addAppender(appender);
-
- return rootLogger;
-
- }
-
- private static String getTime(String format) {
- SimpleDateFormat sdf = new SimpleDateFormat(format);
- return sdf.format(new Date());
- }
- }
- </span>
以下是log4j的实现方法,上面的是结合这个和官方API修改的
- <span style="font-size:12px;">import java.text.SimpleDateFormat;
- import java.util.Date;
-
- import org.apache.log4j.FileAppender;
- import org.apache.log4j.Level;
- import org.apache.log4j.Logger;
- import org.apache.log4j.PatternLayout;
- import org.apache.log4j.RollingFileAppender;
-
- public class LoggerUtil {
-
- public static Logger getLogger(Class<?> clazz) {
-
- Logger logger = Logger.getLogger(clazz);
- logger.removeAllAppenders();
- logger.setLevel(Level.INFO);
- logger.setAdditivity(false);
-
- FileAppender appender = new RollingFileAppender();
- PatternLayout layout = new PatternLayout();
- layout.setConversionPattern("%m");
- appender.setLayout(layout);
- String fileName = getTime("yyyyMMdd") + ".log";
- String filePath = LogPathConst.LOG_PREFIX + clazz.getSimpleName() + "/" + fileName;
- appender.setFile(filePath);
- appender.setEncoding("UTF-8");
- appender.setAppend(true);
- appender.activateOptions();
-
- logger.addAppender(appender);
- return logger;
- }
-
- private static String getTime(String format) {
- SimpleDateFormat sdf = new SimpleDateFormat(format);
- return sdf.format(new Date());
- }
-
- }</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;这样的话以后你更换日志框架的时候,无需再更改源码。
最近的测试中发现这种方法的耗时相对较长,于是又看了官方的文档,发现有更好的实现方式,无需写代码,只需要配置就了,具体的配置方法,见如下实例:
-
- <appender name="ServerError" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${BaseDir}/ServerError/%d{yyyyMMdd}.log</fileNamePattern>
- </rollingPolicy>
- <encoder>
- <pattern>${ErrorPattern}</pattern>
- <charset>${Encoding}</charset>
- </encoder>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>ERROR</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- </appender></span>
这样不指定默认的文件名称,则会自动使用yyyyMMdd.log命名,以后按日期会自动滚动文件名。
logback-classic与slf4j版本依赖查看:http://maven.outofmemory.cn/ch.qos.logback/logback-classic/