Log4j2

参考文档

官网 https://logging.apache.org/log4j/2.x/index.html

博客 http://www.aiuxian.com/article/p-2039401.html

博客 https://www.cnblogs.com/hafiz/p/6170702.html

 

Apache Log4j 2Log4j的升,它比其前身Log4j 1.x提供了重大改,并提供了Logback中可用的多改,同修复了Logback架构中的一些固有问题。主要介Log4j2 Configuration(配置)

 

Log4j 2的配置可以通以下四种方式之一完成:

1.通过以XML,JSON,YAML或properties(属性)格式编写的配置文件。

2.以编程方式,通过创建ConfigurationFactory和Configuration实现。

3.以编程方式,通过调用Configuration接口中公开的API将组件添加到默认配置。

4.以编程方式,通过调用内部Logger类的方法。

 

一、Automatic Configuration(自配置)

Log4j在初始化期配置自身。当Log4j动时,它将找到所有ConfigurationFactory插件并按加权顺序从最高到最低排列。交付Log4j包含四个ConfigurationFactory实现:一个用于JSON,一个用于YAML,一个用于properties属性,一个用于XML

1Log4j将检查“log4j.configurationFile”系统属性,如果设置,将尝试使用与文件扩展名匹配的ConfigurationFactory加载配置。

2如果未设置系统属性,则ConfigurationFactory属性将在类路径中查找 log4j2-test.properties。

3如果没有找到这样的文件,YAML ConfigurationFactory将在类路径中查找 log4j2-test.yaml或log4j2-test.yml。

4如果没有找到这样的文件,JSON ConfigurationFactory将在类路径中查找 log4j2-test.json或log4j2-test.jsn。

5如果找不到这样的文件,XML ConfigurationFactory将在类路径中查找 log4j2-test.xml。

6如果找不到测试文件,ConfigurationFactory属性将在类路径上查找 log4j2.properties。

7如果找不到属性文件,YAML ConfigurationFactory将在类路径上查找 log4j2.yaml或log4j2.yml。

8如果找不到YAML文件,JSON ConfigurationFactory将在类路径上查找 log4j2.json或log4j2.jsn。

9如果找不到JSON文件,XML ConfigurationFactory将尝试在类路径上找到 log4j2.xml。

10如果找不到配置文件,则将使用DefaultConfiguration。这将导致日志记录输出转到控制台。

MyApp使用log4j 的示例用程序可用于明如何完成此操作。

import com.foo.Bar;

// Import log4j classes.

import org.apache.logging.log4j.Logger;

import org.apache.logging.log4j.LogManager;



public class MyApp {



// Define a static logger variable so that it references the

// Logger instance named "MyApp".

private static final Logger logger = LogManager.getLogger(MyApp.class);



public static void main(final String... args) {



// Set up a simple configuration that logs on the console.



logger.trace("Entering application.");

Bar bar = new Bar();

if (!bar.doIt()) {

logger.error("Didn't do it.");

}

logger.trace("Exiting application.");

}

}

MyApp首先log4j相关。然后,它定一个名MyApp的静态记录量,该变 恰好是该类的完全限定名称。

MyApp使用com.foo包中定Bar类。 

package com.foo;

import org.apache.logging.log4j.Logger;

import org.apache.logging.log4j.LogManager;



public class Bar {

    static final Logger logger = LogManager.getLogger(Bar.class.getName());



    public boolean doIt() {

        logger.entry();

        logger.error("Did it again!");

        return logger.exit(false);

    }

}

如果无法找到配置文件,Log4j将提供默配置。DefaultConfiguration类中提供的默认配置将设置

ConsoleAppender 连接到根记录器。

PatternLayout 设置“%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"附加到ConsoleAppender

请注意,默认情况下,Log4j会将根记录器分配Level.ERROR

MyApp似于:

17:13:01.540 [main] ERROR com.foo.Bar - Did it again! 
17:13:01.540 [main] ERROR MyApp - Didn't do it.

 

