Log4j2是Log4j1.x的的升级版,其中也有很大的不同,最大的区别就是由以前的properties配置文件改为xml/json/yaml配置文件。

  其中配置文件的位置官方说明如下:

  1. Log4j will inspect the "log4j.configurationFile" system property and, if set, will attempt to load the configuration using the ConfigurationFactory that matches the file extension.
  2. If no system property is set the YAML ConfigurationFactory will look for log4j2-test.yaml or log4j2-test.yml in the classpath.
  3. If no such file is found the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.
  4. If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.
  5. If a test file cannot be located the YAML ConfigurationFactory will look for log4j2.yaml or log4j2.yml on the classpath.
  6. If a YAML file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.
  7. If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.
  8. If no configuration file could be located the DefaultConfiguration will be used. This will cause logging output to go to the console.

它会依次查找可能存在的配置文件,也可自定义配置文件的路径。可设置System.setProperty("log4j.configurationFile", path);来自定义配置文件的路径。注意:默认配置文件会查找以log4j2命名的文件。

  配置文件以<Configuration></Configuration>为根节点。可设置其默认的日志输出级别status,可输入的值可为 "trace", "debug", "info", "warn", "error" and "fatal"。也可以设置其自动循环执行配置文件的时间monitorInterval,默认是5s。

  log4j2的配置文件会有几个必须的节点,Appenders和Root。Appenders配置是其输出的日志形式,有log文件输出/控制台输出/数据库写入/消息发送等方式。以控制台输出为例,其配置如下:

  

 <?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有很多种方法,常用的例如异步AsyncAppender、控制台ConsleAppender、救援FailoverAppender、文件FileAppender、数据库JDBCAppender、滚动文件RollingFileAppender等。

  异步AsyncAppender不是单独配置的,而是引用其他已配置的Appender。它多用于不同线程操作日志的情况。配置格式如下:

     <File name="MyFile" fileName="logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
<Async name="Async">
<AppenderRef ref="MyFile"/>
</Async>

  救援FailoverAppender是包裹其他的appender使用的。它的用处是当第一个Appender失效的时候,就执行第二个Appender,以此类推直到没有Appender可执行了。配置如下:

  

 <Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"
ignoreExceptions="false">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<TimeBasedTriggeringPolicy />
</RollingFile>
<Console name="STDOUT" target="SYSTEM_OUT" ignoreExceptions="false">
<PatternLayout pattern="%m%n"/>
</Console>
<Failover name="Failover" primary="RollingFile">
<Failovers>
<AppenderRef ref="Console"/>
</Failovers>
</Failover>
</Appenders>

  文件FileAppender是一种输出流的方式输出日志文件的。格式如下:

 <Appenders>
<File name="MyFile" fileName="logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>

  数据库JDBCAppender是把错误日志信息根据配置存储到数据库中,两种格式如下:

 <Appenders>
<JDBC name="databaseAppender" tableName="dbo.application_log">
<DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" />
<Column name="eventDate" isEventTimestamp="true" />
<Column name="level" pattern="%level" />
<Column name="logger" pattern="%logger" />
<Column name="message" pattern="%message" />
<Column name="exception" pattern="%ex{full}" />
</JDBC>
</Appenders>
 <Appenders>
<JDBC name="databaseAppender" tableName="LOGGING.APPLICATION_LOG">
<ConnectionFactory class="net.example.db.ConnectionFactory" method="getDatabaseConnection" />
<Column name="EVENT_ID" literal="LOGGING.APPLICATION_LOG_SEQUENCE.NEXTVAL" />
<Column name="EVENT_DATE" isEventTimestamp="true" />
<Column name="LEVEL" pattern="%level" />
<Column name="LOGGER" pattern="%logger" />
<Column name="MESSAGE" pattern="%message" />
<Column name="THROWABLE" pattern="%ex{full}" />
</JDBC>
</Appenders>

第二种方法配置了Connection工厂类以及获取Connection的方法。该Connection是JDBC连接数据库的java.sql.Connection。

  滚动文件RollingFileAppender是根据配置生成多文件的方法。它提供了一些文件的触发方法和生成格式。示例如下:

  <Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="250 MB"/>
</Policies>
</RollingFile>
</Appenders>

其中fileName是默认当前日志的名称。filePattern是多日志生成的命名规则。它依赖于日志的生成规则。可根据SimpleDateFormat的格式化日期或者%i整型计数等方式命名文件名。触发规则Policies有三种方式:

 <Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="20 MB" />
<TimeBasedTriggeringPolicy />
</Policies>

OnStartup规则没有参数,如果当前日志文件比JVM的时间要迟,就会触发,生成新的日志。

SizeBased有一个参数size,即文件日志大小。当日志文件到达这个大小的时候,就会生成新的日志文件。后缀可为KB、MB、GB。

