08. 《Lombok 实战 —— @Log》

文章目录

    • 《Lombok 实战 —— @Log》
      • 1. @Log 体系简介
      • 2. @Log 实战使用
      • 3. @Log 注解详解
      • 4. @Log 全局配置
      • 参考文档

《Lombok 实战 —— @Log》

Captain’s Log, stardate 24435.7: “What was that line again?”

lombok v0.10中添加了各种@Log变体。 lombok 0.10中的添加此功能,使用@Log对任何类进行注释,以使lombok生成的logger字段对代码进行注释操作。

1. @Log 体系简介

你把@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);

2. @Log 实战使用

以上便是lombok为我们提供的日志模块,我常用的会有以下几种:@Log@Slf4j@CommonsLog

在进行测试之前需要引用两个依赖,分别是slf4j的依赖和Apache的commons-logging

<dependency>
    <groupId>org.slf4jgroupId>
    <artifactId>slf4j-apiartifactId>
    <version>1.7.25version>
dependency>
<dependency>
    <groupId>commons-logginggroupId>
    <artifactId>commons-loggingartifactId>
    <version>1.2version>
dependency>

下面我们简单实现代码:

@Log
public class LogExample {
    public static void main(String[] args) {
        log.severe("this is @Log testing.");
    }
}

@Slf4j
class Slf4jExample {
    public static void main(String[] args) {
        log.info("this is @Slf4j testing.");
    }
}

@CommonsLog
class CommonsLogExample{
    public static void main(String[] args) {
        log.info("this is @CommonsLog testing.");
    }
}

以上的代码编译之后为:

public class LogExample {
    private static final Logger log = Logger.getLogger(LogExample.class.getName());
    public static void main(String[] args) {
        log.severe("this is @Log testing.");
    }
}

class Slf4jExample {
    private static final Logger log = LoggerFactory.getLogger(Slf4jExample.class);
    public static void main(String[] args) {
        log.info("this is @Slf4j testing.");
    }
}

class CommonsLogExample {
    private static final Log log = LogFactory.getLog(CommonsLogExample.class);
    public static void main(String[] args) {
        log.info("this is @CommonsLog testing.");
    }
}

使用不同的注解,lonbok将为我们选择不同的日志框架,但是前提一定要添加此日志框架的依赖。

3. @Log 注解详解

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface Log {
	// 指定Logger在上下文的名称,默认名称是:类的全包名。
	String topic() default "";
}
  • 测试 topic 属性

    // 默认名称是:类的全包名,e.g. com.gitee.jdkong.lombok.log.LogExample
    @Log(topic = "qwe")	
    public class LogExample {
        public static void main(String[] args) {
            System.out.println(log.getName());
            log.severe("this is @Log testing.");
        }
    }
    
    // 输出内容
    qwe
    一月 08, 2019 1:10:23 下午 com.gitee.jdkong.lombok.log.LogExample main
    严重: this is @Log testing.
    
  • 编译后的代码

    public class LogExample {
        private static final Logger log = Logger.getLogger("qwe");
        //默认:private static final Logger log = Logger.getLogger(LogExample.class.getName());
        public LogExample() {}
        public static void main(String[] args) {
            System.out.println(log.getName());
            log.severe("this is @Log testing.");
        }
    }
    

4. @Log 全局配置

# 生成的logger 的 fieldname 默认为“log”,你可以使用此设置将其更改为其他名称,比如:testLog。
# 那么你在代码中使用时,就要使用 testLog.info(""); 之类的。
lombok.log.fieldName = an identifier (default: log).
# 使用的 field 是否是静态的调用,默认静态调用的。
lombok.log.fieldIsStatic = [true | false] (default: true)
# 是否启用@Log注解。(以下类似)
lombok.log.flagUsage = [warning | error] (default: not set)
lombok.log.apacheCommons.flagUsage = [warning | error] (default: not set)
lombok.log.flogger.flagUsage = [warning | error] (default: not set)
lombok.log.jbosslog.flagUsage = [warning | error] (default: not set)
lombok.log.javaUtilLogging.flagUsage = [warning | error] (default: not set)
lombok.log.log4j.flagUsage = [warning | error] (default: not set)
lombok.log.log4j2.flagUsage = [warning | error] (default: not set)
lombok.log.slf4j.flagUsage = [warning | error] (default: not set)
lombok.log.xslf4j.flagUsage = [warning | error] (default: not set)
  • 测试lombok.log.fieldIsStatic

    • 全局配置

      config.stopBubbling = true
      clear lombok.log.fieldIsStatic
      lombok.log.fieldIsStatic = false
      
    • 代码实现

      @Log
      public class LogExample {
      
          private void testFieldIsNotStatic() {
              log.severe("this is @Slf4j testing.");
          }
      	// 由于取消了 log 的静态属性,所以在main方法中不能直接调用
          public static void main(String[] args) {
              LogExample example = new LogExample();
              example.testFieldIsNotStatic();
          }
      }
      // 编译后:
      public class LogExample {
          private final Logger log = Logger.getLogger(LogExample.class.getName());
          public LogExample() {}
      
          private void testFieldIsNotStatic() {
              this.log.severe("this is @Slf4j testing.");
          }
          public static void main(String[] args) {
              LogExample example = new LogExample();
              example.testFieldIsNotStatic();
          }
      }
      

      这样我们就可以使用非静态的Log对象来帮我们操作日志了。

  • 测试 lombok.log.fieldName

    • 全局配置

      # 全局配置
      config.stopBubbling = true
      clear lombok.log.fieldName
      lombok.log.fieldName = testLog
      
    • 代码实现

      上面指定了日志对象的变量名,所以

      @Log
      public class LogExample {
          public static void main(String[] args) {
              testLog.severe("this is @Log testing.");
          }
      }
      // 编译后:
      public class LogExample {
          private static final Logger testLog = Logger.getLogger(LogExample.class.getName());
          public LogExample() { }
      
          public static void main(String[] args) {
              testLog.severe("this is @Log testing.");
          }
      }
      

参考文档

  • Project Lombok

.

.

.

.

.

.

你可能感兴趣的:(Lombok)