如前所述,Log4j将首先尝试从配置文件中行配置。相当于默认值的配置如下所示:

<?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>

一旦将上面的文件作为log4j2放入类路径中。您将得到与上面列出的结果相同的结果。将根级别更改为trace将得到类似的结果:

17:13:01.540 [main] TRACE MyApp - Entering application. 17:13:01.540 [main] TRACE com.foo.Bar - entry 17:13:01.540 [main] ERROR com.foo.Bar - Did it again! 17:13:01.540 [main] TRACE com.foo.Bar - exit with (false) 17:13:01.540 [main] ERROR MyApp - Didn't do it. 17:13:01.540 [main] TRACE MyApp - Exiting application.

请注意,使用默认配置时,将禁用状态记录

 

二、Additivity可加性

也许希望消除除com.foo.Bar之外的所有跟踪输出。仅仅更改日志级别并不能完成任务。相反,解决方案是在配置中添加一个新的日志记录器定义:

<Logger name="com.foo.Bar" level="TRACE"/>

<Root level="ERROR">

<AppenderRef ref="STDOUT">

</Root>

使用此配置,将记录来自 com.foo.Bar 的所有日志事件,而只记录来自所有其他组件的错误事件。

在上一个示例中,com.foo.Bar中的所有事件仍然写入控制台。这是因为com.foo.Bar的日志记录器没有配置任何appender,而其父记录器配置了appender。实际上,下面是配置

<?xml version="1.0" encoding="UTF-8"?>

<Appenders>

<Console name="Console" target="SYSTEM_OUT">

<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>

</Console>

</Appenders>

<Loggers>

<Logger name="com.foo.Bar" level="trace">

<AppenderRef ref="Console"/>

</Logger>

<Root level="error">

<AppenderRef ref="Console"/>

</Root>

</Loggers>

</Configuration>

17:13:01.540 [main] TRACE com.foo.Bar - entry 17:13:01.540 [main] TRACE com.foo.Bar - entry 17:13:01.540 [main] ERROR com.foo.Bar - Did it again! 17:13:01.540 [main] TRACE com.foo.Bar - exit (false) 17:13:01.540 [main] TRACE com.foo.Bar - exit (false) 17:13:01.540 [main] ERROR MyApp - Didn't do it.

注意,来自com.foo.Bar的跟踪消息出现了两次。这是因为首先使用与日志记录器com.foo.Bar关联的appender,它将第一个实例写到控制台。接下来,引用com.foo.Bar的父类(在本例中是根日志记录器)。然后将事件传递给它的appender, appender也将写入控制台,从而产生第二个实例。这就是可加性。虽然可加性可能是一个非常方便的特性(正如前面的第一个例子中,不需要配置追加引用),但在许多情况下,这种行为被认为是不可取的,因此可以通过将日志记录器上的可加性属性设置为false来禁用它:

<?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>

<Logger name="com.foo.Bar" level="trace" additivity="false">

<AppenderRef ref="Console"/>

</Logger>

<Root level="error">

<AppenderRef ref="Console"/>

</Root>

</Loggers>

</Configuration>

一旦事件到达可加性设置为false的日志记录器,该事件将不会传递给它的任何父日志记录器,无论它们的可加性设置如何。

 

三、Automatic Reconfiguration (自重新配置)

当从文件中配置时,Log4j能够自动检测对配置文件的更改并重新配置自己。如果在配置元素上指定monitorInterval属性并将其设置为非零值,那么在下一次计算日志事件和/或记录日志时,将检查文件,并且monitorInterval已经过了上次检查。下面的示例展示了如何配置该属性,以便在至少30秒之后才检查配置文件是否有更改。最小间隔是5秒。

<?xml version="1.0" encoding="UTF-8"?>

<Configuration monitorInterval="30">

...

</Configuration>

 

 

四、Chainsaw 可以自动处理日志文件(广告追加配置)

Log4j提供了为所有基于文件的appender和基于套接字的appender“发布”appender配置细节的能力。例如,对于基于文件的appender,文件中的文件位置和模式布局包含在广告中。Chainsaw和其他外部系统可以发现这些广告,并使用这些信息智能地处理日志文件。

 

