用java编程方式实现logback和log4j的自定义格式日志
2015-11-17 16:42
686 查看
原创地址:http://blog.csdn.net/mw08091020/article/details/41649339
近期有个项目需要在不同的目录下打印"yyyyMMdd.log"格式的日志,以方便flume进行日志收集,查看了相关的官方文档http://logback.qos.ch/manual/layouts.html,下面是简单的实现:
[java] view
plaincopyprint?
<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;
/**
* 根据不同的日志类型,打印不同路径下的yyyyMMdd.log格式日志,例如./logs/flume/playerLogin/20141111.log
* @author melvin0987@163.com
*/
public class LoggerUtil {
public static Logger getLogger(Class<?> clazz) {
Logger rootLogger = (Logger) LoggerFactory.getLogger(clazz);
LoggerContext loggerContext = rootLogger.getLoggerContext();
//loggerContext.reset();
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修改的
[java] view
plaincopyprint?
<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
logger.removeAllAppenders(); // 清空Appender,特別是不想使用現存實例時一定要初始化
logger.setLevel(Level.INFO); // 设定Logger級別。
logger.setAdditivity(false); // 设定是否继承父Logger。默认为true,继承root输出;设定false后将不输出root。
FileAppender appender = new RollingFileAppender(); // 生成新的Appender
PatternLayout layout = new PatternLayout();
layout.setConversionPattern("%m"); // log的输出形式
appender.setLayout(layout);
String fileName = getTime("yyyyMMdd") + ".log";
String filePath = LogPathConst.LOG_PREFIX + clazz.getSimpleName() + "/" + fileName;
appender.setFile(filePath); // log输出路径
appender.setEncoding("UTF-8"); // log的字符编码
appender.setAppend(true); // 日志合并方式: true:在已存在log文件后面追加 false:新log覆盖以前的log
appender.activateOptions(); // 适用当前配置
logger.addAppender(appender); // 将新的Appender加到Logger中
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;这样的话以后你更换日志框架的时候,无需再更改源码。
最近的测试中发现这种方法的耗时相对较长,于是又看了官方的文档,发现有更好的实现方式,无需写代码,只需要配置就了,具体的配置方法,见如下实例:
[html] view
plaincopyprint?
<!-- 服务器错误日志 -->
<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/
近期有个项目需要在不同的目录下打印"yyyyMMdd.log"格式的日志,以方便flume进行日志收集,查看了相关的官方文档http://logback.qos.ch/manual/layouts.html,下面是简单的实现:
[java] view
plaincopyprint?
<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;
/**
* 根据不同的日志类型,打印不同路径下的yyyyMMdd.log格式日志,例如./logs/flume/playerLogin/20141111.log
* @author melvin0987@163.com
*/
public class LoggerUtil {
public static Logger getLogger(Class<?> clazz) {
Logger rootLogger = (Logger) LoggerFactory.getLogger(clazz);
LoggerContext loggerContext = rootLogger.getLoggerContext();
//loggerContext.reset();
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修改的
[java] view
plaincopyprint?
<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
logger.removeAllAppenders(); // 清空Appender,特別是不想使用現存實例時一定要初始化
logger.setLevel(Level.INFO); // 设定Logger級別。
logger.setAdditivity(false); // 设定是否继承父Logger。默认为true,继承root输出;设定false后将不输出root。
FileAppender appender = new RollingFileAppender(); // 生成新的Appender
PatternLayout layout = new PatternLayout();
layout.setConversionPattern("%m"); // log的输出形式
appender.setLayout(layout);
String fileName = getTime("yyyyMMdd") + ".log";
String filePath = LogPathConst.LOG_PREFIX + clazz.getSimpleName() + "/" + fileName;
appender.setFile(filePath); // log输出路径
appender.setEncoding("UTF-8"); // log的字符编码
appender.setAppend(true); // 日志合并方式: true:在已存在log文件后面追加 false:新log覆盖以前的log
appender.activateOptions(); // 适用当前配置
logger.addAppender(appender); // 将新的Appender加到Logger中
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;这样的话以后你更换日志框架的时候,无需再更改源码。
最近的测试中发现这种方法的耗时相对较长,于是又看了官方的文档,发现有更好的实现方式,无需写代码,只需要配置就了,具体的配置方法,见如下实例:
[html] view
plaincopyprint?
<!-- 服务器错误日志 -->
<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/
相关文章推荐
- java集合类
- Java Socket长连接异步单工保持心跳
- spring mvc后台接收中文乱码
- Java编程准备:了解Java
- JAVA实现AES加密
- HBase和Java API操作
- Eclipse for Mac 常用快捷键
- Java常用的7大排序算法汇总
- spring各版本下载
- javamail发送与接收邮件实例
- SpringMVC使用@ResponseBody处理Ajax请求
- JAVA EE企业级开发四步走完全攻略 [转]
- spring中bean的作用域
- compiler之automatic memory management以及Java GC
- Java基础 基本数据类型
- Java反射reflect学习笔记_3:反射类的方法
- Spring -- 整合JMX
- Java给服务端发送文件
- Java中Runnable和Thread的区别
- 从Java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换