1

在我现有的应用程序中,“ org.apache.log4j ”API 已在 java 代码中使用。

要求 :

在任何情况下,我都必须在日志文件中记录一些语句(比如 xyz),并且不应该依赖于日志级别。例如:如果我的日志级别是错误,那么 xyz 也应该打印,如果我的日志级别是调试,那么 xyz 也应该打印.

我无法使 xyz 的日志语句处于调试状态,因为如果我这样做,除 xyz 之外的其他日志语句也将开始打印。

为此,我相信,我必须添加一些自定义日志级别。请帮助如何做到这一点以及如何设置其级别顺序,以便在任何情况下都应该打印。

提前致谢。此致

4

3 回答 3

4

您可以“劫持”受保护的方法Logger#forcedLog()以始终打印到日志。

您必须将劫持者类与Logger.

package org.apache.log4j;

/**
 * @author maba, 2012-08-23
 */
public class LogOverride {
    public static void print(Logger logger, String message) {
        logger.forcedLog(logger.getName(), Priority.INFO, message, null);
    }
}

并从您的调用代码

log.setLevel(Level.OFF); // Make sure logging is turned off
log.info("Normal logging"); // Will not be seen anywhere
LogOverride.print(log, "Overriding logger"); // Will still make it to your appender

这就是 log4j 常见问题解答关于自定义级别的内容:

如何添加自定义关卡?

这是可能的,但很少合适。该请求通常针对名为“审计”之类的级别,该级别显然不适合进程“跟踪”、“调试”、“信息”、“警告”、“错误”和“致命”。在这种情况下,对级别的请求实际上是对指定不同受众的机制的请求。适当的机制是为“审计”相关消息使用不同的记录器名称(或树)。

因此,如果您想接受该建议,那么您应该查看SJuan76的答案。

于 2012-08-23T11:21:30.857 回答
4

您可以做的是Logger为这些语句创建一个不同的语句(在定义记录器时,您不限于使用类名)

// Standard logger
private static Logger log = Logger.getLogger(MyClass.class)

// XYZ logger
private static Logger logXYZ = Logger.getLogger("logs.xyz");

您可以从多个类访问相同的记录器,您只需传递相同的标签。

然后,在配置文件中,可以为该类别定义不同的日志级别,甚至将这些日志输出到不同的appender中(不同的文件、处理等)

于 2012-08-23T10:50:15.283 回答
0

如果您决定采用创建自定义的想法,则需要创建 Level 的子类来执行此操作,因为Level构造函数是protected.

/**
 * Instantiate a Level object.
 */
 protected Level(int level, String levelStr, int syslogEquivalent) {
     super(level, levelStr, syslogEquivalent);
 } 

看起来您应该链接到Level构造函数,并为其传递一个合适的level值。请注意,级别编号越大,优先级越高。因此,对于Level在任何现有命名级别都不会被阻止的 a,您需要一个大于Priority.FATAL_INTwhich is的值50000

(但是,我不相信这是正确的方法。首先,您可能无法在日志配置文件中按名称引用您的自定义级别。)

于 2012-08-23T11:06:59.837 回答