Log4j2 简单使用

简介: 日志是一个系统经常用到的功能,我们可以在调试的时候依靠日志查看输出,在程序运行的时候通过查看日志判断程序运行状态。在Java世界中,有一个非常著名的日志类库——Log4j。

日志是一个系统经常用到的功能,我们可以在调试的时候依靠日志查看输出,在程序运行的时候通过查看日志判断程序运行状态。在Java世界中,有一个非常著名的日志类库——Log4j。现在Log4j也有了新版本,就是Log4j2。新版本的好处我就不多说了。让让我们来开始使用吧。

引入Log4j2

要使用Log4j2,第一步就是先导入它的jar包。如果是普通项目的话,到log4j2官网下载jar包,然后将log4j-api-2.7.jarlog4j-core-2.7.jar添加到你项目的类路径下。

如果使用Maven或者Gradle的话,到mvn仓库查询查找这两个包,然后添加到项目依赖中。这样就完成了准备工作。

然后打开项目,添加以下两句,创建一个Logger并调试一些信息。注意这里的Logger和LogManager两个类的全名分别是org.apache.logging.log4j.LogManagerorg.apache.logging.log4j.Logger。不要和Java自带的java.util.logging下的日志类搞混了。

Logger logger = LogManager.getLogger();
logger.debug("5555555");

然后运行一下项目,就可以看到对应的输出了。

日志级别

如果你照着前面的做了,就会发现其实什么输出都没有,只有这么一句话:ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.。这是说因为没找到配置文件,所以使用默认的日志级别,向控制台只输出错误信息。这就引出了一个日志级别的问题。

日志分为几个级别,按照从轻往重如此排列:trace、debug、info、warn、error、fatal。相应的Logger类也有这么几个对应方法,用于输出相应的日志信息。如果我们定义了一个级别,那么低于这个级别的日志不会输出。由于没有配置文件,所以默认情况下的日志级别是error,正如前面的输出那样。这样一来,低于error的日志就不会输出。所以我们回到刚才,将debug方法改为error方法,再次运行项目。这次出现了日志输出。

22:21:58.600 [Test worker] ERROR yitian.bean.BeanTest - 5555555

配置文件

前面已经简单演示了Log4j2的用法。下面就来说说Log4j2的配置文件。Log4j2既可以使用配置文件配置,也可以使用编程方式用代码来配置。这里简单说说配置文件方式。Log4j2支持多种配置文件,XML、JSON、YAML和perperties文件都支持,当然最常用的还是XML文件。将配置文件放在类路径下即可,如果使用Maven或者Gradle的话,就是在resources文件夹下。

前面如果没有配置文件的话,Log4j2就会使用一个默认配置,等效于下面的配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <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="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

配置文件有两个主要的地方,第一个是Appender节点,这个节点下会有很多Appender,也就是我们日志输出的目的地,可以是控制台也可以是某个文件,甚至是专用的远程日志服务器。默认情况下只有一个控制台。第二种重要的节点是Loggers节点,这个节点下可以有很多个Logger,每个Logger可以记录不同的信息,Logger之间也可以共享某些配置。上面定义了一个Root Logger,如果没有指定Logger 的名称或者指定的Logger不存在,就会使用Root,而且Root Logger下的配置默认会被其他Logger继承,除非它们定义了自己的配置。

然后我们再回头看看Appenders节点,其中有这么一段:<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>。这里定义的就是日志的输出格式。下面来简单说说常用的输出格式。

  • %d{HH:mm:ss.SSS} 输出时间,精确度为毫秒。
  • %t 输出当前线程的名称。
  • %-5level 输出日志级别,-5表示左对齐并且固定占5个字符宽度,如果不足用空格补齐。
  • %logger 输出Logger名称,如果是Root的话就没有名称。
  • %msg 日志信息,也就是我们传入的信息。
  • %n 换行。
  • %F 输出所在的文件名。
  • %L 输出行号。
  • %M 输出所在方法名。
  • %l 输出语句所在的位置信息,包括文件名、类名、方法名、行号。

自定义配置

自定义Logger

说了这么多,现在我们就可以开始自定义配置文件了。首先我们来添加一个新的Logger,来记录所有信息,这个Logger的名称就叫做TRACE_ALL吧。这个Logger有两个属性,level指定记录级别,additivity指定传递性。假如传递性指定为true,如果我们现在使用TRACE_ALL记录一个debug级别的日志,由于debug级别也符合Root的记录范围,这样这个日志就会记录两遍。最后,我们用<AppenderRef ref="Console"/>指定使用上面的控制台Appender。

现在配置文件应该是这样。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <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="debug">
            <AppenderRef ref="Console"/>
        </Root>
        <Logger name="TRACE_ALL" level="trace" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>

程序代码是这样的。在调用getLogger的时候指定要使用哪一个Logger。

Logger logger = LogManager.getLogger("TRACE_ALL");
logger.info("5555555");

自定义Appender

除了使用Console作为日志输出目的地之外,我们还可以定义其他的输出,比如文件。下面我们来新建一个文件Appender。在Appenders节点下新建一个File节点,name和fileName属性分别指定Appender名称和目的文件名。然后我们指定TRACE_ALL Logger同时将日志输出到控制台和文件。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <File name="File" fileName="D:\Desktop\mylog.txt">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
        <Logger name="TRACE_ALL" level="trace" additivity="true">
            <AppenderRef ref="File"/>
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>

再次运行程序,我们就会发现这次在对应的路径下多出一个文件,这个文件的内容就是我们的输出。

到此为止,大家应该可以基本使用Log4j2了。如果有更加复杂的需求,就需要自己去查阅相关资料了。

参考资料

http://blog.csdn.net/autfish/article/details/51203709

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1天前
|
JavaScript 前端开发 开发者
使用`console.log()`查看运行结果非常简单
【4月更文挑战第18天】使用`console.log()`查看运行结果非常简单
5 1
|
Web App开发 前端开发 API
Chrome操作指南——入门篇(七)console中的await和log
Chrome操作指南——入门篇(七)console中的await和log
Chrome操作指南——入门篇(七)console中的await和log
|
前端开发
怎么使用console
使用console。 灵活运用console对象所提供的方法,可以让开发变得更简单。
怎么使用console
Google源码 -- 打Log新技巧
最近,开始阅读 Google 源码,看看大牛们写的代码哪些是写的好的,可以借鉴到自己的项目下。我发现谷歌工程师在打Log日志,都是统一的写法。今天,就先来分享一下他们的日志代码是怎么写的 。
185 0
|
监控 Java Apache
|
存储
Log4j_学习_03_自己动手封装log工具
        二、参考资料 1.log4j 是否可以通过条件判断 在程序运行中动态选择日志存储目录 2.log4j删除N天前日志实现
905 0
|
XML 监控 Java
log4j教程
详细的Log4j使用教程 转载 2016年08月19日 14:44:49 ·         5072 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。
1269 0