Log4j 2.x 配置详解及详细配置例子

本文主要内容分为以下两部分:
  1. Log4j 2.x的官方配置详解的翻译总结
  2. Log4j 2.x的详细配置例子及注释
更多有关Log4j的内容详见Log4j 2.x的体系架构详解

配置语法

从版本2.9开始,出于安全原因,Log4j不会在XML文件中处理DTD。如果要将配置拆分为多个文件,请使用XIncludeComposite Configuration

正如之前的例子所描述,Log4j允许您轻松地重新定义日志记录行为,而无需修改您的应用程序。可以禁用应用程序的某些部分的日志记录,只有在满足特定条件时才进行日志记录,如针对特定用户执行的操作、将输出传递到日志报告系统等。需要理解配置文件的语法后方能做到上述操作。

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

属性名称描述
advertiser(可选)广告者插件名,用于将单个FileAppender或SocketAppender配置公布出去。现在只支持“multicastdns”。
dest值为“err”、文件路径或URL。当值为“err”时会将输出发送到stderr
monitorInterval在检查文件配置更改之前必须经过的最小时间量(以秒为单位)。
name配置的名称。
packages以逗号分隔的包名列表,搜索插件时需要用到。每个类加载器只会加载一次插件,所以更改此值可能对重新配置没有任何影响。
schema标识类加载器的位置,以定位用于验证配置的XML模式。只有严格设置为true时才有效。如果没有设置,将不会发生模式验证。
shutdownHook指定在JVM关闭时是否自动关闭Log4j。此属性默认为“enable”,但可以通过将此属性设置为“disable”来禁用。
shutdownTimeout指定在JVM关闭时,appender和后台任务在多少毫秒后关闭。默认值为零,这意味着每个appender使用其默认超时,并且不需等待后台任务。然而并非所有的appender都会尊重这一点,这只是示意JVM关闭,并不是绝对保证关机程序不会花费更长的时间。将其设置得太低会增加丢失尚未写入最终目的地的未完成日志事件的风险。详情请参阅LoggerContext.stop(long,java.util.concurrent.TimeUnit)。(如果shutdownHook设置为“disable”,则不起作用。)
status应该记录到控制台的内部Log4j事件的级别。这个属性的有效值是“trace”,“debug”,“info”,“warn”,“error”和“fatal”。Log4j会记录有关初始化,翻转和其他内部操作的细节到状态记录器。如果您需要对log4j进行故障排除,设置status="trace"是您可以使用的工具之一。(或者,设置系统属性log4j2.debug也会打印内部Log4j2日志记录到控制台,包括发现配置文件之前发生的内部日志记录。)
strict允许使用严格的XML格式。在JSON配置中不受支持。
verbose加载插件时启用诊断信息。

Logger配置

在尝试配置它们之前,我们先了解Log4j中的logger是如何工作的。如果需要更多信息,请参考Log4j 体系结构。在不理解这些概念的情况下尝试配置Log4j会遇到很多挫折。

LoggerConfig是使用logger元素配置的。该logger元素必须指定name属性,通常情况下会指定一个level的属性,也可以指定一个additivity属性。级别可以配置为TRACEDEBUGINFOWARNERRORALLOFF之一。如果没有指定级别,则默认为ERROR。可以为addability属性赋值truefalse。如果该属性被省略,则将使用默认值true

LoggerConfig(包括根LoggerConfig)可以配置属性,这些属性将被添加到从ThreadContextMap复制的属性中。这些属性可以从Appenders,Filters,Layouts等引用,就像它们是ThreadContext Map的一部分一样。 属性可以包含将在解析配置时解析的变量,或者在记录每个事件时动态解析的变量。 有关使用变量的更多信息,请参阅Property Substitution

LoggerConfig也可以配置一个或多个AppenderRef元素。 每个引用的appender都将与指定的LoggerConfig关联。如果在LoggerConfig上配置了多个appender,则在处理日志记录事件时会调用它们中的每一个。

