您的位置:首页 > 编程语言 > Java开发

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

2016-01-07 15:08 666 查看
这是一篇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的调用方法就可以维持不变了。

写这篇文章主要是因为网上这方面的资料不太多,特别是第三点,有的博客居然指出只能一一改代码。
汗,最后在官网上看到可以使用这个包。
这篇文章大概就写到这里了。如果文章里面有什么错漏,欢迎指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息