log4j 是否可以通过条件判断 在程序运行中动态选择日志存储目录

问题描述

比如我有两个用户A和B,我需要记录这两个用户的操作信息:add和del。我希望把A的日志存放到logs/A/**目录下,比如logs/A/add/add.loglogs/A/add/del.log我希望把B的日志存放到logs/B/**目录下,比如logs/B/add/add.loglogs/B/add/del.log当程序在记录日志时,知道用户是谁。如何在记录日志时,让程序根据用户来选择日志存放目录?log4j支持这样的功能吗,能否给出简明的log4j配置。在此谢谢各位~

解决方案

可以的:package com.ljn.others;import java.io.IOException;import java.util.HashMap;import java.util.Map;import org.apache.commons.lang.StringUtils;import org.apache.log4j.Level;import org.apache.log4j.Logger;import org.apache.log4j.PatternLayout;import org.apache.log4j.RollingFileAppender;import org.apache.log4j.varia.LevelRangeFilter;/** * @author lijinnan * @date:2014-5-7 */public class LoggerFactory { private static final String SEPARATOR = "/"; private static final Map<String, Logger> logMap = new HashMap<String, Logger>(); public static Logger getLogger(String baseDir, String userName, String fileName) { if (StringUtils.isEmpty(baseDir) || StringUtils.isEmpty(userName) || StringUtils.isEmpty(fileName)) { throw new IllegalArgumentException("cannot be empty"); } String key = findKey(userName, fileName); Logger logger = logMap.get(key); if (logger == null) try { String logFilePath = baseDir + SEPARATOR + key; logger = Logger.getLogger(key); PatternLayout playout = new PatternLayout(); playout.setConversionPattern("%d{[yyyy-MM-dd HH:mm:ss.SSS]}:[%p] %m%n"); RollingFileAppender fAppender = new RollingFileAppender(playout, logFilePath); fAppender.setMaxFileSize("500MB"); fAppender.setMaxBackupIndex(3); fAppender.setAppend(true); fAppender.setThreshold(Level.INFO); fAppender.setLayout(playout); LevelRangeFilter filterInfo = new LevelRangeFilter(); filterInfo.setLevelMin(Level.INFO); filterInfo.setLevelMax(Level.ERROR); fAppender.addFilter(filterInfo); logger.addAppender(fAppender); logMap.put(key, logger); } catch (IOException e) { logger.error(Thread.currentThread().getName(), e); } return logger; } private static String findKey(String userName, String fileName) { return userName + SEPARATOR + fileName; }}package com.ljn.others;import java.util.Random;import org.apache.log4j.Logger;/** * @author lijinnan */public class UserService { private static final String BASE_DIR = "d:/odd/log"; public static void main(String[] args) { while(true) { add(); del(); System.out.println("ok"); } } public static void add() { String user = getCurrentUser(); Logger logger = LoggerFactory.getLogger(BASE_DIR, user, "add.log"); logger.info(user + " add"); } public static void del() { String user = getCurrentUser(); Logger logger = LoggerFactory.getLogger(BASE_DIR, user, "del.log"); logger.info(user + " del"); } private static String getCurrentUser() { Random random = new Random(); int i = random.nextInt(10); if (i % 2 == 0) { return "A" ; } return "B"; }}

时间: 2024-08-03 07:26:24

log4j 是否可以通过条件判断 在程序运行中动态选择日志存储目录的相关文章

【求助】如何修改程序运行中的数据并保存

问题描述 [求助]如何修改程序运行中的数据并保存 使用C/C++实现程序在执行时可以变更原始数据并保存,关闭以后再次执行该程序时,程序使用更改后的数据运行.(不是将修改后的数据保存在配置文件.或注册表里面.保存在原有的程序中) 解决方案 你这需求,我觉得不靠谱.一般来说都是存在加密文件的.比如xxx.db这个格式你可以自定义,但加密方法只有你知道,提取时解密即可

求教大大们一个程序运行中c#如何自动生成类的办法

