一、简介
在lombok v0.10 中添加了各种@Log 的变体。lombok 0.10 中的新内容:你可以用log 注解来注解任何类,让lombok 生成一个logger 字段。
该logger 被命名为log ,字段的类型取决于你选择了哪一个logger 。
lombok v1.16.24 中的新内容:增加了谷歌的FluentLogger (通过@Flogger )。
lombok v1.18.10 中的新功能:增加了@CustomLog ,让你可以通过配置如何用配置键来创建任何日志记录器。
您将@Log 的变体放在类中(以适用于您使用的日志系统的为准);然后,您有一个静态的final log 字段,按照您使用的日志框架通常规定的方式进行初始化,然后您可以使用它来编写日志语句。
有多种选择可供选择:
@CommonsLog
private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@Flogger
private static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();
@JBossLog
private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
@Log
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2
private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j
private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
@CustomLog
private static final com.foo.your.Logger log = com.foo.your.LoggerFactory.createYourLogger(LogExample.class);
这个选项要求你在lombok.config 文件中添加一个配置,指定@CustomLog 应该做什么。
例如:lombok.log.custom.declaration = com.foo.your.Logger com.foo.your.LoggerFactory.createYourLog(TYPE)(TOPIC) 这将产生上述语句。
首先是一个类型,即你的记录器的类型,然后是一个空格,然后是你的记录器工厂的类型,然后是一个点,然后是记录器工厂方法的名称,然后是1或2个参数定义;最多一个带有TOPIC 的定义,最多一个没有TOPIC 的定义。每个参数定义都以括号内的逗号分隔的参数种类列表的形式指定。这些选项是 TYPE (传递这个@Log 装饰的类型,作为一个类),NAME (传递这个@Log 装饰的类型的完全合格的名称),TOPIC (传递在@CustomLog 注释上设置的明确选择的主题字符串),以及NULL (传递空)。
logger 类型是可选的;如果省略,则使用logger 工厂类型。(因此,如果logger 类具有创建logger 的静态方法,则可以缩短logger 定义)。
@CustomLog 的主要目的是支持你的内部私有日志框架。
默认情况下,logger 的主题(或名称)将是用@Log 注解的类的(名称)。这可以通过指定topic 参数进行定制。例如: @XSlf4j(topic="reporting") 。
二、示例比较
1. Lombok 写法
import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;
@Log
public class LogExample {
public static void main(String... args) {
log.severe("Something's wrong here");
}
}
@Slf4j
public class LogExampleOther {
public static void main(String... args) {
log.error("Something else is wrong here");
}
}
@CommonsLog(topic="CounterLog")
public class LogExampleCategory {
public static void main(String... args) {
log.error("Calling the 'CounterLog' with a message");
}
}
2. Java 标准写法
public class LogExample {
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
public static void main(String... args) {
log.severe("Something's wrong here");
}
}
public class LogExampleOther {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class);
public static void main(String... args) {
log.error("Something else is wrong here");
}
}
public class LogExampleCategory {
private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog("CounterLog");
public static void main(String... args) {
log.error("Calling the 'CounterLog' with a message");
}
}
三、支持的配置项
lombok.log.fieldName = 一个标识符 (默认: log ). 默认情况下,生成的记录器字段名为“log ”,但您可以使用此设置将其更改为其他名称。
lombok.log.fieldIsStatic = [true | false ] (默认: true ) 通常情况下,生成的记录器是一个静态字段。通过设置此键为false ,生成的字段将是一个实例字段。
lombok.log.custom.declaration = LoggerType LoggerFactoryType.loggerFactoryMethod(loggerFactoryMethodParams)( loggerFactoryMethodParams ) 配置在使用@CustomLog 时要生成什么。(斜体部分是可选的)。 loggerFactoryMethodParams 是一个用逗号分隔的列表,可以传递0到任意数量的参数种类。有效的种类:TYPE 、NAME 、TOPIC 和NULL 。你可以为没有设置明确主题的情况(不要在参数列表中包括TOPIC )和设置明确主题的情况(在列表中包括TOPIC 参数)包含一个参数定义。
lombok.log.flagUsage = [warning | error ] (默认: not set ) Lombok 会将各种日志注释的任何使用标记为警告或错误(如果已配置)。
lombok.log.custom.flagUsage = [warning | error ] (默认: not set ) 如果配置了,Lombok 会将任何对@lombok.CustomLog 的使用标记为警告或错误。
lombok.log.apacheCommons.flagUsage = [warning | error ] (默认: not set ) 如果配置了,Lombok 会将任何对@lombok.extern.apachecommons.CommonsLog 的使用标记为警告或错误。
lombok.log.flogger.flagUsage = [warning | error ] (默认: not set ) 如果配置了,Lombok 会将任何对@lombok.extern.flogger.Flogger 的使用标记为警告或错误。
lombok.log.jbosslog.flagUsage = [warning | error ] (默认: not set ) 如果配置了,Lombok 会将任何对@lombok.extern.jbosslog.JBossLog 的使用标记为警告或错误。
lombok.log.javaUtilLogging.flagUsage = [warning | error ] (默认: not set ) 如果配置了,Lombok 会将任何对@lombok.extern.java.Log 的使用标记为警告或错误。
lombok.log.log4j.flagUsage = [warning | error ] (默认: not set ) 如果配置了,Lombok 会将任何对@lombok.extern.log4j.Log4j 的使用标记为警告或错误。
lombok.log.log4j2.flagUsage = [warning | error ] (默认: not set ) 如果配置了,Lombok 会将任何对@lombok.extern.log4j.Log4j2 的使用标记为警告或错误。
lombok.log.slf4j.flagUsage = [warning | error ] (默认: not set ) 如果配置了,Lombok 会将任何对@lombok.extern.slf4j.Slf4j 的使用标记为警告或错误。
lombok.log.xslf4j.flagUsage = [warning | error ] (默认: not set ) 如果配置了,Lombok 会将任何对@lombok.extern.slf4j.XSlf4j 的使用标记为警告或错误。
四、附属说明
如果一个名为log 的字段已经存在,将发出警告,并且不会生成代码。
lombok 的多样化日志注释的一个未来功能是找到对logger 字段的调用,如果所选的日志框架支持它,并且日志级别可以在编译时从日志调用中确定,则用if 语句来保护它。这样,如果日志语句最终被忽略,就可以完全避免对日志字符串的潜在大量的计算。这确实意味着你不应该在你的日志表达式中加入任何其他操作。
参考文献
【1】@Log (and friends) | Captain’s Log, stardate 24435.7: “What was that line again?”
|