log4j如何根据变量动态生成文件名

目录
  • 根据变量动态生成文件名
    • 简单的log4j设置
  • log4j动态文件名
    • 一、按照用户ID来生成log
    • 二、在batch程序中,通过一个设定来实现每个batch
    • 三、在batch程序中,通过多个设定来实现每个batch

根据变量动态生成文件名

简单的log4j设置

一般情况下,log4j配置文件简单的设置为:

log4j.rootLogger=debug,stdout,R
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=test.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.DatePattern = '.'yyyy-MM-dd
log4j.appender.R.layout=ex.log4j.ExPatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c %5p  - %m%n
log4j.appender.R.MaxBackupIndex=1

简单实例。

java代码如下:

public class LogTest {
static Logger log = Logger.getLogger(LogTest.class);
public static void main(String[] args) throws IOException {
PropertyConfigurator.configure("log4j.properties");
log.debug("helo");
}
}

一般如上设置即可满足简单的log4j需求。

如果需要根据程序中的变量,将日志打到不同的文件中时,(如:根据某个ID,这样对于大量日志时更加容易查找到想要的日志)

只需在java代码中过去到所配置的FileAppender,然后serFile来修改文件名。

java代码如下:

FileAppender appender = (FileAppender) log.getRootLogger().getAppender("R");
appender.setFile(filePath/fileName);
appender.activateOptions();

日志打印前,设置以上代码,即可。