每个Log4j整体配置都必须有根记录器(root logger)。 如果没有配置默认根LoggerConfig,默认使用级别为ERROR并且连接了一个控制台appender的根LoggerConfig。根记录器和其他记录器之间的主要区别是

  1. 根记录器没有名称属性。
  2. 根记录器不支持可加性属性,因为它没有父级。

Appender配置

appender配置使用 特定的appender插件的名称类型属性值为appender插件的名称的appender元素。另外,每个appender必须有一个名字属性,指定一个在appender集合中唯一的值。logger将使用该名称来引用appender,如前一节所述。

<Appenders>
	<!-- 类型属性值为appender插件的名称的appender元素 -->
    <appender type="Console" name="OUT"/>

	<!-- 使用特定的appender插件的名称 -->
    <Console name="STDOUT">
      <PatternLayout pattern="%m MDC%X%n"/>
    </Console>
</Appenders>

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

Filter配置

Log4j允许在4个地方中指定一个Filter:

  1. 与appenders,loggers和属性元素相同的级别。这些filter可以在传递给LoggerConfig之前接受或拒绝事件。
  2. 在一个logger元素内。这些filter可以接受或拒绝特定记录器的事件。
  3. 在一个appender元素内。这些filter可以防止或引起appender处理事件。
  4. 在appender引用元素中。这些filter用于确定logger是否应该将事件路由到appender。

尽管只能配置一个filter元素,但该元素可能是代表CompositeFilter 的filters元素。filters元素允许任何数量的filter元素配置在内。以下示例显示了如何在ConsoleAppender上配置多个filter。

<?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>
      <AppenderRef ref="File">
        <ThreadContextMapFilter>
          <KeyValuePair key="test" value="123"/>
        </ThreadContextMapFilter>
      </AppenderRef>
      <AppenderRef ref="STDOUT" level="error"/>
    </Logger>
 
    <Root level="trace">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
 
</Configuration>

Layout配置

Appender使用Layout将LogEvent格式化为满足处理日志事件需求的表单。在Log4j 1.x和Logback Layouts中,是将一个事件转换成一个String。在Log4j中,Layout返回一个字节数组。这可以使布局的结果在更多类型的Appender中有用。但是,这意味着您需要使用Charset配置大多数布局,以确保字节数组包含正确的值。

使用Charset的布局的根类是org.apache.logging.log4j.core.layout.AbstractStringLayout ,其中缺省值是UTF-8。每个扩展AbstractStringLayout的Layout都可以提供自己的默认值。

Log4j 2.4.1为ISO-8859-1US-ASCII字符集添加了一个自定义字符编码器,将Java 8内置的一些性能改进功能添加到Log4j中,以便在Java 7上使用。对于仅记录日志的应用程序,指定ISO-8859-1字符集将显着提高性能。

Log4j提供的转换模式
  • %m 输出代码中指定的消息
  • %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  • %r 输出自应用启动到输出该log信息耗费的毫秒数
  • %c 输出所属的类目,通常就是所在类的全名
  • %t 输出产生该日志事件的线程名
  • %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
  • %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式
    如:%d{dd MMM yyyy HH:mm:ss,SSS},输出类似:02 Nov 2012 14:34:02,781
  • %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
    如:Testlog.main(TestLog.java:10)
  • %F 输出日志消息产生时所在的文件名称
  • %L 输出代码中的行号
  • %x 输出和当前线程相关联的NDC(嵌套诊断环境),像java servlets多客户多线程的应用中
  • %% 输出一个"%"字符

更多转换模式详见官方文档

配置方式

XML配置

Log4j可以使用两种XML风格进行配置:简洁和严谨。简洁的格式使配置变得非常简单,因为元素名称与它们所代表的组件相匹配,但无法用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模式进行验证。这是通过用它们的对象类型替换上面的友好元素名来完成的,如下所示。例如,不是使用名为Console的元素来配置ConsoleAppender,而是将其配置为具有包含“Console”的类型属性的appender元素。

