Vertx 集成 SLF4J + Log4j2
本篇主要讲解 Vertx 中 如何集成日志 ,我选择的日志是 SLF4J + Log4j2 ,我也是比较推荐这种
因为在默认情况下,vert.x 会使用 Java 默认的日志 JUL
即 Java 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 的官网文档中可以明确知道,他加载的顺序如下:
系统环境是否设置了
vertx.logger-delegate-factory-class-name
,如果有,就是用设置的值。JUL
的配置文件vertx-default-jul-logging.properties
是否在classpath
下如果上面都没有,就在 classPath 下按照顺序查找以下包是否存在
SLF4J
Log4J
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-demoProperty> <Property name="MAX_FILE_SIZE">50MBProperty> <Property name="I_MAX">40Property> <Property name="PATTERN_LAYOUT">%d [%X{traceId}] [%t] %level (%F %M %L) - %msg%nProperty> <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 方法很简单 ,主要来记录一下。