我接触一项技术,会先学习如何使用它。这篇网志作为学习 log4j 2 的开始。
2012年,log4j 进行了重大改进,重写 log4j,并将项目命名为 log4j 2,并且与 log4j 不兼容。7月发布 2.0-alpha1 版本,我用的是 2.0-beta4 版。
第一个程序——Hello World
public class Hello { private static Logger logger = LogManager.getLogger("com.foo.Hello"); public static void main(String[] args) { logger.info("hello world"); } }
代码很简单,首先获得日志类实例 logger,所有的操作都将通过 logger 来完成。这里我打印了一条 info 级别的信息,log4j 2 定义了 debug、info、error 等日志级别,不同的级别调用不同的方法。
接下来是配置日志,log4j 之前的配置文件是 log4j.properties 或是 log4j.xml,现在是 log4j2.xml。
<?xml version="1.0" encoding="UTF-8"?> <configuration status="OFF"> <appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> </appenders> <loggers> <root level="info"> <appender-ref ref="Console" /> </root> </loggers> </configuration>
配置文件很直观(比 log4j.properties 的可读性更强),简单来看,它定义了两个东西:appender 和 logger,这也是 log4j 2 的核心概念。
appender 负责日志输出的具体实现,你可以配置一些参数,比如日志输出位置(控制台、文件、网络),日志输出格式。
<appenders> 标签里可以配置多个appender,用 name 属性标识它们。这样,可以为不同的场景配置不同的输出实现。
logger 这里只配了一个实例,即 root,所有未指定的实例默认交给 root 完成日志输出。日志级别配置为 info,大于或等于这个级别的日志都会被输出。
运行结果
18:09:48.796 [main] INFO tutorial.Hello - hello world
<loggers> 标签里的配置也可以对应多个 logger 实例:
<loggers> <logger name="tutorial.Hello" level="debug"> <appender-ref ref="Console" /> </logger> <root level="info"> <appender-ref ref="Console" /> </root> </loggers>
如上代码,具体是通过 name 属性对应于代码中的 logger(即 Hello 类中使用的那个 logger)。
这种方式大大提高了灵活性、场景适应能力。之前提过,不同的场景可能需要不同的输出实现,当我们要改变某个类的输出实现时,只需要在 <loggers> 标签里配置相应的输出实现即可。