公开广告的机制以及广告格式特定于每个广告商实现。希望使用特定广告商施的外部系了解如何定位广告配置以及广告的格式。例如,数据广告商可以将配置细节在数据表中。外部系可以数据表,以便发现文件位置和文件格式。

 

Log4j提供了一个广告商实现,一个'multicastdns'广告商,它使用http://jmdns.sourceforge.net库通过IP多播广告appender配置细节

 

Chainsaw动发现log4jmulticastdns生成的广告,并在ChainsawZeroconf选项卡中显示这些发现的广告(如果jmdns库在Chainsaw路径中)。要开始解析和定制广告中提供的日志文件,只需双ChainsawZeroconf选项卡中的广告条目即可。目前,Chainsaw仅支持FileAppender广告。

 

要宣appender配置:

  • 从添加JmDns库http://jmdns.sourceforge.net到应用程序类路径
  • 将配置元素的'advertiser'属性设置为'multicastdns'
  • 将appender元素上的'advertise'属性设置为'true'
  • 如果通告基于FileAppender的配置,请将appender元素上的'advertiseURI'属性设置为适当的URI

基于FileAppender的配置需要在appender上指定其他“advertiseURI”属性。'advertiseURI'属性Chainsaw提供了有关如何访问文件的信息。例如,通指定Commons VFShttp://commons.apache.org/proper/commons-vfs/sftp// URIhttp// URI,可以通ssh / sftp远程访问Chainsaw文件如果文件可通Web访问可以使用;如果从本地运行的Chainsaw实例访问文件可以指定文件:// URI

下面是一个支持广告的appender配置示例,本地运行的Chainsaw可以使用它来自拖尾日志文件(注意文件:// advertiseURI):

请注意,您必须从JmDns库添加http://jmdns.sourceforge.net 为了与“multicastdns”广告商,宣您的用程序的路径。

<?xml version="1.0" encoding="UTF-8"?>

<Configuration advertiser="multicastdns">

...

</Configuration>

<Appenders>

<File name="File1" fileName="output.log" bufferedIO="false" advertiseURI="file://path/to/output.log" advertise="true">

...

</File>

</Appenders>

 

五、Configuration Syntax(配置法)

从版本2.9开始,出于安全原因,Log4jXML文件中的DTD。如果要将配置拆分多个文件,使用XInclude Composite Configuration

正如前面的示例以及后面的示例所示,Log4j松地重新定日志记录,而无需修改用程序。可以禁用用程序某些部分的日志记录足特定条件时记录,例如特定用户执行的操作,将出路由到Flume或日志告系等。能够执行此操作需要了解配置文件的法。

XML文件中的配置元素接受几个属性:

Attribute Name

(属性名称)

Description

描述

advertiser

)广告商插件名称,用于通告FileAppenderSocketAppender配置。提供的唯一广告商插件是'multicastdns'

dest

“err”,它将送到stderr,或文件路径或URL

monitorInterval

检查文件配置更改之前必须经过的最短时间(以秒为单位)

name

配置的名称。

packages

用于搜索插件的逗号分隔的包名列表。每个器只加一次插件,因此更改此可能重新配置没有任何影响。

schema

标识类加载器的位置,以定位用于验证配置的XML架构。仅在strict设置为true时有效。如果未设置,则不会进行架构验证。

shutdownHook

指定当JVM闭时Log4j是否。默情况下启用关,但可以通将此属性禁用来禁用

shutdownTimeout

指定JVM闭时将关多少毫秒的appender和后台任。默认值为零,表示每个appender使用其默,并且不等待后台任

并非所有的appender都会尊重一点,是一个提示,并不是绝对程序不会花长时间

将此置得太低会增加失尚未写入最的未完成日志事件的风险

请参阅LoggerContext.stoplongjava.util.concurrent.TimeUnit。(如果shutdownHook设置为禁用不使用。)

