Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态跳过日志消息_Java_Slf4j_Logback - Fatal编程技术网

Java 动态跳过日志消息

Java 动态跳过日志消息,java,slf4j,logback,Java,Slf4j,Logback,我想跟踪两个公共方法。其中一个方法反复调用另一个方法。我想做的是只跟踪从外部调用的方法 下面是一个简单的类来演示我的意思: public class LoggingExample { private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class); public static final String USER_ROOT = "/home/waisbrot"; /**

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

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

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的滥用


以前有人遇到过这种情况吗?您是如何处理的?

我想您可以更改代码。在我看来,最简单的方法是通过引入另一个
internalFileExists(String filename)
或使用日志工具重载fileExists(String filename)来避免问题:

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)


这并不能真正解决问题,但可以缓解问题。

我喜欢您首先提到的私有内部解决方案。