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

比如我有两个用户A和B,我需要记录这两个用户的操作信息:add和del。

我希望把A的日志存放到logs/A/**目录下,比如
logs/A/add/add.log
logs/A/add/del.log

我希望把B的日志存放到logs/B/**目录下,比如
logs/B/add/add.log
logs/B/add/del.log

当程序在记录日志时,知道用户是谁。
如何在记录日志时,让程序根据用户来选择日志存放目录?

log4j支持这样的功能吗,能否给出简明的log4j配置。
在此谢谢各位~

1个回答

可以的:
[code="java"]
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 logMap = new HashMap();

    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";
    }
    }

[/code]

qq_34609195
游骑兵2 看来一个logger来记录所有用户的add或del操作是不可能的。 听说Logback可以很优雅的解决此问题。 多谢~~
大约 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