SLF4J日志输出

最近在用kotlinvertx写项目,程序日志是很常见的需求。本文介绍在vertxslf4j-simple的使用。

vertx废弃自带日志API

vertx 4.0 之后弃用了它自带的在io.vertx.core.logging.LoggerFactory下面的logging,所以如果你这样写的话会有废弃提示,原因是官方不再维护自带的logging库了。

image-20240620224234263

所以,需要自己选择合适的日志库,我这里采用的是slf4j

引入

build.gradle.ktsdependencies中添加依赖

implementation("org.slf4j:slf4j-simple")

因为vertx已经依赖了org.slf4j:slf4j-api所以不再需要添加,如果是其他类型的项目需要将implementation("org.slf4j:slf4j-api")一起添加到依赖中。

使用

代码中导入org.slf4j.LoggerFactory并使用它的getLogger来取得实例

import org.slf4j.LoggerFactory

class MainVerticle : AbstractVerticle() {

  companion object {
    val logger = LoggerFactory.getLogger(MainVerticle::class.java)!!
  }
}

配置

可以使用系统属性(如JVM启动参数中指定),也可以在src/main/resources中添加simplelogger.properties属性文件来指定(文件名必须写对)。示例配置如下:

org.slf4j.simpleLogger.logFile=System.out
org.slf4j.simpleLogger.log.com.zhaoxinsoft=debug
org.slf4j.simpleLogger.showDateTime=true
org.slf4j.simpleLogger.dateTimeFormat=MM-dd HH:mm:ss:SSS
#org.slf4j.simpleLogger.showShortLogName=true
org.slf4j.simpleLogger.showThreadName=false
org.slf4j.simpleLogger.levelInBrackets=true
org.slf4j.simpleLogger.log.org.mongodb=error
#这是一个备注行,备注的行不会生效

可配置的属性和解释如下(参考来源):

  • org.slf4j.simpleLogger.logFile - 输出目标,可以是文件的路径,也可以是特殊值 "System.out" 和 "System.err"。默认值是 "System.err"。
  • org.slf4j.simpleLogger.cacheOutputStream - 如果输出目标设置为 "System.out" 或 "System.err"(见上条目),默认情况下,日志将输出到 System.out/err 变量的最新值。通过将此参数设置为 true,输出流将被缓存,即在初始化时分配一次,并独立于当前引用的 System.out/err 值重复使用。
  • org.slf4j.simpleLogger.defaultLogLevel - 所有 SimpleLogger 实例的默认日志级别。必须是 "trace"、"debug"、"info"、"warn"、"error" 或 "off" 之一。如果未指定,则默认为 "info"。越靠右级别越高,更高级别时,低级别的日志就不会打印,所以默认情况下,"debug"和"trace"都不会输出
  • org.slf4j.simpleLogger.log.a.b.c - 名为 "a.b.c" 的 SimpleLogger 实例的日志详细级别。右侧的值必须是 "trace"、"debug"、"info"、"warn"、"error" 或 "off" 之一。当名为 "a.b.c" 的 SimpleLogger 实例初始化时,其级别将从此属性中分配。如果未指定,将使用最近的父日志记录器的级别,如果没有设置,则使用 org.slf4j.simpleLogger.defaultLogLevel 指定的值。
  • org.slf4j.simpleLogger.showDateTime - 如果希望在输出消息中包含当前日期和时间,请设置为 true。默认值是 false
  • org.slf4j.simpleLogger.dateTimeFormat - 输出消息中使用的日期和时间格式。描述日期和时间格式的模式由 SimpleDateFormat 定义。如果未指定格式或格式无效,将输出自启动以来的毫秒数。
  • org.slf4j.simpleLogger.showThreadName - 如果希望输出当前线程名称,请设置为 true。默认值是 true
  • (自 1.7.33 和 2.0.0-alpha6 版本以来)org.slf4j.simpleLogger.showThreadId - 如果希望输出当前线程 ID,请设置为 true。默认值是 false
  • org.slf4j.simpleLogger.showLogName - 如果希望在输出消息中包含日志记录器实例名称,请设置为 true。默认值是 true
  • org.slf4j.simpleLogger.showShortLogName - 如果希望在输出消息中包含名称的最后一个组件,请设置为 true。默认值是 false
  • org.slf4j.simpleLogger.levelInBrackets - 日志级别字符串是否应放在中括号中输出?默认值是 false
  • org.slf4j.simpleLogger.warnLevelString - 警告级别输出的字符串值。默认值是 WARN

注意

如果在JVM启动参数中和属性文件中同时指定相同的属性名,JVM中指定的属性会具有更高优先级,比如:

java -Dorg.slf4j.simpleLogger.log.com.zhaoxinsoft=trace

使用 Grep Console

如果是用了IDEA,想要用颜色区分不同级别的日记,可以使用Grep Console插件,配置参考如下图,前提是设置org.slf4j.simpleLogger.logFile=System.out

image-20240620230059592

最终效果

如下图所示

image-20240620231705503