log4j以及log4j2使用介绍

2016-01-09 11:00:00
admin
原创 1898
摘要: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>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>


<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.13.2</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以及log4j2配置文件

log4j配置文件:log4j.properties

log4j配置文件:log4j.xml

log4j2配置文件:log4j2.xml


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


五、打印日志示例代码

示例代码:LogTest.java


public class LogTest {

public static Logger getLogger() {
return LoggerFactory.getLogger(LogTest.class);
}

public static Logger getLogger(String name) {
return LoggerFactory.getLogger(name);
}

public static void testLoggerUsage() {
getLogger().info("feinen is boy.");
getLogger().info("feinen is {}.", 20);
getLogger().info("object is {}.");

Object obj = null;
getLogger().info("object is {}.", obj);
}

public static void testInheritance() {
getLogger("com.webank").info("inheritance info");
getLogger("com.webank.it").debug("inheritance debug");
}

public static void main(String[] args) {
for (int count = 0; count < 200000; count++) {
testLoggerUsage();
testInheritance();
}
}
}


六、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;

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