TimeBased是基于时间触发的周期性的保存日志,它有两个参数,interval:触发时间,单位为日志filePattern时间命名的的精度单位,默认是1。modulate:布尔类型。说明是否对日志生成时间进行调制。若为true,则日志时间将以0点为边界进行偏移计算。例如第一次日志保存时间是3点,modulate为true,interval是4h。那么下次生成日志时间是4点,08:00,12:00……

  默认的文件生成规则DefaultRolloverStrategy。它有4个参数:

  fileIndex:文件索引。

  min:文件最小数量,默认是1;

  max:文件最大数量。一旦达到这个最大数,以前的文档就会在下一轮生成日志的时候删除。

  compressionLevel: 日志压缩级别。0-9,压缩效果依次增大。只对于压缩文件类型有效。<DefaultRolloverStrategy max="20"/>

文件的压缩格式支持的后缀名:".gz",".zip",".bz2",".xz"

  Layout

 layout是日志文件的布局格式。支持的格式比较多,有CSV/JSON/HTML/RFC-5424/pattern/XML等等,用法大同小异。以常用的pattern、HTML为例:

  pattern是最常用也是比较简单的方式生成日志格式。它可以使用\t,\n,\r,\f用来分割排列信息。使用%加一些特定的英文单词输出日志详细描述。

比较常用的有:

  %c: Logger的名称。它可以接受一个整型的参数。规则如下:

Conversion Pattern Logger Name Result
%c{1} org.apache.commons.Foo Foo
%c{2} org.apache.commons.Foo commons.Foo
%c{1.} org.apache.commons.Foo o.a.c.Foo
%c{1.1.~.~} org.apache.commons.test.Foo o.a.~.~.Foo
%c{.} org.apache.commons.test.Foo ....Foo

  %d:日志事件的时间。参考示例如下:

Pattern Example
%d{DEFAULT} 2012-11-02 14:34:02,781
%d{ISO8601} 2012-11-02T14:34:02,781
%d{ISO8601_BASIC} 20121102T143402,781
%d{ABSOLUTE} 14:34:02,781
%d{DATE} 02 Nov 2012 14:34:02,781
%d{COMPACT} 20121102143402781
%d{HH:mm:ss,SSS} 14:34:02,781
%d{dd MMM yyyy HH:mm:ss,SSS} 02 Nov 2012 14:34:02,781
%d{HH:mm:ss}{GMT+0} 18:34:02
%d{UNIX} 1351866842
%d{UNIX_MILLIS} 1351866842781

ex|exception|throwable
  {["none"
  |"full"
  |depth
  |"short"
  |"short.className"
  |"short.fileName"
  |"short.lineNumber"
  |"short.methodName"
  |"short.message"
  |"short.localizedMessage"]}:输出一个异常日志,后面可以带指定的字符串。默认输出信息是Throwable.printStackTrace()。

%m/%msg/%message:输出日志事件所提供的信息。

%n:日志换行。

%level:日志级别。

%t:当前生成日志事件的线程。

  HTMLLayout是将日志文件生成一个HTML文件,它的好处是可以通过浏览器浏览。它是以table生成日志信息的。

可接收4个配置参数:

  charset:文档类型,默认是utf-8。

  contentType:用于申明文件头。默认是“text/html”。

  locationInfo:布尔类型。如果为true的话。文件名和行数会写入到html中。默认是false。

  title: html文件的标题。

  Filter

  配置日志的filter可以控制输出日志的类型。以ThresholdFilter为例,它是过滤日志级别的过滤器,允许通过的日志输出,不允许的不输出。它有三个参数:

  level:配对的级别,即该级别的名称。

  onMatch: 符合条件的级别。可填写: ACCEPT, DENY or NEUTRAL. 默认是NEUTRAL。

  onMisMatch:不符合的级别。可填写: ACCEPT, DENY or NEUTRAL. 默认是DENY。

示例:

  

 <Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<pattern>%d %p %c{1.} [%t] %m%n</pattern>
</PatternLayout>
<TimeBasedTriggeringPolicy />
</RollingFile>
</Appenders>

这样配置之后,该log日志文件只会输出比trace更高级别或者同等级别的日志了。

最后说下配置需要注意的事项:

  1.每个配置都需要一个root节点,root节点可以配置日志的级别,所有的Appender要配置到root中才能生效。

  2.可以配置独立的Logger,设置其level以及additivity,addivity是布尔值,代表是否遵从log4j2的日志输出级别。

  3.log4j2的日志级别:ALL<DEBUG<INFO<WARN<ERROR<FATAL。 日志输出遵从这样的级别,假设当前设置的日志输出级别是WARN,那么高于或者等于WARN级别的日志都会被输出,所以如果想把特定类型的日志写入到单独的日志文件中,需要做一个filter的过滤,不然高于配置级别的日志都会被输入到该文件中。