status

应记录到控制台的内部Log4j事件的级别。此属性的有效值为“trace”“debug”“info”“warn”“error”“fatal”Log4j会将有关初始化,

和其他内部操作的详细信息记录到状态记录器。如果需要log4j进行故障排除,设置status =“trace”是您可以使用的第一个工具之一。

(或者,置系属性log4j2.debug也会将内部Log4j2日志记录打印到控制台,包括在找到配置文件之前生的内部日志记录。)

strict

使用格的XML格式。JSON配置不支持。

verbose

插件启用断信息。

可以使用两种XML格式配置Log4j<简洁的>和<严格的>。这种简洁的格式使得配置非常简单,因为元素名与它们所表示的组件匹配,但是不能用XML模式对其进行验证。例如,ConsoleAppender通过在其父appenders元素下声明名为Console的XML元素来配置。但是,元素名和属性名不区分大小写。此外,属性可以指定为XML属性,也可以指定为没有属性但具有文本值的XML元素。所以

<PatternLayout pattern="%m%n"/>

<PatternLayout> <Pattern>%m%n</Pattern> </PatternLayout>

是等价的。

下面的文件表示XML配置的结构,但是请注意,下面的斜体元素表示将出现在相应位置的简明元素名称。

<?xml version="1.0" encoding="UTF-8"?>;

<Configuration>

<Properties>

<Property name="name1">value</property>

<Property name="name2" value="value2"/>

</Properties>

<filter ... />

<Appenders>

<appender ... >

<filter ... />

</appender>

...

</Appenders>

<Loggers>

<Logger name="name1">

<filter ... />

</Logger>

...

<Root level="level">

<AppenderRef ref="name"/>

</Root>

</Loggers>

</Configuration>

有关示例appender、filter和logger声明,请参阅此页上的许多示例。

严格的XML

除了上面简洁XML格式之外,Log4j还允许以更正常XML方式指定配置,可以使用XML Schema进行验证。这是通过将上面的友好元素名称替换为其对象类型来实现的,如下所示。例如,不是使用名为Console的元素配置ConsoleAppender,而是将其配置具有包含“Console”type属性的appender元素。

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="debug" strict="true" name="XMLConfigTest"

packages="org.apache.logging.log4j.test">

<Properties>

<Property name="filename">target/test.log</Property>

</Properties>

<Filter type="ThresholdFilter" level="trace"/>

 

<Appenders>

<Appender type="Console" name="STDOUT">

<Layout type="PatternLayout" pattern="%m MDC%X%n"/>

<Filters>

<Filter type="MarkerFilter" marker="FLOW" onMatch="DENY" onMismatch="NEUTRAL"/>

<Filter type="MarkerFilter" marker="EXCEPTION" onMatch="DENY" onMismatch="ACCEPT"/>

</Filters>

</Appender>

<Appender type="Console" name="FLOW">

<Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n"/><!-- class and line number -->

<Filters>

<Filter type="MarkerFilter" marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL"/>

<Filter type="MarkerFilter" marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/>

</Filters>

</Appender>

<Appender type="File" name="File" fileName="${filename}">

<Layout type="PatternLayout">

<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>

</Layout>

</Appender>

</Appenders>

 

<Loggers>

<Logger name="org.apache.logging.log4j.test1" level="debug" additivity="false">

<Filter type="ThreadContextMapFilter">

<KeyValuePair key="test" value="123"/>

</Filter>

<AppenderRef ref="STDOUT"/>

</Logger>

 

<Logger name="org.apache.logging.log4j.test2" level="debug" additivity="false">

<AppenderRef ref="File"/>

</Logger>

 

<Root level="trace">

<AppenderRef ref="STDOUT"/>

</Root>

</Loggers>

 

</Configuration>

 

六、Configuring loggers配置记录

使用logger元素配置LoggerConfig 记录器元素必指定name属性,通常会指定一个级别的属性,也可以指定一个加属性。可以使用TRACEDEBUGINFOWARNERRORALLOFF之一配置级别。如果未指定级别认为ERROR。可以additivity属性分配truefalse。如果省略属性,将使用默认值true

 

