Vertx 集成 SLF4J + Log4j2

Posted Johnny屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vertx 集成 SLF4J + Log4j2相关的知识,希望对你有一定的参考价值。

Vertx 集成 SLF4J + Log4j2

本篇主要讲解 Vertx 中 如何集成日志 ,我选择的日志是 SLF4J + Log4j2 ,我也是比较推荐这种


因为在默认情况下,vert.x 会使用 Java 默认的日志 JULJava Util Log,并读取 resource 下的 vertx-default-jul-logging.properties 文件并且不需要加任何依赖 很显然这种方式其实并不好


如果我们想用 Log4j2 + SLF4J 的组合,直接选择 log4j-slf4j-impl 或者 log4j-slf4j18-impl 即可。这里当然选用 log4j-slf4j18-impl 使用最新版本 2.13.0。它包含如下依赖:

  • org.slf4j:slf4j-api:1.8.0-alpha2

  • org.apache.logging.log4j:log4j-api:2.13.0

  • org.apache.logging.log4j:log4j-core:2.13.0

这三个依赖已经包含了我们所有需要引入的东西。


引入依赖


// https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j18-impl
//注意 一定要 compile 不能是 testCompile 否则启动 绑定不上
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j18-impl', version: '2.11.1'



日志框架加载顺序

从 vert.x 4 的官网文档中可以明确知道,他加载的顺序如下:

  1. 系统环境是否设置了 vertx.logger-delegate-factory-class-name,如果有,就是用设置的值。

  2. JUL 的配置文件 vertx-default-jul-logging.properties 是否在 classpath

  3. 如果上面都没有,就在 classPath 下按照顺序查找以下包是否存在

    1. SLF4J

    2. Log4J

    3. Log4J2

如果以上都没有,使用 vert.x 默认的 JUL 配置。

所以 vert.x 4 中,是不需要我们去手动设置 vertx.logger-delegate-factory-class-name 参数了,他会默认去加载 classpath 下的日志库的。因此我们需要添加相关的依赖。


Log4j2.xml 文件配置

log4j2.xml 放在 resources 下面 下面是我使用的 Log4j2.xml 文件 网上也有其他的 可以自己配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info" packages="org.ysten.gdog.log4j2">
   <Properties>
       <!--日志文件保存路径-->
       <Property name="LOG_PATH">/Users/johnny/Downloads/logs/</Property>
       <!--应用名称-->
       <Property name="APP_NAME">vertx-demo</Property>
       <!--日志文件最大容量, 超过最大容量后日志文件分割-->
       <Property name="MAX_FILE_SIZE">50MB</Property>
       <!--分割日志的最大次数-->
       <Property name="I_MAX">40</Property>
       <!--日志输出模版-->
       <Property name="PATTERN_LAYOUT">%d [%X{traceId}] [%t] %level (%F %M %L) - %msg%n</Property>

       <Property name="CONSOLE_LAYOUT"
                 value="%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{Blue,Bright} %highlight{${LOG_LEVEL_PATTERN:-%5p}}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=green, DEBUG=grey, TRACE=blue} %style{%pid}{magenta} --- %style{[%4.15t] %-10.40c{1.}}{cyan,Bright} : %m%n%ex"/>
   </Properties>
   <appenders>
       <Console name="CONSOLE" target="SYSTEM_OUT">
           <PatternLayout pattern="${CONSOLE_LAYOUT}" />
       </Console>
       <RollingFile name="ERROR-FILE"
                    fileName="${LOG_PATH}/${APP_NAME}_error.log"
                    filePattern="${LOG_PATH}/$${date:yyyy-MM}/${APP_NAME}_error_%d{yyyy-MM-dd}_%i.log">
           <Filters>
               <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
           </Filters>
           <PatternLayout pattern="${PATTERN_LAYOUT}"/>
           <Policies>
               <TimeBasedTriggeringPolicy/>
               <SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
           </Policies>
           <DefaultRolloverStrategy max="${I_MAX}"/>
       </RollingFile>
       <RollingFile name="INFO-FILE"
                    fileName="${LOG_PATH}/${APP_NAME}_info.log"
                    filePattern="${LOG_PATH}/$${date:yyyy-MM}/${APP_NAME}_info_%d{yyyy-MM-dd}_%i.log">
           <PatternLayout pattern="${PATTERN_LAYOUT}"/>
           <Policies>
               <TimeBasedTriggeringPolicy/>
               <SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
           </Policies>
           <DefaultRolloverStrategy max="${I_MAX}"/>
       </RollingFile>
   </appenders>
   <loggers>
       <Root level="INFO" includeLocation="true">
           <appender-ref ref="CONSOLE" />
           <appender-ref ref="ERROR-FILE" />
           <appender-ref ref="INFO-FILE" />
       </Root>
   </loggers>
</configuration>



测试代码

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private static Logger log4jLogger2 = LoggerFactory.getLogger(VertxDemo.class);

public static void main(String[] args) {

   
   Vertx vertx = Vertx.vertx();
 
   log4jLogger2.info("Hello SLF4J2");

   vertx.createHttpServer()
          .requestHandler(requestHandler -> {
               //获取到 Response 直接返回消息
               requestHandler.response().end("Hello Vertx !!!");
          })
           //监听在 8899 端口
          .listen(8899);

}



总结

本篇主要讲解 Vertx 中 如何集成日志,选择的是 Log4j2 + SLF4J 方法很简单 ,主要来记录一下。


以上是关于Vertx 集成 SLF4J + Log4j2的主要内容,如果未能解决你的问题,请参考以下文章

使用Slf4j集成Log4j2构建项目日志系统的完美解决方案

使用Slf4j集成Log4j2构建项目日志系统的完美解决方案

企业级干货丢弃Log4j,使用Slf4j集成Log4j2构建项目日志系统

slf4j的总结

log框架集成

让人头大的slf4j和log4j2