log4j2的进阶文档。主要写其中网上没什么资料,比较实用的几个地方。

这是一篇log4j2的进阶文档。在这里面我就不再说基础的使用配置了,如果还没对log4j2有了解,请自行学习后再查看我这篇文档。

我只列出我在使用之中摸索到的然而网上没什么资料的一些地方。

一、生成的日志文件如何指定在项目目录?

之前使用过logback框架的时候我是通过 “System.setProperty("logdir", realPath);”,然后在配置文档中通过${logdir}的方式引用的。
但是在log4j2中稍微改变了一下,设置方式是一样的:System.setProperty("logdir", realPath);,但是引用方式却改成:${sys:logdir}了。

二、如何手动载入配置文件

对log4j2有了解的人都应该清楚,log4j2的配置文件log4j2.xml、log4j.json等等(还有几种命名方式)存放在classpath目录都会自动载入。
这里介绍一种代码手动载入的方法:
        File file = new File(realPath+"static//data//log4j2.xml");  
		 try {
		     LoggerContext context =(LoggerContext)LogManager.getContext(false);
		     context.setConfigLocation(file.toURI());
		     //重新初始化Log4j2的配置上下文
		     context.reconfigure();
		   }catch(Exception e){
			   System.out.println("[SYSTEM]==> Log4j2 初始化失败,读取[log4j2]文件失败!");
		   }
	}
建议在web.xml配置一个listener:
<listener>
		<listener-class>com.toby.servlet.ServletInitListener</listener-class>
	</listener> 

然后在这个listener里面加载,记得第一点的System.setProperty("logdir", realPath);要在第二点之前设置。

当使用第一点设置目录的方法的话,我建议配置文件手动加载比较好。因为我试过配置文件放在默认位置的时候,可能是默认顺序的问题,有时会出现${sys:logdir}未设置到。

贴上我的ServletInitListener的代码吧。
public class ServletInitListener implements ServletContextListener{
	
	public void contextDestroyed(ServletContextEvent event) {
		System.getProperties().remove("logdir");
	}

	public void contextInitialized(ServletContextEvent event) {
		System.setProperty("logdir", event.getServletContext().getRealPath("/"));
		initLog4j(event.getServletContext().getRealPath("/"));
	}

	private void initLog4j(String realPath) {
		File file = new File(realPath+"static//data//log4j2.xml");
		 try {
		     LoggerContext context =(LoggerContext)LogManager.getContext(false);
		     context.setConfigLocation(file.toURI());
		     //重新初始化Log4j2的配置上下文
		     context.reconfigure();
		   }catch(Exception e){
			   System.out.println("[SYSTEM]==> Log4j2 初始化失败,读取[log4j2]文件失败!");
		   }
	}

}

三、我以前使用log4j1,如何迁移至log4j2

如果我们以前使用log4j1的时候,并没有使用slf4j或者用了但是没有通过slf4j的api调用日志。
我们获得日志的方法是: private static Logger log = Logger.getLogger(TestController.class);
但是log4j2获得日志的方法是:private static Logger log = LogManager.getLogger(TestController.class);
然而我们又没有去封装使用,难道就要每一个地方去修改了吗?这显然是不可能的,封装的太多类里面用了日志了。
其实很简单,我们只需要引入一个jar包,因为我用的是maven,所以我直接提供他的依赖,没用的朋友可以自行去下载jar包。
	<!-- 我用的是2.5版本的 -->
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-1.2-api</artifactId>
		<version>2.5</version>
	</dependency>
只要加了这个包,之前log4j1的调用方法就可以维持不变了。

写这篇文章主要是因为网上这方面的资料不太多,特别是第三点,有的博客居然指出只能一一改代码。
汗,最后在官网上看到可以使用这个包。
这篇文章大概就写到这里了。如果文章里面有什么错漏,欢迎指出。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值