<?xml version="1.0" encoding="UTF-8"?>;
<Configuration>
  <Properties>
    <Property name="name1">value</property>
    <Property name="name2" value="value2"/>
  </Properties>
  <Filter type="type" ... />
  <Appenders>
    <Appender type="type" name="name">
      <Filter type="type" ... />
    </Appender>
    ...
  </Appenders>
  <Loggers>
    <Logger name="name1">
      <Filter type="type" ... />
    </Logger>
    ...
    <Root level="level">
      <AppenderRef ref="name"/>
    </Root>
  </Loggers>
</Configuration>

以下是使用严格格式的示例配置。

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

JSON配置

除了XML之外,还可以使用JSON配置Log4j。JSON格式与简洁的XML格式非常相似。每个键表示插件的名称,而与其关联的键/值对是其属性。如果一个键所包含的不仅仅是一个简单的值,它本身就是一个从属插件。在下面的示例中,ThresholdFilter,Console和PatternLayout都是插件,而Console插件将为其name属性分配一个STDOUT值,并且将为ThresholdFilter分配一个调试级别。

{ "configuration": { "status": "error", "name": "RoutingTest",
                     "packages": "org.apache.logging.log4j.test",
      "properties": {
        "property": { "name": "filename",
                      "value" : "target/rolling1/rollingtest-$${sd:type}.log" }
      },
    "ThresholdFilter": { "level": "debug" },
    "appenders": {
      "Console": { "name": "STDOUT",
        "PatternLayout": { "pattern": "%m%n" },
        "ThresholdFilter": { "level": "debug" }
      },
      "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"},
                "SizeBasedTriggeringPolicy": { "size": "500" }
              }
            },
            { "AppenderRef": "STDOUT", "key": "Audit"}
          ]
        }
      }
    },
    "loggers": {
      "logger": { "name": "EventLogger", "level": "info", "additivity": "false",
                  "AppenderRef": { "ref": "Routing" }},
      "root": { "level": "error", "AppenderRef": { "ref": "STDOUT" }}
    }
  }
}

请注意,在RoutingAppender中,Route元素已被声明为一个数组。这是有效的,因为每个数组元素将是一个Route组件。这对于诸如appender和filter之类的元素不起作用,其中每个元素具有不同的简洁格式的名称。Appender和Filter可以定义为数组元素,如果每个appender或filter声明一个名为“type”的属性包含appender的类型。以下示例说明了这一点以及如何将多个logger声明为数组。

{ "configuration": { "status": "debug", "name": "RoutingTest",
                      "packages": "org.apache.logging.log4j.test",
      "properties": {
        "property": { "name": "filename",
                      "value" : "target/rolling1/rollingtest-$${sd:type}.log" }
      },
    "ThresholdFilter": { "level": "debug" },
    "appenders": {
      "appender": [
         { "type": "Console", "name": "STDOUT", "PatternLayout": { "pattern": "%m%n" }, "ThresholdFilter": { "level": "debug" }},
         { "type": "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"},
                  "SizeBasedTriggeringPolicy": { "size": "500" }
                }
              },
              { "AppenderRef": "STDOUT", "key": "Audit"}
            ]
          }
        }
      ]
    },
    "loggers": {
      "logger": [
        { "name": "EventLogger", "level": "info", "additivity": "false",
          "AppenderRef": { "ref": "Routing" }},
        { "name": "com.foo.bar", "level": "error", "additivity": "false",
          "AppenderRef": { "ref": "STDOUT" }}
      ],
      "root": { "level": "error", "AppenderRef": { "ref": "STDOUT" }}
    }
  }
}

注:使用JSON配置文件需要额外的运行时依赖的jar包,详见runtime-dependencies

Properties配置

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

在版本2.6之前,属性配置要求您在带有这些名称的属性的逗号分隔列表中列出appender,filter和logger的标识符。然后,这些组件中的每一个都将被定义在以组件.<.identifier>.开头的属性集中。标识符不必与正在定义的组件的名称相匹配,但必须是属于该组件的所有属性和子组件的唯一标识。如果标识符列表不存在,标识符不能包含“.”。每个单独的组件必须有一个指定的“type”属性来标识组件的插件类型。

