log4j2配置日志文件以时间方式显示

来源:互联网 发布:c语言 void main 编辑:程序博客网 时间:2024/06/06 13:14
===背景===
很多时候,程序的log日志需要有相应的时间,以便跟踪和维护。java程序,使用log4j创建有时间的log文档。(PS:源码来自小强,不过技能倒是get到了,非常的实用)
===jar包准备两种方法===
====普通工程直接下载拷贝实用jar包====
log4j-api-2.6.2, log4j-core-2.6.2,log4j-slf4j-impl-2.6.2,slf4j-api-1.7.21,dom4j-2.0.0-RC1(版本不同也可以)
我的百度云盘, [http://pan.baidu.com/s/1jHTWye6 点击进入下载jar包]


====Maven工程,添加maven依赖====
<source lang="xml">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test.log4j2</groupId>
  <artifactId>log4j2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
   <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.0.0-RC1</version>
</dependency>
  </dependencies>


</project>
</source>


===log4j2.xml文件准备===
#初级配置如下,将log4j2.xml文件放到src目录下
<source lang="xml">
<?xml version="1.0" encoding="UTF-8"?>    
<configuration status="error">    
  <appenders>    
    <Console name="Console" target="SYSTEM_OUT">    
      <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>    
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%c,%M:%L] %n%-level: %msg%n"/>    
    </Console>  
      
    <File name="Logfile" fileName="Logs/Log_time.txt" append="false">    
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%c,%M,%L]:      %msg%n"/>    
    </File>  
  </appenders>  
 
  <loggers>    
    <root level="info">    
      <appender-ref ref="Logfile"/>    
      <appender-ref ref="Console"/>    
    </root>    
  </loggers>    
</configuration> 
</source>
===Java修改xml节点fileName文件名===
<source lang="java" line>
package com.tool.util;


import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;


import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Configurator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


public class Log4j2Util {

public boolean InitLog4j2(String time){
boolean init=false;
InputStream inputStream = null;
try {
inputStream=changeXML(time);
if(inputStream!=null){
ConfigurationSource source = new ConfigurationSource(inputStream);
Configurator.initialize(null, source);
init=true;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return init;
}

private InputStream changeXML(String time){
SAXReader reader = new SAXReader();
InputStream inputStream = null;
try {
Document doc = reader.read(getClass().getResourceAsStream("/log4j2.xml"));
Element root=doc.getRootElement();
List<Element> childElements = root.elements();
 for (Element child : childElements) {
if( child.getName().equals("appenders")){
Element ele_File= child.element("File");
Attribute attr=ele_File.attribute("fileName");
attr.setValue("Logs/Log_"+time+".txt");
}
 }
inputStream= new ByteArrayInputStream(doc.asXML().getBytes("UTF-8"))  ;
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return inputStream;
}


}
</source>
===生成带有时间的log.txt文件Demon===
<source lang="java" line>
package com.tool.test;


import java.text.SimpleDateFormat;
import java.util.Date;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import com.tool.util.Log4j2Util;


public class TestLog4j2 {


public static void main(String[] args) {
String timekey=null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MMdd_HHmm_ss");
timekey=sdf.format(new Date());
Log4j2Util init = new Log4j2Util();
if (!init.InitLog4j2(timekey)) {
System.out.println("初始化loger失败");
return;
}
Logger logger = LoggerFactory.getLogger(TestLog4j2.class);
logger.info("hello world");
new T1().say();
new T2().Sing();
logger.info("Kobe");
}

}
</source>


===效果图===
[[文件:log4j2效果图.jpg]]