如何从Spring应用程序日志中识别业务日志并在Logger.info()中对其进行标记?

时间:2018-06-28 03:15:50

标签: spring-boot logging logback slf4j

我正在使用Spring Boot和Logback记录我的日志。

要求是我想从Spring应用程序日志中识别业务日志,并在Logger.info()中对其进行标记。

例如:

在我的Foo.service之一中

LOGGER.info("this is my business log, I want to tag it")

我想将其与应用程序系统日志和中间件日志区分开。但是,我无法找到一种方法来判断日志是由我(业务逻辑程序员)还是应用程序系统日志编写的。

2 个答案:

答案 0 :(得分:0)

通常的方法是使用的每个Logger对象都有一个名称。最常见的是,每个类都有一个Logger对象,您给它命名的名称与其所在类的名称相同。如果您的业务逻辑在特定的程序包中,则这些记录器都具有相同的前缀,您可以设置任何内容记录所需的配置,将这些日志定向到单独的文件或您要执行的操作。

如果您正在寻找比这更复杂的东西,那么SLF4J / Logback方法将是use Markers

Marker businessNotification = MarkerFactory.getMarker("BUSINESS_NOTIFICATION");
Logger logger = LoggerFactory.getLogger("aLogger");
//…
logger.info(businessNotification, "this is my business log")

然后,您可以在Logback的PatternLayout中使用%marker,也可以通过标记执行更复杂的filtering

答案 1 :(得分:0)

为避免编写重复的代码(例如在每封邮件中添加前缀或标记),您可以创建自己的简单包装器类:

public class BusinessLogger {
    private final Logger logger; // initialize in constructor, can even add a getter if needed

    public void info(String msg) {
        logger.info("[BUSINESS] " + msg);
    }
}

用法:

// class member, can even be static
BusinessLogger logger = new BusinessLogger(LoggerFactory.getLogger(this.getClass()));

// in a method
logger.info("this is my business log")

输出:

[2019-02-13 13:41:21.009] [INFO] 12540 [Test worker] : [BUSINESS] this is my business log

如果您希望所有日志都成为业务日志,则此方法将很好地工作。如果您仍然必须使用原始记录器,则可以执行logger.getLogger().info("non-business info");,并给出:

[2019-02-13 13:41:22.414] [INFO] 12540 [Test worker] : non-business info