从版本2.6开始,这个标识符列表不再需要,因为名字是在第一次使用时推断的,但是如果你想使用更复杂的标识符,你仍然必须使用列表。如果列表存在,它将被使用。

与基本组件不同,创建子组件时,不能指定包含标识符列表的元素。相反,您必须按照下面代码中定义滚动文件appender的策略一样,定义所示的类型定义封装元素。然后定义封装元素下面的每个子组件,如同TimeBasedTriggeringPolicy和SizeBasedTriggeringPolicy在下面代码定义一样。

属性配置文件支持advertiser, monitorInterval, name, packages, shutdownHook, shutdownTimeout, status, verbose, 和 dest属性。有关这些属性的定义,请参阅配置语法

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
          

详细配置例子

下列例子均使用严格XML格式的方式配置Log4j,因其可读性和规范性均较高。不同的Appender决定日志输出的最终目的地。

ConsoleAppender(控制台)

正如人们所期望的那样,ConsoleAppender将其输出写入System.out或System.err,而默认目标是System.out。注意必须提供Layout来格式化LogEvent。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" strict="true" name="XMLConfigTest">
	<Appenders>
		<!-- 类型名为Console,名称为必须属性 -->
		<Appender type="Console" name="STDOUT">
			<!-- 布局为PatternLayout的方式,
			输出样式为[INFO] [2018-01-22 17:34:01][org.test.Console]I'm here -->
			<Layout type="PatternLayout" 
				pattern="[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c{10}]%m%n" />
		</Appender>
	</Appenders>

	<Loggers>
		<!-- 可加性为false -->
		<Logger name="test" level="debug" additivity="false">
			<AppenderRef ref="STDOUT" />
		</Logger>

		<!-- root loggerConfig设置 -->
		<Root level="trace">
			<AppenderRef ref="STDOUT" />
		</Root>
	</Loggers>

</Configuration>

FileAppender(文件)

FileAppender是一个OutputStreamAppender,它将输出写入fileName参数中指定的File。FileAppender使用FileManager(它扩展了OutputStreamManager)来实际执行文件I / O。虽然来自不同配置的FileAppender不能共享,但如果Manager可以访问,FileManagers可以共享。例如,一个servlet容器中的两个web应用程序可以拥有自己的配置,并且如果Log4j处于两个公共的ClassLoader中,则可以安全地将输出写入相同的文件。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" strict="true" name="XMLConfigTest">
	<Properties>
		<Property name="filename">target/test.log</Property>
	</Properties>
	<Filter type="ThresholdFilter" level="debug"/>

	<Appenders>
		<!-- 类型名为File,名称为必须属性,
		fileName为生成文件的名称(此处使用Properties中定义的变量) -->
		<Appender type="File" name="File" fileName="${filename}">
			<Layout type="PatternLayout" 
				pattern="[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c{10}]%m%n" />
		</Appender>
	</Appenders>

	<Loggers>
		<!-- root loggerConfig设置 -->
		<Root level="debug">
			<AppenderRef ref="File" />
		</Root>
	</Loggers>

</Configuration>

RollingFileAppender(滚动文件)

RollingFileAppender是一个OutputStreamAppender,它将输出写入fileName参数中指定的File,并根据TriggeringPolicy和RolloverPolicy将文件滚动。RollingFileAppender使用RollingFileManager(它扩展了OutputStreamManager)来实际执行文件I / O并执行翻转。虽然来自不同配置的RolloverFileAppender不能共享,但如果Manager可以访问,RollingFileManagers可以共享。例如,一个servlet容器中的两个web应用程序可以拥有自己的配置,并且如果Log4j处于两个公共的ClassLoader中,则可以安全地将输出写入相同的文件。

RollingFileAppender需要一个TriggeringPolicy和一个 RolloverStrategy。TriggeringPolicy决定是否应该执行翻转,而RolloverStrategy定义应该如何进行翻转。如果没有配置RolloverStrategy,RollingFileAppender将使用DefaultRolloverStrategy。log4j-2.5版本以后,可以在DefaultRolloverStrategy中配置自定义删除操作,以便在滚动时运行。2.8版本以后,如果没有配置文件名, 则将使用DirectWriteRolloverStrategy而不是DefaultRolloverStrategy。log4j-2.9版本以后,一个自定义的POSIX文件属性视图操可以在DefaultRolloverStrategy中配置为在滚动时运行,如果没有定义的话,将继承RollingFileAppender的POSIX文件属性视图。

