我使用Logback进行日志记录,在我的代码的几个地方,我有这样的东西:
if(message.contains("kitten")) {
logger.info(message);
} else if (message.contains("wolf")) {
logger.error(message);
} else if(message.contains("chuck norris")) {
logger.fatal(message);
} else {
logger.warn(message);
}
(大多数情况下消息来自外部系统)
有不那么难看的方法吗?
因为您使用logback作为后端,并且您没有指定您正在使用的日志API,所以我假设您正在使用slf4j (logback的本机API)。不幸的是,这个API并不像人们希望的那样灵活。例如,log4j 2有Logger.log
Level
,你可以使用它是这样的:
logger.log(levelFor(message), message);
...
private Level levelFor(String message) {
if (message.contains("kitten"))
return Level.INFO;
else if...
return...
}
不幸的是,slf4j没有Logger.log
方法。您可以使用log4j2作为API,并使用适当的jar依赖项将其桥接到logback后端。
这是一个有趣的问题,还引入了新的问题。您可以有一个单词列表,可以升级或降级该消息的日志级别。
其中一种方法是创建自己的日志记录器类,它封装了一般的日志记录框架,镜像每个日志方法。建立的第一个版本将简单地调用日志框架。public class MyLogger {
public void info(String message) { Logger.info(message); }
public void debug(String message) { Logger.debug(message); }
// And so on
}
假设你有一个单词列表,你可以引入一些单词来触发另一个级别,如果包含在消息中。
public class MyLogger {
private final List<String> warnTriggerMessages;
public MyLogger(List<String> warnTrigerMessages) {
this.warnTriggerMessages = warnTrigerMessages;
}
public void info(String message) {
if (warnTriggerMessages.stream().anyMatch(trigger => message.contains(trigger))) {
Logger.warn(message);
} else {
Logger.info(message);
}
}
// And so on
}
这只是一个非常简单的示例,但是可以使用更通用的方法进行扩展,或者与strategyppattern交织在一起,后者将基于"建议的"解决日志记录方法。日志级别和消息,其中消息可能导致策略选择比建议的日志级别更高的日志级别。
我不认为有一种方法可以指示logback根据内容更改级别,并且可能您不想这样做,因为日志记录属于您的业务逻辑。
如果你使用的是jdk 16,并且代码像你所展示的那样简单,那么switch语句可能会更好
switch (message){
case "kitten" -> logger.info(message);
case "wolf" -> logger.error(message);
case "chuck norris" -> logger.fatal(message);
default -> logger.warn(message);
}