在项目中,对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}\t[%-5p]\t(%c:%L)\t%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动态文件名的更多相关文章

  1. Windows下通过FTP自动上传和下载动态文件名

    某个项目中每天会生成一个以文件名+日期.rar文件,如bcpdata2012-08-31.rar文件,动态的部分为日期部分,在windows环境变量中用 %date:~0,10% 表示,这个文件生成后 ...

  2. 基于log4net的支持动态文件名、按日期和大小自动分割文件的日志组件

    最近处理一个日志功能,用log4net的配置不能完全满足要求,所以在其基础上简单封装了一下,支持以下功能: 1 零配置 内置默认配置,引用dll后不需要添加或修改任何配置文件也可以使用 2 动态指定文 ...

  3. log4j日志文件名与行号显示乱码? 问号? 参数问号? 日志问号?【转】【补】

    log4j本来设置了要打印行号与文件名的,结果有的能打印出来,有的却是乱码,查了些文档之后才发现,原来打印问题是因为编绎时没有编绎进去调试信息,所以没办法打印,好像有的系统又会显示(Unknown S ...

  4. log4j动态监听配置修改

    一般情况下,log4j的配置文件是log4j.properties.但是每次我们修改了配置文件之后程序并不会自动去加载,而需要我们去重启程序.那么怎么样才能让程序不用重启就监听到变化呢.代码如下: p ...

  5. log4j动态配置参数

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  6. log4j 动态配置,重启项目配置失效问题

    公司项目升级之后,成功去掉了log4j.properties配置文件,实现页面动态配置日志级别. 很经典的两个配置,但是最终还是随着时代的进步而被优化,最终弄成了可配置项 但是随之问题就来了,当我启动 ...

  7. log4j动态日志级别调整

    1. 针对root logger的设置 log4j.rootLogger=INFO, CONSOLELogger.getRootLogger().setLevel(org.apache.log4j.L ...

  8. Spring学习8-SSH+Log4j黄金整合

    最下面有log4j的详解及配置步骤 步骤一.导入相应的jar包(具体参看下一篇博文) 步骤二.修改WEB.XML文件,内容如下: <?xml version="1.0" en ...

  9. 使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)

    说来惭愧,今天就写了个"hello world",了解了一下log4j的日志. 本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置 ...

随机推荐

  1. bzoj 2456: mode【瞎搞】

    这题加个#include都会MLE-- 神思路,每个数抵消宇哥和它不同的数,最后剩下的就是众数 #include<cstdio> int n,la,x,tot; int main() { ...

  2. Ocelot(八)- Ocelot不支持的几个方面

    不支持 Ocelot不支持的几个方面 Chunked Encoding - Ocelot将始终获取正文大小并返回Content-Length标头.很抱歉,如果这对您的用例不起作用! 转发主机标头 - ...

  3. ROS学习笔记五:创建和使用ROS msg和srv

    1 msg和srv简介 1.1 msg文件 msg文件就是一个简单的text文件,其中每行有一个类型和名称,可用的类型如下: int8, int16, int32, int64 (plus uint* ...

  4. [C++11新特性] 智能指针详解

    动态内存的使用很容易出问题,因为确保在正确的时间释放内存是极为困难的.有时我们会忘记释放内存产生内存泄漏,有时提前释放了内存,再使用指针去引用内存就会报错. 为了更容易(同时也更安全)地使用动态内存, ...

  5. _bzoj1070 [SCOI2007]修车【最小费用最大流】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1070 以后做网络流题目就是不能省内存... #include <cstdio> ...

  6. Android偏好设置(4)设置默认值

    Setting Default Values The preferences you create probably define some important behaviors for your ...

  7. 446 Arithmetic Slices II - Subsequence 算数切片之二 - 子序列

    详见:https://leetcode.com/problems/arithmetic-slices-ii-subsequence/description/ C++: class Solution { ...

  8. 179 Largest Number 把数组排成最大的数

    给定一个非负整数的列表,重新排列它们的顺序把他们组成一个最大的整数.例如,给定 [3, 30, 34, 5, 9],最大的组成数是 9534330.注意: 结果可能非常大,所以您需要返回一个字符串而不 ...

  9. ZOJ 3605Find the Marble(dp)

    ZOJ 3605 大体意思就是 找出随机选了K个交换后 石子在第i个罐子里的概率最大 也就是可能的总数最大 这样就可以写出递推方程 dp[i][j][k] += dp[i-1][e][k]; (0&l ...

  10. LN : leetcode 712 Minimum ASCII Delete Sum for Two Strings

    lc 712 Minimum ASCII Delete Sum for Two Strings 712 Minimum ASCII Delete Sum for Two Strings Given t ...