Log4j2的基本使用的更多相关文章

  1. dubbox升级spring到4.x及添加log4j2支持

    今天花了点时间,把dubbox依赖的spring从3.x升级成最新版的4.x了,其它一些依赖的组件也顺带升级了,同时dubbo支持的第三方日志组件居然没有log4j2,加了点代码也一并支持了,蛋疼的是 ...

  2. 聊一聊log4j2配置文件log4j2.xml

    一.背景 最近由于项目的需要,我们把log4j 1.x的版本全部迁移成log4j 2.x 的版本,那随之而来的slf4j整合log4j的配置(使用Slf4j集成Log4j2构建项目日志系统的完美解决方 ...

  3. 使用Slf4j集成Log4j2构建项目日志系统的完美解决方案

    一.背景 最近因为公司项目性能需要,我们考虑把以前基于的log4j的日志系统重构成基于Slf4j和log4j2的日志系统,因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见 ...

  4. log4j2.xml实用例子

    一个多月前,我写了篇关于log4j.xml配置的文章,点击此处查看:http://www.cnblogs.com/guogangj/p/3931397.html 最近,我把自己的log4j升级到2.0 ...

  5. log4j2 不使用配置文件,动态生成logger对象

    大家平时使用Log4j一般都是在classpath下放置一个log4j的配置文件,比如log4j.xml,里面配置好Appenders和Loggers,但是前一阵想做某需求的时候,想要的效果是每一个任 ...

  6. Log4j2 - 配置

    官方文档:http://logging.apache.org/log4j/2.x/index.html 1 概述 Log4j2的配置包含四种方式,其中3种都是在程序中直接调用Log4j2的方法进行配置 ...

  7. MyBatis - MyBatis使用log4j2显示sql和结果集

    mybatis-config.xml <settings> <setting name="logImpl" value="LOG4J2" /& ...

  8. web项目 log4j2的路径问题

    项目中用到log4j2记录日志,结果运行的时候总也不见log文件的产生. 查看官方文档得知,在web项目中使用log4j2需要加入log4j-web包 log4j2.xml <?xml vers ...

  9. 在java下使用log4j2记录日志

    1.定义: log4j2 指log4j 2.X及以上版本 2.安装 log4j-core-xx.jarlog4j-api-xx.jarlog4j-web-xx.jar(web项目的需要引用) 3.配置 ...

  10. log4j2配置详解

    1.    log4j2需要两个jar   log4j-api-2.x.x.jar    log4j-core-2.x.x.jar  .log4j和log4j2有很大的区别,jar包不要应错. 2. ...

随机推荐

  1. 使用简单的python语句编写爬虫 定时拿取信息并存入txt

    # -*- coding: utf-8 -*- #解决编码问题import urllibimport urllib2import reimport osimport time page = 1url ...

  2. Python 字符串转换为字典(String to Dict)

    一.需求 为了处理从redis中拿到的value,如下 {"appId":"ct","crawlSts":false,"healt ...

  3. C# 自动发送邮件被系统当做垃圾邮件退回的处理方法

    前两天做了一个发送邮件的定时任务.其功能为在每天的某一时刻,系统自动从银行查询前一天的交易明细到本地服务器,解析后生成为各自不同Excel文件,并打包成zip压缩文件,然后抄送附件给财务对账.其中,邮 ...

  4. php session和cookie知识

  5. java并发编程之三--CyclicBarrier的使用

    CyclicBarrier 允许一组线程全部等待彼此达到共同屏障点的同步辅助. 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此. 屏障被称为循环 ,因为它可以在等待的线程被释放 ...

  6. 小程序和ThinkPHP5结合实现登录状态(含代码)

    本篇文章给大家带来的内容是关于小程序和ThinkPHP5结合实现登录状态(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 微信小程序中,一般会涉及三种登录方式: 1. 使用微 ...

  7. Ubuntu16.04怎样安装Python3.6

    Ubuntu16.04默认安装了Python2.7和3.5 请注意,系统自带的python千万不能卸载! 输入命令python

  8. 第三课 操作系统开发之x86模拟环境搭建

    前面我们讲解了主引导程序的加载过程,并且制作了虚拟软盘a.img,最终这个主引导程序也在机器中成功运行了,但是实际开发的时候,并不会如此简单,免不了调试过程,如果还像上一节中直接将软盘放到机器中去加载 ...

  9. [LeetCode&Python] Problem 557. Reverse Words in a String III

    Given a string, you need to reverse the order of characters in each word within a sentence while sti ...

  10. 代理模式及Spring AOP (二)

    一.Spring AOP   1.1 Spring AOP 底层还是用的动态代理.如果目标对象所对应的类有接口,spring就用jdk生成代理对象: 如果目标对象所对应的类没有接口,spring就用C ...