参考文档
官网 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 2是对Log4j的升级,它比其前身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。
1、Log4j将检查“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自动发现log4j的multicastdns生成的广告,并在Chainsaw的Zeroconf选项卡中显示这些发现的广告(如果jmdns库在Chainsaw的类路径中)。要开始解析和定制广告中提供的日志文件,只需双击Chainsaw的Zeroconf选项卡中的广告条目即可。目前,Chainsaw仅支持FileAppender广告。
要宣传appender配置:
- 从添加JmDns库http://jmdns.sourceforge.net到应用程序类路径
- 将配置元素的'advertiser'属性设置为'multicastdns'
- 将appender元素上的'advertise'属性设置为'true'
- 如果通告基于FileAppender的配置,请将appender元素上的'advertiseURI'属性设置为适当的URI
基于FileAppender的配置需要在appender上指定其他“advertiseURI”属性。'advertiseURI'属性为Chainsaw提供了有关如何访问文件的信息。例如,通过指定Commons VFS(http://commons.apache.org/proper/commons-vfs/)sftp:// URI,http:// 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开始,出于安全原因,Log4j不处理XML文件中的DTD。如果要将配置拆分为多个文件,请使用XInclude或 Composite Configuration。
正如前面的示例以及后面的示例所示,Log4j允许您轻松地重新定义日志记录行为,而无需修改应用程序。可以禁用应用程序某些部分的日志记录,仅在满足特定条件时记录,例如为特定用户执行的操作,将输出路由到Flume或日志报告系统等。能够执行此操作需要了解配置文件的语法。
XML文件中的配置元素接受几个属性:
Attribute Name (属性名称) | Description (描述) |
advertiser | 可选)广告商插件名称,用于通告单个FileAppender或SocketAppender配置。提供的唯一广告商插件是'multicastdns'。 |
dest | “err”,它将输出发送到stderr,或文件路径或URL。 |
monitorInterval | 检查文件配置更改之前必须经过的最短时间(以秒为单位)。 |
name | 配置的名称。 |
packages | 用于搜索插件的逗号分隔的包名列表。每个类加载器只加载一次插件,因此更改此值可能对重新配置没有任何影响。 |
schema | 标识类加载器的位置,以定位用于验证配置的XML架构。仅在strict设置为true时有效。如果未设置,则不会进行架构验证。 |
shutdownHook | 指定当JVM关闭时Log4j是否应自动关闭。默认情况下启用关闭挂钩,但可以通过将此属性设置为“禁用”来禁用 |
shutdownTimeout | 指定JVM关闭时将关闭多少毫秒的appender和后台任务。默认值为零,表示每个appender使用其默认超时,并且不等待后台任务。 并非所有的appender都会尊重这一点,这是一个提示,并不是绝对保证关闭程序不会花费更长时间。 将此设置得太低会增加丢失尚未写入最终目标的未完成日志事件的风险。 请参阅LoggerContext.stop(long,java.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属性,通常会指定一个级别的属性,也可以指定一个加属性。可以使用TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF之一配置级别。如果未指定级别,则默认为ERROR。可以为additivity属性分配值true或false。如果省略该属性,则将使用默认值true。
LoggerConfig(包括根LoggerConfig)可以配置属性,这些属性将添加到从ThreadContextMap复制的属性中。可以从Appenders,Filters,Layouts等引用这些属性,就像它们是ThreadContext Map的一部分一样。这些属性可以包含将在解析配置时解析的变量,也可以包含在记录每个事件时动态解析的变量。有关使用变量的更多信息,请参见属性替换。
LoggerConfig还可以配置一个或多个AppenderRef元素。引用的每个appender将与指定的LoggerConfig关联。如果在LoggerConfig上配置了多个appender,则在处理日志记录事件时会调用每个appender。
每个配置都必须有一个根记录器。如果未配置,则将使用默认根LoggerConfig,其级别为ERROR且附加了Console appender。根记录器和其他记录器之间的主要区别是
- 根记录器没有name属性。
- 根记录器不支持additivity属性,因为它没有父级。
七、Configuring Appenders(配置Appender)
使用特定的appender插件的名称或appender元素以及包含appender插件名称的类型attibute配置appender。此外,每个appender必须具有一个name属性,该属性的值在appender集中是唯一的。记录器将使用该名称来引用appender,如上一节中所述。
大多数appender还支持要配置的布局(也可以使用特定的Layout插件的名称作为元素或使用“layout”作为元素名称以及包含布局插件名称的type属性来指定。各种appender将包含其正常运行所需的其他属性或元素。
八、Configuring Filters(配置过滤器)
Log4j允许在4个位置指定过滤器:
- 与appender,loggers和properties元素处于同一级别。这些过滤器可以在将事件传递给LoggerConfig之前接受或拒绝事件。
- 在记录器元素中。这些过滤器可以接受或拒绝特定记录器的事件。
- 在一个appender元素。这些过滤器可以防止或导致事件由appender处理。
- 在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.与XML和JSON配置类似,属性配置根据插件的插件和属性定义配置。
在2.6版之前,属性配置要求您在具有这些名称的属性中以逗号分隔的列表中列出appender,过滤器和记录器的标识符。然后,期望这些组件中的每一个都以以组件<.identifier>开头的属性集定义。标识符不必与正在定义的组件的名称匹配,但必须唯一标识属于组件的所有属性和子组件。如果标识符列表不存在,则标识符不得包含“.”。每个单独的组件必须具有指定的“type”属性,用于标识组件的插件类型。
从版本2.6开始,不再需要此标识符列表,因为首次使用时会推断出名称,但是如果您希望使用更复杂的标识,则必须仍然使用该列表。如果列表存在,将使用它。
与基本组件不同,在创建子组件时,您无法指定包含标识符列表的元素。相反,您必须使用其类型定义包装元素,如下面的滚动文件appender中的策略定义中所示。然后定义该包装元素下面的每个子组件,因为下面定义了TimeBasedTriggeringPolicy和SizeBasedTriggeringPolicy。
属性配置文件支持广告商,monitorInterval,name,packages,shutdownHook,shutdownTimeout,status,verbose和dest 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有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).
status用来指定log4j本身的打印日志的级别.
monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
(2).Appenders节点,常见的有三种子节点:Console、RollingFile、File.
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 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.
SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
(3).Loggers节点,常见的有两种:Root和Logger.
Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.
Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="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内部各种详细输出--> <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数--> <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并引入的appender,appender才会生效--> <loggers> <!--过滤掉spring和mybatis的一些无用的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>