注:RollingFileAppender不支持文件锁定。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" strict="true" name="XMLConfigTest"
	schema="Log4J-V2.10.xsd">
	<Properties>
		<Property name="filename">target/application.log</Property>
		<Property name="filePattern">target/%d{yyyy-MM-dd}/application-%i.log</Property>
	</Properties>
	<Filter type="ThresholdFilter" level="debug" />

	<Appenders>
		<!-- 类型名为RollingFile,名称为必须属性,
			fileName为生成文件的名称(此处使用Properties中定义的变量) -->
		<Appender type="RollingFile" name="RollingFile"
			fileName="${filename}" filePattern="${filePattern}">
			<Layout type="PatternLayout" 
				pattern="[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c{10}]%m%n" />
			<!-- 定义文件最大大小 -->
			<Policies>
				<OnStartupTriggeringPolicy />
				<TimeBasedTriggeringPolicy />
				<SizeBasedTriggeringPolicy size="10 KB" />
			</Policies>
		</Appender>
	</Appenders>

	<Loggers>
		<!-- root loggerConfig设置 -->
		<Root level="debug">
			<AppenderRef ref="RollingFile" />
		</Root>
	</Loggers>

</Configuration>

JDBCAppender(关系数据库)

JDBCAppender使用标准JDBC将日志事件写入关系数据库表。可以将其配置为使用JNDI 数据源或自定义工厂方法获取JDBC连接。**无论采取哪种方法,都必须以连接池为后盾。**否则,记录日志的性能将受到很大的影响。

在配置JDBCAppender时,您必须指定Appender从中获取JDBC连接的ConnectionSource实现。您必须使用<Da​​taSource><ConnectionFactory>嵌套元素中的一个。

若已通过如spring bean注入等方式创建了DataSource,可通过所绑定的JNDI名称来配置日志系统,例子如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
	<Appenders>
		<JDBC name="databaseAppender" tableName="dbo.application_log">
			<!-- 通过与DataSource绑定的JNDI名称配置JDBCAppender -->
			<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>
	<Loggers>
		<Root level="warn">
			<AppenderRef ref="databaseAppender" />
		</Root>
	</Loggers>
</Configuration>

亦可通过Java代码创建ConnectionFactory以配置JDBCAppender,例子如下:
(此处使用单例以确保ConnectionFactory在多线程下安全)

package org.test;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSourceFactory;

public class ConnectionFactory {
	private static interface Singleton {
		final ConnectionFactory INSTANCE = new ConnectionFactory();
	}

	private DataSource dataSource = null;

