15、Lombok 实战教程 - @Log | 如何优雅的进行日志记录

一、简介

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到任意数量的参数种类。有效的种类:TYPENAMETOPICNULL。你可以为没有设置明确主题的情况(不要在参数列表中包括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语句来保护它。这样,如果日志语句最终被忽略,就可以完全避免对日志字符串的潜在大量的计算。这确实意味着你不应该在你的日志表达式中加入任何其他操作。