JAVA语言

日志框架简介

话题 [ 上一个 | 下一个 ]
触发器
日志框架简介
答复
17-4-14 上午9:14
Log4j
最终版本为 1.2.17,与2015年8月宣布不再维护,建议转用 Log4j2
 
Maven配置:
<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.17</version> 
</dependency> 
 
配置:
log4j.properties 放置于 classpath 下
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
 
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
 
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
 
使用Logger:
    private static final Logger logger = Logger.getLogger(Sub.class);
 
资料链接:
 
 
Log4j2
 
特性:
  • 接口与实现分离(见pom文件)
  • 基于Disruptor的异步日志系统,多线程环境性能极佳
  • 对Log4j 1.2, SLF4J, Commons Logging and java.util.logging (JUL) APIs 提供支持
  • 通过  log4j-to-slf4j adapter,保证任何兼容 slf4j 的日志系统都可以打印 log4j2 的日志
  • 能自动重新加载配置文件,同时保证配置更新时不丢失任何日志事件(优于logback)
  • 高级过滤器、插件体系、属性支持、支持Lambda、轻松自定义日志级别
  • 产生的内存垃圾少,减少GC,提高响应性能
 
Maven配置:
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
    </dependencies>
配置:
log4j2.xml 放置于 classpath 下
 
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="10">
  <Appenders>
    <Console name="Console">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="debug">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>
 
使用Logger:
    private static final Logger logger = LogManager.getLogger(Main.class);
 
 
 
Logback
 
当年用于取代Log4j的日志工具包。是Log4j的本地实现(其Logger类实现了 org.slf4j.Logger 接口)。
Logback提供了默认配置,在没有配置文件情况下也能向控制台打印输出。
 
Maven配置(logback-classic指定了对logback-core与slf4j的依赖):
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
配置:
logback.xml 放置于 classpath 下
 
 
 
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>#LOGBACK# %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
使用Logger:
    private static final Logger logger = LoggerFactory.getLogger(Main.class);
 
资料链接:
 
 
Java Logging
Java1.4 自带的日志功能,现在应该没人用了吧。
简称JUL,因为包名为 java.util.logging
 
 
Apache Commons Logging
 
Apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging,common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。当然,common-logging内部有一个Simple logger的简单实现,但是功能很弱。所以使用common-logging,通常都是配合着log4j来使用。使用它的好处就是,代码依赖是common-logging而非log4j, 避免了和具体的日志方案直接耦合,在有必要时,可以更改日志实现的第三方库。
 
项目开始叫 Jakarta Commons Logging,所以简称一直是 JCL。
 
动态查找顺序:
  1. 先在classpath下查找 commons-logging.properties文件,根据org.apache.commons.logging.Log属性加载指定的Logger
  2. 通过系统属性 org.apache.commons.logging.Log指定
  3. 如果能在classpath 中找到Log4j 则使用log4j 实现
  4. 如果JDK版本高于1.4,则使用 java.util.logging
  5. 使用commons-logging 内部提供的SimpleLog 实现
 
当程序规模越来越庞大时,JCL的动态绑定并不是总能成功。解决方法之一就是在程序部署时静态绑定指定的日志工具,这就是 SLF4J 产生的原因。
 
Maven配置(一般与log4j一起用,需再引用log4j):
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
 
使用Logger:
 
    private static final Log logger = LogFactory.getLog(Sub31.class);
 
资料链接:
 
 
Slf4j
 
Simple Logging Facade for JAVA。类似于Apache Common-Logging,是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。
 
Slf4j 绑定到具体日志框架的方法:
 
 
实例一:见上面的Logback。Logback是Slf4j的native实现。logback-classic 1.2.3 实际上包含了 slf4j 1.7.25
 
实例二:Slf4j 绑定到 log4j2
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
    </dependencies>
 
Slf4j 桥接其它日志框架:
 
 
桥接的原理非常简单,例如 log4j-over-slf4j 中就定义了一个与 log4j 中同名(包括包名)的 Logger 类,在这个实现类中把原来的 log4j本地日志实现委托给 slf4j 接口实现。显然,这需要我们管理包依赖时必须手动屏蔽掉所有 log4j 包。
 
资料链接:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0 (0 票)

RE: 日志框架简介
答复
17-4-14 上午9:26 回复令国 孔。

以上为日志框架基础知识,在理解的基础上(尤其是slf4j的桥接)可以看一下实际项目:

 

https://gitlab.ap1.covapp.io/SGM-B2C/LogDemos.git

 

其中 Slf4j_All 子项目实现了如何通过 logback 管理所有的日志。

 

此外,有余力的同学可以做一个 Log4j2_All 子项目,实现通过 log4j2管理所有的日志。参考链接:http://logging.apache.org/log4j/2.x/runtime-dependencies.html

0 (0 票)