LoggerConfig(包括根LoggerConfig)可以配置属性,些属性将添加到从ThreadContextMap复制的属性中。可以从AppendersFiltersLayouts等引用些属性,就像它ThreadContext Map的一部分一些属性可以包含将在解析配置解析的量,也可以包含在记录每个事件时动态解析的量。有关使用量的更多信息,属性替

 

LoggerConfig还可以配置一个或多个AppenderRef元素。引用的每个appender将与指定的LoggerConfig。如果在LoggerConfig上配置了多个appender理日志记录事件用每个appender

每个配置都必有一个根记录。如果未配置,将使用默LoggerConfig,其级别为ERROR且附加了Console appender。根记录器和其他记录器之的主要区

  1. 根记录器没有name属性。
  2. 根记录器不支持additivity属性,因为它没有父级。

 

七、Configuring Appenders(配置Appender

使用特定的appender插件的名称或appender元素以及包含appender插件名称的attibute配置appender。此外,每个appender具有一个name属性,属性的appender集中是唯一的。记录器将使用名称来引用appender,如上一中所述。

大多数appender还支持要配置的布局(也可以使用特定的Layout插件的名称作元素或使用“layout”元素名称以及包含布局插件名称的type属性来指定。各种appender将包含其正常运行所需的其他属性或元素。

 

八、Configuring Filters(配置过滤器)

Log4j4个位置指定过滤器:

  1. 与appender,loggers和properties元素处于同一级别。这些过滤器可以在将事件传递给LoggerConfig之前接受或拒绝事件。
  2. 在记录器元素中。这些过滤器可以接受或拒绝特定记录器的事件。
  3. 在一个appender元素。这些过滤器可以防止或导致事件由appender处理。
  4. 在appender引用元素中。这些过滤器用于确定Logger是否应将事件路由到appender。

虽然只能配置单个筛选器元素,但该元素可能是代表CompositeFilter的筛选器元素。筛选器元素允许在其中配置任意数量的筛选器元素。下面的示例显示如何在ConsoleAppender上配置多个过滤器。

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="debug" name="XMLConfigTest" packages="org.apache.logging.log4j.test">

<Properties>

<Property name="filename">target/test.log</Property>

</Properties>

<ThresholdFilter level="trace"/>

 

<Appenders>

<Console name="STDOUT">

<PatternLayout pattern="%m MDC%X%n"/>

</Console>

<Console name="FLOW">

<!-- this pattern outputs class name and line number -->

<PatternLayout pattern="%C{1}.%M %m %ex%n"/>

<filters>

<MarkerFilter marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL"/>

<MarkerFilter marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/>

</filters>

</Console>

<File name="File" fileName="${filename}">

<PatternLayout>

<pattern>%d %p %C{1.} [%t] %m%n</pattern>

</PatternLayout>

</File>

</Appenders>

 

<Loggers>

<Logger name="org.apache.logging.log4j.test1" level="debug" additivity="false">

<ThreadContextMapFilter>

<KeyValuePair key="test" value="123"/>

</ThreadContextMapFilter>

<AppenderRef ref="STDOUT"/>

</Logger>

 

<Logger name="org.apache.logging.log4j.test2" level="debug" additivity="false">

<Property name="user">${sys:user.name}</Property>

<ThreadContextMapFilter>

<KeyValuePair key="test" value="123"/>

</ThreadContextMapFilter>

</AppenderRef>

<AppenderRef ref="STDOUT" level="error"/>

</Logger>

 

<Root level="trace">

<AppenderRef ref="STDOUT"/>

</Root>

</Loggers>

 

</Configuration>

 

九、Property Substitution属性替

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="debug" name="RoutingTest" packages="org.apache.logging.log4j.test">

<Properties>

<Property name="filename">target/rolling1/rollingtest-$${sd:type}.log</Property>

</Properties>

<ThresholdFilter level="debug"/>

 

<Appenders>

<Console name="STDOUT">

<PatternLayout pattern="%m%n"/>

<ThresholdFilter level="debug"/>

</Console>

<Routing name="Routing">

<Routes pattern="$${sd:type}">

<Route>

<RollingFile name="Rolling-${sd:type}" fileName="${filename}"

filePattern="target/rolling1/test1-${sd:type}.%i.log.gz">

<PatternLayout>

<pattern>%d %p %c{1.} [%t] %m%n</pattern>

</PatternLayout>

<SizeBasedTriggeringPolicy size="500" />

</RollingFile>

</Route>

<Route ref="STDOUT" key="Audit"/>

</Routes>

</Routing>

</Appenders>

 

<Loggers>

<Logger name="EventLogger" level="info" additivity="false">

<AppenderRef ref="Routing"/>

</Logger>

 

<Root level="error">

<AppenderRef ref="STDOUT"/>

</Root>

</Loggers>

 

</Configuration>

 

十、Configuration with Properties使用属性配置)

从版本2.4开始,Log4j现在支持通过属性文件进行配置。请注意,属性语法与Log4j中使用的法不同1.XMLJSON配置似,属性配置根据插件的插件和属性定配置。

 

2.6版之前,属性配置要求您在具有些名称的属性中以逗号分隔的列表中列出appender过滤器和记录器的标识符。然后,期望件中的每一个都以以组件<.identifier>的属性集定标识符不必与正在定义的组件的名称匹配,但必须唯一标识属于组件的所有属性和子组件。如果标识符列表不存在,则标识符不得包含“.”。每个独的组件必须具有指定的“type”属性,用于标识组件的插件型。

 

从版本2.6开始,不再需要此标识符列表,因首次使用会推断出名称,但是如果您希望使用更复标识仍然使用列表。如果列表存在,将使用它。

与基本件不同,在建子,您无法指定包含标识符列表的元素。相反,您必使用其型定包装元素,如下面的滚动文件appender中的策略定中所示。然后定义该包装元素下面的每个子件,因下面定TimeBasedTriggeringPolicySizeBasedTriggeringPolicy

 

属性配置文件支持广告商,monitorIntervalnamepackagesshutdownHookshutdownTimeoutstatusverbosedest attrbutes。有关 些属性的定义,请参阅配置

status = error

dest = err

name = PropertiesConfig

 

property.filename = target/rolling/rollingtest.log

 

filter.threshold.type = ThresholdFilter

filter.threshold.level = debug

 

appender.console.type = Console

appender.console.name = STDOUT

appender.console.layout.type = PatternLayout

appender.console.layout.pattern = %m%n

appender.console.filter.threshold.type = ThresholdFilter

appender.console.filter.threshold.level = error

 

appender.rolling.type = RollingFile

appender.rolling.name = RollingFile

appender.rolling.fileName = ${filename}

appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz

appender.rolling.layout.type = PatternLayout

appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n

appender.rolling.policies.type = Policies

appender.rolling.policies.time.type = TimeBasedTriggeringPolicy

appender.rolling.policies.time.interval = 2

appender.rolling.policies.time.modulate = true

appender.rolling.policies.size.type = SizeBasedTriggeringPolicy

appender.rolling.policies.size.size=100MB

appender.rolling.strategy.type = DefaultRolloverStrategy

appender.rolling.strategy.max = 5

 

logger.rolling.name = com.example.my.app

logger.rolling.level = debug

logger.rolling.additivity = false

logger.rolling.appenderRef.rolling.ref = RollingFile

 

rootLogger.level = info

rootLogger.appenderRef.stdout.ref = STDOUT

 

一、博客转载

1、关于配置文件的名称以及在目中的存放位置

    log4j 2.x版本不再支持像1.x中的.properties的文件配置方式,2.x版本配置文件后名只能".xml",".json"或者".jsn".

    系统选择配置文件的(从先到后)如下:

      (1).classpath下的名log4j2-test.json 或者log4j2-test.jsn的文件.

      (2).classpath下的名log4j2-test.xml的文件.

      (3).classpath下名log4j2.json 或者log4j2.jsn的文件.

      (4).classpath下名log4j2.xml的文件.

     我一般默使用log4j2.xml进行命名。如果本地要测试,可以把log4j2-test.xml放到classpath,而正式境使用log4j2.xml在打包部署的候不要打包log4j2-test.xml即可。

 

2、缺省默配置文件

<?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>

 

3、配置文件点解析    

    (1).Configuration有两个属性:statusmonitorinterval,有两个子:AppendersLoggers(表明可以定多个AppenderLogger).

       status用来指定log4j本身的打印日志的级别.

       monitorinterval用于指定log4j重新配置的监测间时间位是s,最小是5s.

    (2).Appenders节点,常见的有三种子节点:ConsoleRollingFileFile.

       Console节点用来定义输出到控制台的Appender.

        name:指定Appender的名字.

        target:SYSTEM_OUT SYSTEM_ERR,一般只置默:SYSTEM_OUT.

        PatternLayout:输出格式,不设置默认为:%m%n.

       File节点用来定义输出到指定位置的文件的Appender.

        name:指定Appender的名字.

        fileName:指定出日志的目的文件全路径的文件名.

        PatternLayout:输出格式,不设置默认为:%m%n.

       RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.

        name:指定Appender的名字.

        fileName:指定出日志的目的文件全路径的文件名.

        PatternLayout:输出格式,不设置默认为:%m%n.

        filePattern:指定新建日志文件的名称格式.

        Policies:指定滚动日志的策略,就是什么行新建日志文件出日志.

        TimeBasedTriggeringPolicy:Policies点,基于时间滚动策略,interval属性用来指定多久滚动一次,默1 hourmodulate=true用来时间:比如在是早上3aminterval4,那么第一次滚动是在4am,接着是8am12am...而不是7am.

        SizeBasedTriggeringPolicy:Policies点,基于指定文件大小的滚动策略,size属性用来定每个日志文件的大小.

        DefaultRolloverStrategy:用来指定同一个文件下最多有几个日志文件开始除最旧的,建新的(max属性)

    (3).Loggers节点,常见的有两种:RootLogger.

       Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默使用Root日志

         level:日志级别,共有8级别,按照从低到高All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

         AppenderRefRoot的子点,用来指定日志出到哪个Appender.

       Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

         level:日志级别,共有8级别,按照从低到高All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

         name:用来指定Logger所适用的或者所在的包全路径,继承自Root节点.

         AppenderRefLogger的子点,用来指定日志出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的AppenderRootAppender中都会出,此可以Loggeradditivity="false"只在自定Appender出。

    (4).关于日志level.

      共有8级别,按照从低到高All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

      All:最低等的,用于打开所有日志记录.

      Trace:是追踪,就是程序推以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.

      Debug:指出粒度信息事件对调试应用程序是非常有帮助的.

      Info:消息在粗粒度级别上突出强调应用程序的运行.

      Warn:输出警告及warn以下级别的日志.

      Error:输出错误信息日志.

      Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.

      OFF:最高等的,用于关所有日志记录.

      程序会打印高于或等于所级别的日志,置的日志等越高,打印出来的日志就越少

 

4、比完整的log4j2.xml配置模板

<?xml version="1.0" encoding="UTF-8"?> <!--日志级别以及排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration后面的status个用于log4j2自身内部的信息出,可以不置,当置成trace时,你会看到log4j2内部各种详细输--> <!--monitorIntervalLog4j动检测修改配置 文件和重新配置本身,隔秒数--> <configuration status="WARN" monitorInterval="30"> <!--先定所有的appender--> <appenders> <!--这个输出控制台的配置--> <console name="Console" target="SYSTEM_OUT"> <!--输出日志的格式--> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> </console> <!--文件会打印出所有信息,log每次运行程序会自清空,由append属性决定,个也挺有用的,适合临时测试--> <File name="log" fileName="log/test.log" append="false"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!-- 这个会打印出所有的info及以下级别的信息,每次大小超size则这size大小的日志会自存入按年份-月份建立的文件下面并压缩,作存档--> <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> <!--控制台只level及以上级别的信息(onMatch),其他的直接拒onMismatch--> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> <!-- DefaultRolloverStrategy属性如不置,认为最多同一文件7个文件,置了20 --> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> </appenders> <!--然后定logger,只有定logger并引入的appenderappender才会生效--> <loggers> <!--过滤掉springmybatis的一些无用的DEBUG信息--> <logger name="org.springframework" level="INFO"></logger> <logger name="org.mybatis" level="INFO"></logger> <root level="all"> <appender-ref ref="Console"/> <appender-ref ref="RollingFileInfo"/> <appender-ref ref="RollingFileWarn"/> <appender-ref ref="RollingFileError"/> </root> </loggers> </configuration>

 

二、

<?xml version="1.0" encoding="UTF-8"?>

<configuration status="OFF">

<properties>

<property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L - %msg%n</property>

<property name="default_file_name">logs/app.log</property>

<property name="rolling_file_name">logs/app-%d{yyyy-MM-dd}-%i.log</property>

<property name="every_file_size">50M</property>

</properties>

<appenders>

<Console name="Console" target="SYSTEM_OUT">

<PatternLayout pattern="${pattern}"/>

</Console>

<RollingFile name="RollingFile" fileName="${default_file_name}" filePattern="${rolling_file_name}">

<PatternLayout pattern="${pattern}"/>

<SizeBasedTriggeringPolicy size="${every_file_size}"/>

</RollingFile>

</appenders>

 

<loggers>

<logger name="com.haima" level="info"/>

<root level="info">

<appender-ref ref="RollingFile"/>

</root>

</loggers>

</configuration>

 

三、

<?xml version="1.0" encoding="UTF-8"?>

<Configuration monitorInterval="1" status="ERROR" strict="true" name="LogConfig">

<Properties>

<Property name="logbasedir">e:/log</Property>

<Property name="log.layout">%d %-5p %t (%c:%L) - %m%n</Property>

</Properties>

 

<!--使用了两种型的appender,RollingFile为滚动类型,满足策略条件后会新建文件夹记录 -->

<Appenders>

<Appender type="Console" name="STDOUT">

<Target>SYSTEM_OUT</Target>

<Layout type="PatternLayout" pattern="${log.layout}"/>

</Appender>

<Appender type="RollingFile" name="FILE" fileName="${logbasedir}/jutap-${sys:APPNAME}.log"

filePattern="${logbasedir}/jutap-${sys:APPNAME}-%d{yyyy-MM-dd}.%i.log">

<Policies>

<TimeBasedTriggeringPolicy/>

<SizeBasedTriggeringPolicy size="100 MB"/>

</Policies>

<Layout type="PatternLayout">

<Charset>GBK</Charset>

<Pattern>${log.layout}</Pattern>

</Layout>

</Appender>

<Appender type="RollingFile" name="ExceptionLog" fileName="${logbasedir}/exception-${sys:APPNAME}.log"

filePattern="${logbasedir}/exception-${sys:APPNAME}-%d{yyyy-MM-dd}.%i.log">

<Policies>

<TimeBasedTriggeringPolicy/>

<SizeBasedTriggeringPolicy size="100 MB"/>

</Policies>

<Layout type="PatternLayout">

<Charset>GBK</Charset>

<Pattern>${log.layout}</Pattern>

</Layout>

</Appender>

</Appenders>

 

<Loggers>

<Logger name="exception" level="error" additivity="false">

<AppenderRef ref="ExceptionLog"/>

</Logger>

 

<Root level="info">

<AppenderRef ref="STDOUT"/>

<AppenderRef ref="FILE"/>

</Root>

<Logger name="com.garfield.learn" level="debug"/>

<Logger name="com.garfield.learnp" level="info"/>

</Loggers>

 

</Configuration>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值