日志门面和日志实现
日志门面
- JCL:日志实现一套统一的api接口,apache推出的一个日志门面技术。JCL也是有缺陷的他当时只考虑了,主流的jcl和log4j。后面随着技术的的发展新的日志技术JCL是不支持的。后面jcl渐渐被淘汰了。
- slf4j:slf4j站出来了,日志实现一套统一的api接口。日志门面技术比JCL更为强大,slf4j是目前主流的日志门面技术,可以操作所有的日志实现框架。(springboot默认使用)
日志实现
- JUL:java自带的日志实现框架,功能比较单一。
- log4j:apache推出的实现框架,相对jul他的功能就比较强大了。
- logback:日志实现框架性能比log4j好很多、比较火热的springboot2.0以后默认推荐使用了。
- log4j2:Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升log4j2是目前日志实现框架性能最好的,没有之一。
slf4j + log4j2
<!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除 logback 日志实现。排除日志启动器就表示排除logback了--> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> <version>2.1.5.RELEASE</version> </dependency> <!--starter--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!--排除springbootloggging起步日志, 也就排除了logback--> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> <!--排除log4j的适配器,也就排除了log4j--> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> <version>2.1.5.RELEASE</version> </dependency> <!--导入log4j2依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!--导入log4j2 的异步日志依赖--> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.3.4</version> </dependency> <!--spring拦截器 AOP--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.4</version> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> </dependency>
log4j2.xml 文件
<?xml version="1.0" encoding="UTF-8"?> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!-- status="warn" Configuration后面日志框架本身的输出日志级别,可以不加入 monitorInterval="5" 自动加载配置文件的间隔时间, 不低于 5 秒 注: 我们的配置文件修改后在生产环境下无需重启应用, 可以实现热更新的效果 --> <Configuration monitorInterval="5"> <!--全局属性--> <Properties> <Property name="APP_NAME">duobao-log4j2</Property> <Property name="LOG_FILE_PATH">D:/logs/${APP_NAME}</Property> <Property name="PATTERN_FORMAT">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n</Property> </Properties> <!--输出源--> <Appenders> <!--输出到控制台--> <Console name="Console" target="SYSTEM_ERR"><!--输出的类型SYSTEM_ERR--> <PatternLayout pattern="${PATTERN_FORMAT}"/> </Console> <!--输出info信息日志到文件 用来定义超过指定大小自动删除旧的创建新的的Appender.--> <RollingFile name="RollingInfoFile" fileName="${LOG_FILE_PATH}/info.log" filePattern="${LOG_FILE_PATH}/$${date:yyyyMM}/info-%d{yyyyMMdd}-%i.log.gz"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <Filters> <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/> <!--高于warn级别就放行,低于这个级别就拦截--> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <PatternLayout> <pattern>${PATTERN_FORMAT}</pattern> <!--文件路径--> </PatternLayout> <!--设置文件具体拆分规则--> <Policies> <!--在系统启动时, 触发拆分规则,生产一个新的日志文件--> <OnStartupTriggeringPolicy/> <!--按照文件大小拆分, 30 MB --> <SizeBasedTriggeringPolicy size="30 MB"/> <!--按照时间节点拆分, 规则根据filePattern定义的--> <TimeBasedTriggeringPolicy/> </Policies> <!--在同一个目录下,文件的个数限定为 30 个, 超过进行覆盖--> <DefaultRolloverStrategy max="30"/> </RollingFile> <!--输出警告日志到文件--> <RollingFile name="RollingWarnFile" fileName="${LOG_FILE_PATH}/warn.log" filePattern="${LOG_FILE_PATH}/$${date:yyyyMM}/warn-%d{yyyyMMdd}-%i.log.gz"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <Filters> <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <PatternLayout> <pattern>${PATTERN_FORMAT}</pattern> <!--文件路径--> </PatternLayout> <!--设置文件具体拆分规则--> <Policies> <!--在系统启动时, 触发拆分规则,生产一个新的日志文件--> <OnStartupTriggeringPolicy/> <!--按照文件大小拆分, 30 MB --> <SizeBasedTriggeringPolicy size="30 MB"/> <!--按照时间节点拆分, 规则根据filePattern定义的--> <TimeBasedTriggeringPolicy/> </Policies> <!--在同一个目录下,文件的个数限定为 30 个, 超过进行覆盖--> <DefaultRolloverStrategy max="30"/> </RollingFile> <!--输出错误日志到文件--> <RollingFile name="RollingErrorFile" fileName="${LOG_FILE_PATH}/error.log" filePattern="${LOG_FILE_PATH}/$${date:yyyyMM}/error-%d{yyyyMMdd}-%i.log.gz"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout> <pattern>${PATTERN_FORMAT}</pattern> </PatternLayout> <Policies> <!--在系统启动时, 触发拆分规则,生产一个新的日志文件--> <OnStartupTriggeringPolicy/> <!--按照文件大小拆分, 30 MB --> <SizeBasedTriggeringPolicy size="30 MB"/> <!--按照时间节点拆分, 规则根据filePattern定义的--> <TimeBasedTriggeringPolicy/> </Policies> <!--在同一个目录下,文件的个数限定为 30 个, 超过进行覆盖--> <DefaultRolloverStrategy max="30"/> </RollingFile> <!--输出debug日志到文件--> <RollingFile name="RollingDebugFile" fileName="${LOG_FILE_PATH}/debug.log" filePattern="${LOG_FILE_PATH}/$${date:yyyyMM}/debug-%d{yyyyMMdd}-%i.log.gz"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <Filters> <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/> <!--高于warn级别就放行,低于这个级别就拦截--> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <PatternLayout> <pattern>${PATTERN_FORMAT}</pattern> <!--文件路径--> </PatternLayout> <!--设置文件具体拆分规则--> <Policies> <!--在系统启动时, 触发拆分规则,生产一个新的日志文件--> <OnStartupTriggeringPolicy/> <!--按照文件大小拆分, 30 MB --> <SizeBasedTriggeringPolicy size="30 MB"/> <!--按照时间节点拆分, 规则根据filePattern定义的--> <TimeBasedTriggeringPolicy/> </Policies> <!--在同一个目录下,文件的个数限定为 30 个, 超过进行覆盖--> <DefaultRolloverStrategy max="30"/> </RollingFile> </Appenders> <!--定义logger,日志记录器配置--> <Loggers> <!--过滤掉spring和mybatis的一些无用的DEBUG信息--> <Logger name="org.springframework" level="INFO"/> <Logger name="org.mybatis" level="INFO"/> <!-- LOG "com.luis*" at TRACE level --> <Logger name="com.luis" level="INFO"/> <!--使用 rootLogger 配置 日志级别 level="trace"--> <Root level="ALL"> <!--指定日志使用的处理器--> <AppenderRef ref="Console"/> <AppenderRef ref="RollingErrorFile"/> <AppenderRef ref="RollingWarnFile"/> <AppenderRef ref="RollingInfoFile"/> <AppenderRef ref="RollingDebugFile"/> </Root> </Loggers> </Configuration>
全局异步配置(log4j2.component.properties)
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector