Log4j 2.0在开发中的高级使用详解—读取配置文件(六)

log4j中配置日志文件存放的位置不一定在src下面,即根目录下。这个时候我们需要解决如何加载配置文件的问题。在log4j1.x中解决的方法就比较多了。如:PropertyConfigurator.configure();和DOMConfigurator.configure ();这两种方法读取。而在log4j2.x当中,这两个类都已经不存在了。这个时候我们该如何去加载配置文件呢?

答案也很简单,就是log4j2.x的版本给我提供了ConfigurationSource和Configurator这两个类。我们可以使用它们进行手动的加载任意位置的配置文件信息。

我就主要介绍三种方法:log4j 2读取配置文件的三种方法。

log4j 2读取的配置文件可以分为三类:src下的配置文件、绝对路径的配置文件、相对路径的配置文件。我们一一给例子。直接看代码:

package com.herman.test;

import java.io.File;
import java.io.FileInputStream;
import java.net.URL;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Configurator;

public class ConfigTest {

	private static Logger logger = LogManager.getLogger(ConfigTest.class);
	/**
	 * log4j 2读取配置文件
	 * log4j 2读取的配置文件可以分为三类:src下的配置文件、绝对路径的配置文件、相对路径的配置文件
	 */

	//第一类  加载src下的配置文件
	public static void test0(){
		//src下的配置文件会默认的被log4j的框架加载,我们就不显示的加载了
		//直接测试
		logger.info("我打印了.......");
		//输出内容
		//2014-09-01 15:49:30,229 INFO  [main] test.ConfigTest (ConfigTest.java:18) - 我打印了.......
	}

