我想为 JUnit 测试用例配置 log4j。我的测试分布在多个文件中,但具有相同的 log4j 设置。我在哪里可以做?
我不想使用 log4j 属性文件。
我的解决方案,似乎有效。
编写一个扩展 Log4j 系统的自定义类
公共类 myLogger 扩展 Logger { ... 东西 ...
}
对于“东西”,您需要实施以下(或至少我做到了)
某种构造函数 public myLogger (String name)
.. 在每个类中,您希望/需要包含 myLogger 的静态成员
private static final myLogger errorLog =  new myLogger("nameOfClassOrWhateverNameYouFancy")
如果您在所有类中使用相同的名称,它们将记录到相同的日志记录实例(您可能已经知道)
回到你的 myLogger 类,你需要实现一个设置日志级别的方法(这就是我做的......)
/**
 * 
 * The add(int i, String s) method
 * @param s the message string
 *
 * @param i used in the switch to create the required level of debug
 * @param s the message to send
 * 
 * use this method to create a log message of any required level
 * The levels are as follows:
 * 1    debug - used during production
 * 2    info  - may be used for messages to user
 * 3    warn  - warnings for requesting users re-enter information (data type checking etc)
 * 4    error - programmatic / user error may result in unexpected output 
 * 5    fatal - severe error (comms error) the system will terminate, cleanly if possible, current state will be written to file
 * 
 * Prior to all this however the method determines the calling class of itself
 * 
 */
public void add(int i, String s)
{
    switch (i)
    {
    case 1: log.debug(s);break;
    case 2: log.info(s);break;
    case 3: log.warn(s);break;
    case 4: log.error(s);break;
    case 5: log.fatal(s);break;
    }
}
现在,如果您想要一些“奇怪的东西”的特定日志实例,您有 2 个选项,正如我之前所说,您可以为命名记录器创建一个静态成员,或者您可以将静态成员添加到您的 myLogger 类(这就是我做到了)。
然后对于这些静态成员中的每一个,您可能需要一个唯一的
set[nameOfLogger](int i, string s)
它基本上具有与上述方法相同的结构。
现在,如果您想从您调用的课程中调用它
myLogger.set[nameOfLogger](1, "s")
你走了。
然后,您需要将有关日志级别(DEBUG、WARN 等)以及将消息发送到何处(控制台、文件等)的信息添加到您的 log4j.properties(如我所用)或 log4j.xml 中。
记住要确保关于设置静态命名记录器的行出现在 rootLogger 的实例之后,这让我很长一段时间都感到困惑!
我已经包含了我认为相当广泛的指导,因为我为此进行了相当长的一段时间的斗争,直到今天才最终完成!
我现在是一只快乐的兔子......直到我打破别的东西;)
大卫
抱歉,刚刚注意到您不想使用 log4j.properties 文件。有什么特别的原因吗?
如果不只是
import org.apache.log4j.Logger;
创建一个日志实例
private Logger jUnitTestingLogger;
然后使用各种方法调用设置输出(我特别想添加附加程序),我从来没有这样做过,所以不知道怎么做!
有趣的是,有一个 assertLog(boolean assertion, string message) 方法在您的实例中可能对您有好处。