Log4j2的基本使用

  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文件输出/控制台输出/数据库写入/消息发送等方式。以控制台输出为例,其配置如下:

  

 1 <?xml version="1.0" encoding="UTF-8"?>
 2     <Configuration status="WARN">
 3         <Appenders>
 4             <Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
 5             </Console>
 6         </Appenders>
 7         <Loggers>
 8                  <Root level="error">
 9                   <AppenderRef ref="Console"/>
10                 </Root>
11         </Loggers>
12 </Configuration>

  

  Appender  

  其中Appender有很多种方法,常用的例如异步AsyncAppender、控制台ConsleAppender、救援FailoverAppender、文件FileAppender、数据库JDBCAppender、滚动文件RollingFileAppender等。

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

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

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

  

 1 <Appenders>
 2     <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"
 3                  ignoreExceptions="false">
 4       <PatternLayout>
 5         <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
 6       </PatternLayout>
 7       <TimeBasedTriggeringPolicy />
 8     </RollingFile>
 9     <Console name="STDOUT" target="SYSTEM_OUT" ignoreExceptions="false">
10       <PatternLayout pattern="%m%n"/>
11     </Console>
12     <Failover name="Failover" primary="RollingFile">
13       <Failovers>
14         <AppenderRef ref="Console"/>
15       </Failovers>
16     </Failover>
17  </Appenders>

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

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

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

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

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

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

 1  <Appenders>
 2     <RollingFile name="RollingFile" fileName="logs/app.log"
 3                  filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
 4       <PatternLayout>
 5         <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
 6       </PatternLayout>
 7       <Policies>
 8         <TimeBasedTriggeringPolicy />
 9         <SizeBasedTriggeringPolicy size="250 MB"/>
10       </Policies>
11     </RollingFile>
12  </Appenders>

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

1 <Policies>
2   <OnStartupTriggeringPolicy />
3   <SizeBasedTriggeringPolicy size="20 MB" />
4   <TimeBasedTriggeringPolicy />
5 </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"/>

  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”。

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

  title: html文件的标题。

  Filter

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

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

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

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

示例:

  

 1 <Appenders>
 2     <RollingFile name="RollingFile" fileName="logs/app.log"
 3                  filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
 4       <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
 5       <PatternLayout>
 6         <pattern>%d %p %c{1.} [%t] %m%n</pattern>
 7       </PatternLayout>
 8       <TimeBasedTriggeringPolicy />
 9     </RollingFile>
10  </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的过滤,不然高于配置级别的日志都会被输入到该文件中。

时间: 2024-10-12 07:49:28

Log4j2的基本使用的相关文章

log4j与log4j2

一 log4j log4j是Apache的一个开源项目,用于输出程序的运行状况. 相比于在程序内部添加System.out.println()做日志输出,log4j有如下优点: 可以设定信息输出的目的地,常用的有控制台.文件等. 根据日志的严重程度,将日志分为6级,从高到低依次是:fatal.error.warn.info.debug.trace. 可以设定日志的输出格式,包含动态的信息. 可以开启或者关闭信息输出. 在java代码获取日志对象并输出: Logger logger=Logger.

log4j2日志配置

背景 log4j2相对于log4j 1.x有了脱胎换骨的变化,其官网宣称的优势有多线程下10几倍于log4j 1.x和logback的高吞吐量.可配置的审计型日志.基于插件架构的各种灵活配置等. 1.所需jar 1)maven配置 <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId&

笔记:MyBatis 日志显示-log4j2

在ClassPath路径创建log4j2.xml配置文件,增加如下日志配置: <?xml version="1.0" encoding="UTF-8"?> <Configuration status="OFF"> ????<!-- 附着器配置,日志输出到什么位置 --> ????<Appenders> ????????<!-- 控制台附着器类型,输出结果到 System.out 或是 Syst

log4j+slf4j迁移到log4j2+slf4j (Servlet3.0)

最近对系统中的旧项目实现log升级,选择了log4j2来代替log4j,作为最新一代的log实现,log4j2好在那里可以直接看log4j2性能章节. 这里写写如何从log4j升级到log4j2. 1. maven依赖的变化,对log4j的依赖变成了对log4j2的依赖,在实际使用过程中发现过旧的jboss logging会有问题,使用了3.3.0.Final支持log4j2的版本. <dependency> <groupId>org.apache.logging.log4j<

使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)

说来惭愧,今天就写了个"hello world",了解了一下log4j的日志. 本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置文件开始用的log4j.properties,结果控制台一直打印ERROR StatusLogger No log4j2 configuration file found.也就是Log4j2配置文件没找到的意思. 我就把log4j.properties文件名改成log4j2.properties,结果不报错了

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

一.背景 最近因为公司项目性能需要,我们考虑把以前基于的log4j的日志系统重构成基于Slf4j和log4j2的日志系统,因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见几种日志系统,而使用log4j2而不是log4j是因为Log4j 1.x 在高并发情况下出现死锁导致cpu使用率异常飙升,而Log4j2.0基于LMAX Disruptor的异步日志在多线程环境下性能会远远优于Log4j 1.x和logback(官方数据是10倍以上). 关于slf4j的原理以及优点

log4j报错ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. log4j版本:log4j-core-2.7.jar   log4j-api-2.7.jar log4j2只支持xml和json两种格式的配置,所以配置log4j.properties时,是没有作用的. log4j 2.0与以往的1.x有一个明显的不同,其配置

log4j2和kafka集成

log4j2依赖 <dependency>        <groupId>org.apache.logging.log4j</groupId>        <artifactId>log4j-web</artifactId>        <version>2.4</version>        <scope>runtime</scope>    </dependency> kaf

log4j2简介

前言 在介绍log4j2之前先简单介绍一下Log4j.Logback.SFL4J.JUL.JCL这些东西是什么以及有啥作用. Log4j是什么地球人应该都知道.log4j是Log for Java的简称,是Apache的一个开源子项目,有7种不同的日志级别,从低到高一次为TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF,支持properties和xml两种配置文件,包含Logger.appender.Layout三个主要组件. SFL4J是Si

详解log4j2(上) - 从基础到实战

log4j2相对于log4j 1.x有了脱胎换骨的变化,其官网宣称的优势有多线程下10几倍于log4j 1.x和logback的高吞吐量.可配置的审计型日志.基于插件架构的各种灵活配置等.如果已经掌握log4j 1.x,使用log4j2还是非常简单的. 先看一个示例 1 基础配置 普通Java项目手动添加jar包 [html] view plain copy print? log4j-api-2.5.jar log4j-core-2.5.jar Maven项目pom.xml [html] vie