log4j以及log4j2使用介绍
- 2016-01-09 11:00:00
- admin
- 原创 2085
一、日志组件比较
1、log4j2、logback、log4j1.2线程安全,同时支持同步和异步日志;
2、log4j2相比logback有18倍性能提升,logback相比log4j1.2有10倍性能提升;
3、jul日志可以发送到其它日志框架,常用适配器比如jul-to-slf4j;
二、log4j以及log4j2依赖配置
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
<version>2.0.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.16</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.24.1</version>
</dependency>
三、日志Level和Appender
Level:ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF;
Appender:日志输出目的地,每个Logger可以有多个Appender;
PatternLayout:http://logging.apache.org/log4j/1.2/apidocs/index.html
子Logger继承父Logger的最低Level和Appender:
Logger(“com.webank.app”) > Logger(“com.webank”) > rootLogger
Level的继承: 如果一个Logger没有设置最低Level,它会继承直接父Logger的Level;
Appender的继承:Logger除了配置给它的Appender,还会继承所有父Logger的Appender,除非Additivity设为false;
常用Appender:
ConsoleAppender,控制台输出;
RollingFileAppender,文件输出,按大小旋转,支持最大文件数目;
DailyRollingFileAppender,文件输出,按日期旋转,不支持最大文件数目;
四、log4j配置文件以及代码示例
log4j配置文件:log4j.properties
log4j配置文件:log4j.xml
log4j2配置文件:log4j2.xml
log4j示例代码:LogTest.java
log4j.rootLogger=info,console,applog
log4j.logger.com.webank=info,console,applog
log4j.additivity.com.webank=false
log4j.logger.com.webank.it=debug,console,applog
log4j.additivity.com.webank.it=false
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=\
%d{yyyy-MM-dd HH:mm:ss.SSS}|%t|%p - %m%n
log4j.appender.applog=org.apache.log4j.RollingFileAppender
log4j.appender.applog.File=app.log
log4j.appender.applog.MaxFileSize=10KB
log4j.appender.applog.MaxBackupIndex=2
log4j.appender.applog.layout=org.apache.log4j.PatternLayout
log4j.appender.applog.layout.ConversionPattern=\
%d{yyyy-MM-dd HH:mm:ss.SSS}|%p - %m%n
log4j.appender.dailylog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailylog.File=dailylog.log
log4j.appender.dailylog.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.dailylog.layout=org.apache.log4j.PatternLayout
log4j.appender.dailylog.layout.ConversionPattern=\
%d{yyyy-MM-dd HH:mm:ss.SSS}|%p - %m%n
五、slf4j实现细节
为什么打印日志有这么多重载方法?
void info(String msg)
void info(String format, Object arg)
void info(String format, Object arg1, Object arg2)
void info(String format, Object... arguments)
void info(String msg, Throwable t)
1、不同个数参数调用不同方法效率更高;
2、参数个数比位置参数多时,最后一个参数被当做异常打印,异常重起一行打印,打印内容类似printStackTrace;
3、异常没有捕获时虚拟机会打印Exception in thread;
getLogger如何获取Logger?
1、ClassLoader.getSystemResources判断是否存在StaticLoggerBinder;
2、StaticLoggerBinder.getLoggerFactory返回ILoggerFactory;
3、ILoggerFactory.getLogger返回Logger;