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. CAS-认证流程

    从结构上看cas包括两个部分,CAS server 和CAS client 需要独立部署,主要负责用户的认证工作,CAS负责处理对客户端受保护资源的访问请求,需要登录时,重新定向到CAS Server ...

  2. bzoj3332

    题解: 首先只有存在的路有可能有值 然后在存储矩阵的同时对于本来就有边的情况直接存下来这条边的值 然后跑一次最大生成树 在最大生成树的同时就可以求出矩阵的信息. 代码: #include<bit ...

  3. Thinking in Java笔记之类及对象的初始化

    最近在看<Thinking in Java>这本书,之前一直对类及对象的初始化过程不太清楚,只是感到很模糊.看了这本书关于对象初始化的部分,终于搞明白了. 废话不多说,先上两个例子,实例摘 ...

  4. 关于edge detecte

    1.注意render Texture 双击render Texture ,要勾选 use viewport dimensions,否则出现边框和模型不合的情况 2.注意edge detecte 的状态 ...

  5. L1-004 计算摄氏温度

    给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C.计算公式:C=5×(F−32)/9.题目保证输入与输出均在整型范围内. 输入格式: 输入在一行中给出一个华氏温度. 输出格式: 在一行中按照 ...

  6. 量身打造自己的MyEclipse(多图)

    迎新年 贺元旦MyEclipse推新版 在线订购低至 7.5 折!截止1月31号(活动期间在线下单的客户才可享受此优惠,过期恢复原价) 立即抢购 1.量身打造你自己的MyEclipse MyEclip ...

  7. Excel根据人名匹配得到编号

    操作步骤:输入公式 =IF(COUNTIF($E$2:$E2,$E2)>COUNTIF($B:$B,$E2),"",INDEX(C:C,SMALL(IF($B$1:$B$10 ...

  8. LibSVM文件转换为csv格式

    Spark MLlib 的官方例子里面提供的数据大部分是 libsvm 格式的.这其实是一种非常蛋疼的文件格式,和常见的二维表格形式相去甚远,下图是里面的一个例子: libsvm 文件的基本格式如下: ...

  9. 深入理解uwsgi和gunicorn网络模型

    前言: 去年10月份建了一个python技术群,到现在为止人数已经涨到700人了.最一开始我经常在群里回应大家的问题,不管是简单还是困难的,我都会根据自己的经验来交流. 让人新奇的是一些初学者关注最多 ...

  10. nw + iframe嵌入page 滚动条问题

    iframe 加载完之后会在原尺寸基础上增加4像素(因此我用以下方法处理): <iframe id="myiframe" style="visibility: hi ...