动态跳过日志消息

时间:2013-03-17 17:28:34

标签: java slf4j logback

我想跟踪两种公共方法。其中一种方法反复调用另一种方法。我想要做的只是追踪从外部调用的方法。

这是一个简单的类来演示我的意思:

public class LoggingExample {
    private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class);
    public static final String USER_ROOT = "/home/waisbrot";

    /** could be called by fileExistsRobust *or* from outside */
    public static boolean fileExists(String filename) {
        logger.trace("Checking for file {}", filename);
        File f = new File(filename);
        return f.exists();
    }

    /** always gets called from outside */
    public static boolean fileExistsRobust(String filename) {
        logger.trace("Checking for any varient of {}", filename);
        if (fileExists(filename))
            return true;
        for (String prefix : prefixes) { // this list is 100 items long
            if (fileExists(prefix + filename));
                return true;
        }
        return false;
    }
}

在我的代码中,我可以调用fileExists,在这种情况下,我希望它的日志消息被打印(假设我正在跟踪它)。但是,如果我拨打fileExistsRobost而不是那条日志消息,而不是fileExists

我希望跟踪这两种方法,但是当我调用第二种方法时,我会被隐藏在输出中。我希望Logback可以配置为理解我想要的东西,但是我没有在文档中看到任何有用的东西。当我输入fileExistsRobust然后在fileExists中测试它时,我可以翻转一个标志,但是这会因为多个线程而变得丑陋(因为这些是静态方法)并且它似乎开始污染具有大量日志记录基础结构的类。我可以使用MDC存储信息,但这似乎是滥用MDC。

之前有人遇到过这种情况吗?你怎么处理它?<​​/ p>

1 个答案:

答案 0 :(得分:1)

我假设您可以更改代码。那么我认为最简单的方法是通过引入另一个internalFileExists(String filename)或重载fileExists(String filename)来记录toogle来避免这个问题:

public static boolean fileExists(String filename, boolean doLog) {
   if (doLog) logger.trace("Checking for file {}", filename);
   File f = new File(filename);
   return f.exists(); 
}

让fileExistsRobust使用带有doLog = false的重载版本,而单个参数版本重定向到fileExists(filename,true)。

这并没有真正解决问题,而是减轻了问题。