	private ConnectionFactory() {
		Properties properties = new Properties();
		//从配置文件读取properties,亦可直接赋值至Properties实例中
		//driverClassName,url,username,password为必须项
		try (InputStream is = ConnectionFactory.class.getResourceAsStream("/jdbc.properties")){
			properties.load(is);
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			this.dataSource = BasicDataSourceFactory.createDataSource(properties);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static Connection getDatabaseConnection() throws SQLException {
		return Singleton.INSTANCE.dataSource.getConnection();
	}
}

jdbc.properties配置:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true
username=root
password=root

XML配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
	<Appenders>
		<JDBC name="databaseAppender" tableName="log">
			<!-- 通过与自定义的ConnectionFactory配置JDBCAppender -->
			<ConnectionFactory class="org.test.ConnectionFactory"
				method="getDatabaseConnection" />
			<!-- 配置日志输出到数据库时与列相对应的值 -->
			<!-- literal为使用此属性在此列中插入文字值,可用于在ID列
				中插入唯一的ID,若有自增主键时,可不使用literal-->
			<Column name="EVENT_ID" literal="'new_log'" />
			<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>
	<Loggers>
		<Root level="debug">
			<AppenderRef ref="databaseAppender" />
		</Root>
	</Loggers>
</Configuration>

AsyncAppender(异步)

AsyncAppender接受对其他Appender的引用,并使用单独的线程将LogEvent记录在Appender中。请注意,将日志写入这些Appender时的异常将从应用程序中隐藏。AsyncAppender应该在它引用的appender配置完成后再进行配置,以确保它正常关闭。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" strict="true" name="XMLConfigTest">
	<Properties>
		<Property name="filename">target/test.log</Property>
	</Properties>
	<Filter type="ThresholdFilter" level="debug" />

	<Appenders>
		<!-- 类型名为File,名称为必须属性, 
			fileName为生成文件的名称(此处使用Properties中定义的变量) -->
		<Appender type="File" name="File" fileName="${filename}">
			<Layout type="PatternLayout" 
				pattern="[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c{10}]%m%n" />
		</Appender>
		<!-- 将FileAppe异步化 -->
		<Appender type="Async" name="Async">
			<AppenderRef ref="File" />
		</Appender>
	</Appenders>

	<Loggers>
		<!-- root loggerConfig设置 -->
		<Root level="debug">
			<AppenderRef ref="Async" />
		</Root>
	</Loggers>

</Configuration>

更多例子正在总结中…


详细配置例子项目:Github
原文链接:ConfigurationAppender
译文链接:http://blog.csdn.net/why_still_confused/article/details/79116565
版权声明:本文为博主原创翻译文章,若要转载请注明文章出处

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: log4j2.properties是log4j2日志框架的配置文件,用于配置日志输出的格式、级别、目的地等信息。以下是log4j2.properties配置文件的详解: 1. 配置日志输出的级别 log4j2.rootLogger.level=INFO 这行代码表示设置根日志记录器的级别为INFO,即只输出INFO级别及以上的日志信息。可以根据需要设置为DEBUG、WARN、ERROR等级别。 2. 配置日志输出的目的地 log4j2.appender.console.type=Console log4j2.appender.console.name=STDOUT log4j2.appender.console.layout.type=PatternLayout log4j2.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n 这几行代码表示将日志输出到控制台,输出格式为时间、线程、级别、类名、日志信息。可以根据需要将日志输出到文件、数据库等目的地。 3. 配置日志输出的格式 log4j2.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n 这行代码表示设置日志输出的格式为时间、线程、级别、类名、日志信息。可以根据需要自定义日志输出的格式。 4. 配置日志输出的文件名和路径 log4j2.appender.file.type=File log4j2.appender.file.name=FILE log4j2.appender.file.fileName=logs/app.log log4j2.appender.file.layout.type=PatternLayout log4j2.appender.file.layout.pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n 这几行代码表示将日志输出到文件logs/app.log中,输出格式为时间、线程、级别、类名、日志信息。可以根据需要自定义日志输出的文件名和路径。 5. 配置日志的滚动策略 log4j2.appender.file.type=RollingFile log4j2.appender.file.name=FILE log4j2.appender.file.fileName=logs/app.log log4j2.appender.file.filePattern=logs/app-%d{yyyy-MM-dd}.log log4j2.appender.file.layout.type=PatternLayout log4j2.appender.file.layout.pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n log4j2.appender.file.policies.type=Policies log4j2.appender.file.policies.time.type=TimeBasedTriggeringPolicy log4j2.appender.file.policies.time.interval=1 这几行代码表示配置日志的滚动策略为按时间滚动,每天生成一个新的日志文件。可以根据需要配置按文件大小滚动等策略。 以上是log4j2.properties配置文件的详解,可以根据需要自定义配置文件来满足日志输出的需求。 ### 回答2: log4j2是一个帮助开发者记录和排查问题的Java日志组件。它使用配置文件来记录不同级别日志,通过配置的不同级别可以把日志信息输出到不同的位置,方便对代码进行调试和日志分析。log4j2的配置文件是log4j2.properties,下面详细讲解该配置文件的各个属性。 1.日志级别: log4j2.properties配置文件中,我们可以通过设置不同级别(trace,debug,info,warn,error,fatal)来记录不同情况下产生的日志信息。默认情况下,log4j2只会记录warn以上级别的日志信息。 2.日志输出位置: 指定日志输出的位置,可以输出到控制台、文件、Redis等位置。输出到文件需要指定文件名称和路径,这样可以便于管理和分析,同时在日志数量较多时也可以有效减小文件尺寸。 3.日志信息格式: 日志信息格式主要包括时间、线程、日志级别、类名和日志信息等方面。在log4j2.properties配置文件中,我们可以通过指定输出格式化模板来实现自定义输出格式,同时还可以添加特定的信息,如调用者信息,来便于排查问题。 4.日志信息输出策略: 在配置文件中,我们也可以设置日志输出策略来控制日志信息的输出频率和大小,包括指定日志文件个数、日志文件大小、日志滚动周期、压缩文件等。 总之,在配置log4j2.properties配置文件时,需要根据具体情况设置不同的日志级别、输出位置、信息格式等内容,从而更好地记录和分析日志,有效地定位问题并优化代码性能。 ### 回答3: log4j2.properties是log4j2日志框架的配置文件,可以通过该配置文件设置日志的输出等级、输出目的地、格式等内容。下面对log4j2.properties的配置进行详解。 1. 配置日志级别 通过设置日志级别,可以控制哪些日志需要输出,哪些不需要输出。log4j2支持的日志级别有:trace、debug、info、warn、error、fatal。 log4j2.rootLogger.level=info 该配置表示设置根日志的日志级别为info。 log4j2.logger.com.example=debug 该配置表示设置com.example包下的所有日志级别为debug。 2. 配置输出目的地 日志的输出目的地可以是控制台、文件、数据库等。下面分别介绍几种输出目的地的配置方式。 2.1 输出到控制台: log4j2.appender.console.type=Console log4j2.appender.console.name=STDOUT 以上两行配置表示将日志输出到控制台,其中type=Console表示输出类型为控制台,name=STDOUT表示输出方式为标准输出。 2.2 输出到文件: log4j2.appender.file.type=File log4j2.appender.file.name=File log4j2.appender.file.fileName=/logs/app.log log4j2.appender.file.layout.type=PatternLayout log4j2.appender.file.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %p [%t] %c{6} - %m%n 以上配置表示将日志输出到logs文件夹下的app.log文件中,layout.pattern用来设置输出的日志格式。 2.3 输出到数据库: log4j2.appender.db.type=JDBC log4j2.appender.db.name=DB log4j2.appender.db.tableName=t_logs log4j2.appender.db.columnList=logger,message log4j2.appender.db.username=root log4j2.appender.db.password=root log4j2.appender.db.driverClassName=com.mysql.jdbc.Driver log4j2.appender.db.url=jdbc:mysql://localhost:3306/test 以上配置表示将日志输出到数据库中。其中tableName表示日志表名,columnList表示要插入的列名,username和password表示数据库的用户名和密码,driverClassName表示数据库驱动名,url表示数据库连接地址。 3. 配置输出格式 可以通过PatternLayout的pattern属性来配置日志的输出格式。常用的格式符有: %d 输出日志日期时间 %p 输出日志级别 %c 输出日志器名称 %m 输出日志信息 %n 输出平台独立的换行符 %r 输出自应用启动到输出该log信息耗费的毫秒数 %t 输出产生该日志事件的线程名称 %L 输出产生该日志事件的代码处所在文件的行号 例如: log4j2.appender.console.layout.type=PatternLayout log4j2.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c{1}:%L - %m%n 该配置表示输出日志的格式为:日期时间、日志级别、线程名、日志器名称、当前代码行号、日志信息。其中%-5p表示输出日志级别,占5个字符宽度,左对齐。%c{1}表示输出日志器名称,仅输出最后一个点后面的内容。%L表示输出当前代码所在行号。 以上就是log4j2.properties配置详解。通过灵活配置该文件,可以实现灵活管理和控制日志输出的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值