log4j以及log4j2使用介绍

2016-01-09 11:00:00
admin
原创 2085
摘要:log4j以及log4j2使用介绍

一、日志组件比较

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;

PatternLayouthttp://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;

发表评论
评论通过审核之后才会显示。