log4j动态文件名

Posted ferby

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j动态文件名相关的知识,希望对你有一定的参考价值。

在项目中,对log的输出有多种多样的要求,下面具体分析一下动态log文件名输出的。

 

一,按照用户ID来生成log,这种情况,可以根据每个用户ID来动态生成logger。


代码如下:

import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.RollingFileAppender;

public class LoggerUtil {

   
    public static Logger getLoggerByName(String name) {
        // 生成新的Logger
        // 如果已經有了一個Logger實例返回現有的
        Logger logger = Logger.getLogger(name);
        // 清空Appender。特別是不想使用現存實例時一定要初期化
        logger.removeAllAppenders();
        // 設定Logger級別。
        logger.setLevel(Level.DEBUG);
        // 設定是否繼承父Logger。
        // 默認為true。繼承root輸出。
        // 設定false後將不輸出root。
        logger.setAdditivity(true);
        // 生成新的Appender
        FileAppender appender = new RollingFileAppender();
        PatternLayout layout = new PatternLayout();
        // log的输出形式
        String conversionPattern = "[%d] %p %t %c - %m%n";
        layout.setConversionPattern(conversionPattern);
        appender.setLayout(layout);
        // log输出路径
        // 这里使用了环境变量[catalina.home],只有在tomcat环境下才可以取到
        String tomcatPath = java.lang.System.getProperty("catalina.home");
        appender.setFile(tomcatPath + "/logs/" + name + ".log");
        // log的文字码
        appender.setEncoding("UTF-8");
        // true:在已存在log文件后面追加 false:新log覆盖以前的log
        appender.setAppend(true);
        // 适用当前配置
        appender.activateOptions();
        // 将新的Appender加到Logger中
        logger.addAppender(appender);
        return logger;
    }
}

 

二,在batch程序中,通过一个设定来实现每个batch,文件名不同的设定。

 

log.xml定义

    <appender name="daily" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="/opt/tuhan.crm/batch/log/${tuhan.crm.log.name}.log" />
        <param name="threshold" value="debug"/>
        <param name="DatePattern" value="yyyyMMdd"/>
        <param name="append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{yyyy-MMM-dd HH:mm:ss,SSS} [%-5p] (%c:%L) %m%n"/>
        </layout>
    </appender>

 

log4j可以接受自定义环境变量,注意下面行【${tuhan.crm.log.name}】就是自定义环境变量

<param name="file" value="/opt/tuhan.crm/batch/log/${tuhan.crm.log.name}.log" />

 

那么环境变量如何设置呢,有2种方法

 

1.Java中设定(在使用配置文件之前, 要在程序中声明这些变量):

System.setProperty("tuhan.crm.log.name", "batch001");

 

2.在JVM设定

java -Xmx512M -Dtuhan.crm.log.name=batch001 com.stu.TestBatch001

 

三,在batch程序中,通过多个设定来实现每个batch,文件名不同的设定。

 

动态的配置文件路径: (log4j可以接受URL)

java.net.URL URL = consandpatt.class.getResource("/com/test/java/log/config/log4jConfig.properties");
PropertyConfigurator.configure(URL);

















































以上是关于log4j动态文件名的主要内容,如果未能解决你的问题,请参考以下文章

动态加载log4j.xml 文件

动态配置log4j2.xml日志输出文件的位置

log4j如何动态改变存放路径

log4j 动态调整日志级别

maven项目动态替换配置中的值

日志 动态代理