注意:加上 appender.activateOptions(); 可以使得后面打印的日志不会将之前的日志覆盖。

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}\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);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • log4j控制日志输出文件名称的两种方式小结

    目录 log4j控制日志输出文件名称 1. 第一种方式 2. 第二种方式(这种方式亲测正确) 如何随心所欲地自定义log4j输出格式 log4j控制日志输出文件名称 1. 第一种方式 在类对象中用如下方式定义logger变量 private static Logger logger = Logger.getLogger("lemmaXml"); 这样通过名称的方式获取logger,需要在log4j.properties文件中定义一个名称为lemmaXml的appender,配置如下:

  • java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)

    log4j输出多个自定义日志文件 如果在实际应用中需要输出独立的日志文件,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢? 先看一个常见的log4j.properties文件,它是在控制台和test.log文件中记录日志: 复制代码 代码如下: log4j.rootLogger=DEBUG, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layo

  • 自定义log4j日志文件命名规则说明

    目录 自定义log4j日志文件命名规则 根据log4j的API定义自己的FileAppender 对应的log4j.properties的配置文件如下 输出的日志文件命名如下 log4j自定义生成文件的名称 log4j.properties MyRollingFileAppender.java 自定义log4j日志文件命名规则 项目中的日志需要采用一致的命名规范和文件规范,命名规则为:项目模块标识_index_日期时间_日志级别.log,且每个级别日志文件放在单独的文件夹,且每个文件夹下日志的数

  • 使用log4j输出一个类的所有参数的值

    目录 log4j输出一个类的所有参数的值 log4j各参数打印输出内容 log4j输出一个类的所有参数的值 项目用到的是日志框架是slf4j+log4j,在使用的过程中,如果要输出一个元素的值,一般都是这样写 logger.info("当前登录人的姓名是:{}", userinfo.getName()); 这样就会输出:当前登录人的姓名是:张三 但是如果我想要输出一个类userinfo中所有的参数信息,比如说,姓名,年龄,电话等信息,如果这样就会出问题 logger.info(&quo

  • log4j如何根据变量动态生成文件名

    目录 根据变量动态生成文件名 简单的log4j设置 log4j动态文件名 一.按照用户ID来生成log 二.在batch程序中,通过一个设定来实现每个batch 三.在batch程序中,通过多个设定来实现每个batch 根据变量动态生成文件名 简单的log4j设置 一般情况下,log4j配置文件简单的设置为: log4j.rootLogger=debug,stdout,R log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log

  • 配置Grunt的Task时通配符支持和动态生成文件名问题

    copy: { // 这是Task里的其中一个Target dests: { expand: true, cwd: '<%=config.app%>/newFolder', src: ['**/{a*,b*}.html'], dest: '<%=config.dist%>/newFolder', ext: ".shtml", extDot: "first", flatten:true, //去掉中间上当,下面的rename可以再找回来 ren

  • python 动态生成变量名以及动态获取变量的变量名方法

    前言 需求: 必须现在需要动态创建16个list,每个list的名字不一样,但是是有规律可循,比如第一个list的名字叫: arriage_list_0=[],第二个叫arriage_list_1=[]--..依次类推,但是我又不想手动的去写16个这样的名字,太累了,而且增加了代码的冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有的!而与之对应,既然要对上面的列表动态操作,肯定是少不了动态去解析list名称.所以下面开始介绍方法. python 动态生成变量名 lo

  • jQuery为动态生成的select元素添加事件的方法

    项目中需要在点击按钮时动态生成select元素,为防止每次点击按钮时从服务器端获取数据(因为数据都是相同的),可以这样写代码 1.首先定义全局js变量 var strVoucherGroupSelect =""; 2.在js中写好获取服务端数据的代码 function genVoucherGroupSelect(rowID){ return $(strVoucherGroupSelect).attr("id", "sl_" + rowID).pa

  • AngularJS 获取ng-repeat动态生成的ng-model值实例详解

    AngularJS 获取ng-repeat动态生成的ng-model值               最近做项目遇到了ng-model是ng-repeat动态生成的,ng-model="变量",什么变量,是未知的,所以你无法在$scope."变量"取到值,就算取到值也是其中一个值,这样的问题,经过百度一番查找找到解决方案,这里记录下,也行可以帮助到大家. 代码 html <div> <div class="modal-header"

  • 利用ASP.NET技术动态生成HTML页面

    思路 1. 利用如Dw-Mx这样的工具生成html格式的模板,在需要添加格式的地方加入特殊标记(如$htmlformat$),动态生成文件时利用代码读取此模板,然后获得前台输入的内容,添加到此模板的标记位置中,生成新文件名后写入磁盘,写入后再向数据库中写入相关数据. 2. 使用后台代码硬编码Html文件,可以使用HtmlTextWriter类来写html文件. 优点 1. 可以建立非常复杂的页面,利用包含js文件的方法,在js文件内加入document.write()方法可以在所有页面内加入如页

  • Asp.net动态生成html页面的方法分享

    此功能适用于后台数据库功能不强的web站点,即大部分文本不是存放在数据库的记录中,而是放在html文件或者xml文件中,仅仅把索引放到数据库中,如文章标题.类别.查询关键字等.这样适合于后台没有诸如MS Sql Server这样的数据库支持的Web站点.  适用于新闻发布系统,比如sina.163等都是采用动态生成html页面的.     适用于需动态定制页面的程序.比如论坛.聊天室等.可以加载定制好的html页面,来加强美观.     思路     1. 利用如Dw-Mx这样的工具生成html

  • PHP在网页中动态生成PDF文件详细教程

    本文详细介绍使用 PHP 动态构建 PDF 文件的整个过程.使用免费 PDF 库 (FPDF) 或 PDFLib-Lite 等开源工具进行实验,并使用 PHP 代码控制 PDF 内容格式. 有时您需要准确控制要打印的页面的呈现方式.在这种情况下,HTML 就不再是最佳选择了.PDF 文件使您能够完全控制页面的呈现方式,以及文本.图形和图像在页面上的呈现方式.遗憾的是,用来构建 PDF 文件的 API 不属于 PHP 工具包的标准部件.现在您需要提供一点帮助. 当您在网络上搜索,寻找对 PHP 的

  • PHP动态生成javascript文件的2个例子

    一.PHP动态生成 第一步:在PHP文件中直接写入JS代码,并在头部声明这是一个JavaScript文件 复制代码 代码如下: <?php header('Content-Type: application/x-javascript; charset=UTF-8');?> 第二步:用PHP输出转义JavaScript代码 复制代码 代码如下: function jsformat($str){    $str = trim($str);    $str = str_replace('\\s\\s

  • JavaScript 动态生成方法的例子

    复制代码 代码如下: function User(properties){ for(var i in properties){ //遍历该对象的所有属性,并保证其作用于正确 (function(which){ var p=i; which["get"+p]=function(){ //动态生成的方法 return properties[p]; //返回对象的属性值 }; which["set"+p]=function(val){ //动态生成的方法 properti

随机推荐