	//第二类  绝对路径的配置文件
	public static void test1(){
		//我们将log4j2.xml放在D盘下
		//这是需要手动的加载
		//绝对路径配置文件
		ConfigurationSource source;
		try {
			//方法1  使用  public ConfigurationSource(InputStream stream) throws IOException 构造函数
			source = new ConfigurationSource(new FileInputStream("D:\\log4j2.xml"));

			//方法2 使用 public ConfigurationSource(InputStream stream, File file)构造函数
			File config=new File("D:\\log4j2.xml");
			source = new ConfigurationSource(new FileInputStream(config),config);

			//方法3 使用 public ConfigurationSource(InputStream stream, URL url) 构造函数
			String path="D:\\log4j2.xml";
			source = new ConfigurationSource(new FileInputStream(path),new File(path).toURL());

			//source.setFile(new File("D:\log4j2.xml"));
			//source.setInputStream(new FileInputStream("D:\log4j2.xml"));
			Configurator.initialize(null, source);
			Logger logger = LogManager.getLogger(ConfigTest.class.getName());
			logger.trace("trace...");
			logger.debug("debug...");
			logger.info("info...");
			logger.warn("warn...");
			logger.error("error...");
			logger.fatal("fatal...");
			//一下是运行效果
			/*2014-09-01 16:03:07,331 DEBUG [main] test.ConfigTest (ConfigTest.java:42) - debug...
			2014-09-01 16:03:07,331 INFO  [main] test.ConfigTest (ConfigTest.java:43) - info...
			2014-09-01 16:03:07,331 WARN  [main] test.ConfigTest (ConfigTest.java:44) - warn...
			2014-09-01 16:03:07,331 ERROR [main] test.ConfigTest (ConfigTest.java:45) - error...
			2014-09-01 16:03:07,331 FATAL [main] test.ConfigTest (ConfigTest.java:46) - fatal...*/
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	//第三类  相对路径的配置文件加载
	public static void test2(){
		//这里需要注意路径中不要出现中文和空格,如果存在中文,请使用url转码
		ConfigurationSource source;
		try {
			//方法1  使用getResource()
			String path="/com/herman/config/log4j2.xml";
			URL url=ConfigTest.class.getResource(path);
			source = new ConfigurationSource(new FileInputStream(new File(url.getPath())),url);
			Configurator.initialize(null, source);	

			//方法2 使用System.getProperty
			String config=System.getProperty("user.dir");
			source = new ConfigurationSource(new FileInputStream(config+"\\src\\com\\herman\\config\\log4j2.xml"));
			Configurator.initialize(null, source);

			//输出内容
			/*2014-09-01 16:32:19,746 DEBUG [main] test.ConfigTest (ConfigTest.java:53) - debug...
			2014-09-01 16:32:19,746 INFO  [main] test.ConfigTest (ConfigTest.java:54) - info...
			2014-09-01 16:32:19,746 WARN  [main] test.ConfigTest (ConfigTest.java:55) - warn...
			2014-09-01 16:32:19,746 ERROR [main] test.ConfigTest (ConfigTest.java:56) - error...
			2014-09-01 16:32:19,746 FATAL [main] test.ConfigTest (ConfigTest.java:57) - fatal...*/
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		//test0();
		//test1();
		test2();
	}
}

很简单吧!欢迎大家关注我的个人博客!!!!

如有不懂,疑问或者欠妥的地方,请加QQ群:135430763   进行反馈,共同学习!

时间: 2024-11-12 04:24:58

Log4j 2.0在开发中的高级使用详解—读取配置文件(六)的相关文章

Log4j 2.0在开发中的高级使用详解—配置简单的控制台输出(三)

Log4j 2.0在最近迎来了重大的版本升级.解决了1.x中死锁bug之外,性能也有10倍的提升. 同样的在最新版本中的新特性中.配置文件也不仅仅局限于xml和java特性文件properties.更是支持json和yaml的配置文件. 日志的使用在我们日常开发中经常用到.也有很多的高手遇到过日志死锁问题.在2.0中引入了异步日志处理.死锁问题得以解决. 好吧,介绍了这么多,进入它的helloworld吧. 今天看看它的简单配置.配置输出到console的日志记录器,并且为info级别的输出.

Log4j 2.0在开发中的高级使用详解—默认级别(二)

Log4j 经过几年的发展之后,终于迎来了它的姊妹版本--Log4j 2.0 .在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j.重大的升级必须带来重大的特性.对于2.0的颠覆性特性,我们将在之后一一讲解.今天我们就来看它的特性之一,默认级别. 在使用log4j 1.x当中,我们都需要自己提供它的配置文件.如果不提供就会报错,在2.0的版本当中,配置文件已经不是必须的了.至于我们没有提供它的配置文件,它会默认的打

Log4j 2.0在开发中的高级使用详解(一)

Log4j终于迎来了首个apache版本.Log4j 2 是 Log4j 的升级版本,该版本比起其前任来说有着显著的改进,包含很多在 Logback 中的改进以及Logback 架构中存在的问题. 这是 Log4j 2 的首次发行的版本,值得关注的改进包括: API 分离 – Log4j 的 API 和其实现进行分类(注:我讨厌这样,本来一个jar包搞定的,要变成好几个,跟 slf4j 似的的) 为日志审计而设计,与 Log4j 1.x 和 Logback 不同的是 Log4j 2 将不会在重新

Log4j 2.0在开发中的高级使用详解—配置简单的文件输出(四)

在log4j 1.x的版本中,我们想将日志输出的文件中,需要很复杂的配置.这点已经在2.0的版本中得到了大大的改善. 简单的配置,以及灵活的应用,已经成为了一种趋势.不管我们以追加的形式写日志文件,还是覆盖的形式,配置他们都是小菜. 还有比如日志文件大小自动分割,自动备份,无死锁,高性能等等.更令人欣喜的是,它支持json格式的配置,加载快,轻巧,异步读写. 好吧,来看它的使用吧. 看配置文件log4j2.xml代码: <?xml version="1.0" encoding=&

Log4j 2.0在开发中的高级使用详解—SocketAppender的远程输出(五)

Log4j2的Appenders充分考虑了日志事件的输出.包装以及过滤转发的可能,包括最基本的输出到本地文件.输出到远程主机, 对文件进行封装.注入,并且还能按照日志文件的时间点.文件大小等条件进行自动封存. 例如,想要将几个不同源的日志汇集到一起,可以用FlumeAppender:想要在LogEvent中注入信息, 可以用RewriteAppender:想要让系统按照设定的时间间隔自动封存日志信息,可以用RollingFileAppender (每隔一定时间自动保存一份新增的日志文件,并按照时

Log4j 2.0在开发中的高级使用具体解释—介绍篇(一)

Log4j最终迎来了首个apache版本号.Log4j 2 是 Log4j 的升级版本号,该版本号比起其前任来说有着显著的改进,包括非常多在 Logback 中的改进以及Logback 架构中存在的问题. 这是 Log4j 2 的首次发行的版本号,值得关注的改进包含: API 分离 – Log4j 的 API 和事实上现进行分类(注:我讨厌这样,本来一个jar包搞定的,要变成好几个,跟 slf4j 似的的) 为日志审计而设计,与 Log4j 1.x 和 Logback 不同的是 Log4j 2

Python中的高级数据结构详解

这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考下 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供选择

iOS开发中UIPopoverController的使用详解

这篇文章主要介绍了iOS开发中UIPopoverController的使用,代码基于传统的Objective-C,需要的朋友可以参考下 一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面 2.使用步骤 要想显示一个UIPopoverController,需要经过下列步骤

Mysql中关于 group_concat函数详解

group_concat()主要功能:能将相同的行组合起来 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 基本查询 Sql代码   select * from aa; +------+------+| id| name |+------+------+|1 | 10||1 | 20||1 | 20||2 | 20||3 | 200 ||3 | 500 |+------+---