问题描述 求教程序运行中,客户端通过向服务器发送不同的参数,然后由服务器端生成一个类,发给客户端执行呢?请大大们帮忙给点思路,最好有个代码实例,万分感谢! 解决方案 解决方案二:1:服务端生成类就是一个字符串,然后传给客户端.2:客户端利用CSharpCodeProvider,CompilerParameters动态执行字符串.解决方案三:最好两端都用类的定义,要么就别用这种方式,通过一种都能识别的数据结构作为传递对象,比如xml,json,序列化等解决方案四:什么叫做"生成一个类,发给客户端执

java程序 不能运行-.java程序运行中出现的问题

问题描述 .java程序运行中出现的问题 为什么相同我在eclipse上运行java程序的时候只有run configurations选项而没有run Application选项,我的java刚入门,提的问题比较低级,请各位大神多多指教,非常感谢! 解决方案 没有run Application(运行应用)选项,很明显,你的文件里面没有Main函数,Main函数是程序的入口和出口,没了Main函数自然不能启动程序的.看看你的文件里面有没有:`public static void main(Stri

如何在程序运行时动态修改一个类的属性的get;set;?

问题描述 publicclassMyTestClass{privatestring_name;publicstringName{get{returnstring.Format("名字:{0}",_name);}set{value=value??string.Empty;_name=value.Substring(0,4);}}}publicstaticvoidMain(){DynamicMethodmethod=newDynamicMethod("Set_Name"

如何判断应用程序运行于GUI模式还是Command Line

越来越多的应用程序提供以命令行的方式来运行,通常的做法有两种:单独给应用程序写一个基于命令行运行的控制台程序,用户运行这个程序时它一定是以命令行的方式来运行:以GUI和Command Line共享一个应用或exe文件,但通过不同的arguments来判断,最终分别做不同的处理. 对于单独给应用程序写基于命令行运行的控制台程序,无非是通过判断传递的args数组来辨别并设置程序运行所需要的参数,最终设定各项参数而完成所需要的工作.在这里建议提供对于/?的帮助菜单,方便用户查询. if (args.L

CSS3条件判断:@supports条件判断规则

文章简介:众所周知,不同的浏览器(不管是现代浏览器还是老版本的IE浏览器)对Web页面的解析都是不一样,为了让Web页面在这些浏览器下渲染达到基本一致的情况,给用户更好的体验,我们必须为他们写不同的样式代码. CSS3条件判断,听起来"不明觉厉",如果你对CSS稍为熟悉一点的话,你会发现CSS中的"@media"就是条件判断之一.是的,在CSS3的条件判断规范文档中包含了两个部分,其一是"@media"规则,主要用来"根据媒体属性区分样

Windows7程序运行轻松掌控

  一."白名单":程序运行自己说的算! 首先,我们来看看Windows 7中的程序运行"白名单"和"黑名单"功能.顾名思义,该功能就是限制只有在此名单中的程序才可以或不允许运行. 点击"开始"按钮,然后在搜索框中输入"gpedit.msc"打开组策略编辑器.在左侧的窗格中依次定位到"用户配置"-"管理模板"→"系统"下,在右侧我们可以看到&quo

c语言-C程序多重循环的条件判断问题的咨询

问题描述 C程序多重循环的条件判断问题的咨询 多重循环怎么学?多重循环的条件判断是根据什么语句来实现的?如何学好C语言的多重循环? 解决方案 http://ask.csdn.net/questions/215403 解决方案二: 额...这个不就两个for循环套着嘛 你要认真看教材,在开始学的情况下直接看源程序还是不大合适的 解决方案三: 多重循环没必要学,需要学的是为什么程序设计里有时会存在多重循环,自己应该在什么条件下使用循环和循环嵌套. 解决方案四: 可以用for()循环嵌套 解决方案五:

JavaScript中的条件判断语句使用详解

这篇文章主要介绍了JavaScript中的条件判断语句使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下 在写一个程序,可能有一种情况,当你需要采用一个路径出给定两个路径.所以,需要使用条件语句,让程序来做出正确的决策和执行正确的行动. JavaScript支持其用于执行根据不同的条件不同的操作条件语句.在这里,我们将解释if..else语句. JavaScript支持if..else语句的形式如下: if 语句 if...else 语句 if...else if... 语句. if 语