《Log4j2官方文档》自动加载配置

Log4j可以在初始化的时候执行自动配置。当Log4j启动的时候,会首先定位所有的ConfigurationFactory的配置然后会根据权重进行从高到低的排序。目前的版本,Log4j包含了四种类型的ConfigurationFactory的实现,JSONYAMLpropertiesXML

1:Log4j将会检查 log4j.configurationFile的系统属性,如果已经设置了对应的属性,将会使用ConfigurationFactory对应的属性去加载配置。
2:如果没有设置对应的系统属性,将会在classpath中寻找log4j2-test.properties文件。
3:如果没有找到,则会在classpath中继续寻找log4j2-test.yaml或者log4j2-test.yml文件。
4:如果还是没有找到,则会在classpath中继续寻找log4j2.json或者log4j2-test.jsn文件。
5:如果还是没有找到,则会在classpath中继续寻找log4j2.xml文件。
6:如果test文件不能classpath中被定为,那么就会寻找log4j2.properties文件。
7:如果properties文件不能被定位,就会在classpath中寻找YAML的配置文件,log4j2.yaml或者log4j2.yml文件。
8:如果YAML文件不能被定位,就会在classpath中寻找JSON格式的配置文件,log4j2.json或者log4j2.jsn文件。
9:如果JSON文件不能被定位,就会在classpath中寻找XML格式的配置文件,log4j2.xml
10:如果依然没有配置文件被定位,那么将会使用缺省的配置DefaultConfiguration。日志将会被直接输出到控制台。

译者附:设置log4j2的配置必然生效是哪个?就是他log4j2-test.properties

例子应用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的关联类,然后定义了一个静态的变量logger,指定了logger的名称是MyApp.class

MyApp使用的Bar类,定义在com.foo包的下面。

 

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无法定位配置文件,那么就会使用缺省的配置。DafaultConfiguration类定义了基本的配置,配置的内容:

  • ConsoleAppender设置成root
  • PatternLayout的格式”%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} – %msg%n”

注意:缺省的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.xml放到classpath中,就会得到和上面一模一样的输出(因为这个和默认配置是一样的)。
改变Root 的level为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.

请注意,当使用默认配置的时候,其他状态的日志都被禁用了.

转载自 并发编程网 - ifeve.com

时间: 2024-09-20 00:07:01

《Log4j2官方文档》自动加载配置的相关文章

《LOG4J2官方文档》Chainsaw 可以自动处理你的日志文件(通知appender的配置)

对于所有的基于文件的appender和基于socket的appender,log4j提供通知appender 配置的详细信息的功能.例如,基于文件的appender,文件地址和格式化输出日志信息都包含在了log4j的通知里面.Chainsaw和其他外部系统能发现这些通知并聪明地利用这些通知去处理日志文件. 这种通知暴露的机制和通知格式是特定于每个通知者实现的,一个与特定通知者实现协作的外部系统必须明白,如何定位通知的配置和通知的格式.例如,一个数据库通知者可能在数据库表中存储了配置的详细信息,一

《Log4j2官方文档》Appenders配置

appender可以配置为具体的appender插件,或者是一个其type属性为appender插件名称的appender元素.此外,每个appender必须有一个name属性,其值在appenders集合内是唯一的.name属性的值将用在上一节loggers里指定的appender中. 大多数appender也支持自定义配置layout(可以配置为具体的layout插件,或者是一个其type属性为layout插件名称的layout元素).各个appender也会包含它们正常工作所需的其他属性或

《Log4j2官方文档》从Log4j 1.x迁移

从Log4j 1.x迁移 使用Log4j 1.x桥接 转换到Log4j 2的最简单方法,也许就是把log4j 1.x的jar文件替换为Log4j 2的log4j-1.2-api.jar.然而,要让这个方式可以使用,应用必须满足以下要求: 不能访问Log4j 1.x的内部实现的方法和类,例如Appenders, LoggerRepository或者Category的callAppenders方法. 不能以编程方式配置Log4j. 不能通过调用类DOMConfigurator或PropertyCon

《Log4j 2 官方文档》多余性(Additivity)

如果我们希望输出com.foo.Bar的TRACE等级的日志,而不像影响其他日志的输出.简单的改变日志等级是不能达到我们想要的目的:但是修改也很简单,只要我们添加一个新的Logger定义就可以达到目标. <Logger name="com.foo.Bar" level="TRACE"/> <Root level="ERROR"> <AppenderRef ref="STDOUT"> <

解决:eth0网卡无法自动加载,网卡配置信息不在network-scripts中

 问题场景:eth0网卡无法自动加载,网卡配置信息不在network-scripts中 解决: 1>vi /etc/rc.d/rc.loacl  最后加入  ifup eth0 2>reboot 3>测试 换个ip,   service network restart   是否有效 或者桌面环境观察网卡状态是否在连接 4>ifconfig -a  查看 eth0信息是否改变 如果改变了,说明起效 此解决方案已通过本机测试通过,在你centos6.2以上的版本默认存在当物理ip改变之

CodeIgniter配置之autoload.php自动加载用法分析_php实例

本文实例分析了CodeIgniter配置之autoload.php自动加载用法.分享给大家供大家参考,具体如下: CodeIgniter带了自动加载的功能,可以全局加载类库.模型.配置.语言包等,对于需要全局使用的功能相当方便. 例如:有个全局函数写在app_helper.php中,需要全局加载这个函数,只需设置autoload.php: 复制代码 代码如下: $autoload['helper'] = array('app'); 接下来,所有的地方都可以使用了,配置.模型等配置相似.但方便的同

《Spark 官方文档》Spark配置(一)

Spark配置 Spark有以下三种方式修改配置: Spark properties (Spark属性)可以控制绝大多数应用程序参数,而且既可以通过 SparkConf 对象来设置,也可以通过Java系统属性来设置. Environment variables (环境变量)可以指定一些各个机器相关的设置,如IP地址,其设置方法是写在每台机器上的conf/spark-env.sh中. Logging (日志)可以通过log4j.properties配置日志. Spark属性 Spark属性可以控制

把 treeview 保存到 txt文本文档之中 之后下次运行程序 会自动加载txt文本中的节点!!!!求各位大神帮忙 周三就要交了!!!

问题描述 把treeview保存到txt文本文档之中之后下次运行程序会自动加载txt文本中的节点!!!!求各位大神帮忙周三就要交了!!!还有就是用c#实现前进和后退功能谢谢大家了!!! 解决方案 解决方案二:你没说节点是如何保存在txt中的.怎么保存的就怎么读取啊.解决方案三:用xml保存,treeview的节点展开与xml子节点添加同步就行.解决方案四:你为什么不用XML保存呢?解决方案五://我例举一个文本框值保存到记事本中然后下次运行程序自动加载进来值if(File.Exists("../

《Apache Velocity用户指南》官方文档

Quick Start 本项目是 Apache Velocity官方文档的中文翻译版,Velocity类似与JSP,是一种基于Java的模板引擎.它可以在web页面中引用Java代码中定义的数据和对象,而Velocity的作用就是把Web视图和java代码进行组装在一起.本次翻译主要针对对Velocity感兴趣和工作中使用到Velocity的开发人员提供有价值的中文资料,希望能够对大家的工作和学习有所帮助. 由于我也是第一次接触Velocity,还不是很深入,翻译的时候也查看了一些博客以及其他网