自定义日志级别

时间:2012-08-23 10:46:30

标签: java java-ee logging log4j

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

要求:

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

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

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

提前致谢。 最诚挚的问候

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分: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常见问题解答中关于custom levels所说的内容:

  

如何添加自定义级别?

     

这是可能的,但很少适用。该请求通常用于名为" audit"这显然不适合进展"追踪","调试","信息","警告",&#34 ;错误"并且"致命"。在这种情况下,对级别的请求实际上是对指定不同受众的机制的请求。适当的机制是使用不同的记录器名称(或树)进行"审计"相关消息。

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

答案 2 :(得分:0)

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

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

看起来像然后你应该链接到Level构造函数,并传递一个合适的level值。请注意,级别编号越大,优先级越高。因此,对于在任何现有命名级别都无法阻止的Level,您需要的值大于Priority.FATAL_INT 50000

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