logback自定义appender
1、定义appender
1.1 logback.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 --><!-- <property name="LOG_HOME" value="d:" /> --><!-- ch.qos.logback.core.ConsoleAppender 控制台输出 --><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern></encoder></appender><!-- 自定义文件输出-错误日志 --><appender name="ErrorFile" class="com.ybw.logback.demo.filter.LogFileAppender"><File>${LOG_HOME:-c:/}logs/error/error.log</File><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${LOG_HOME:-c:/}logs/error/error-%d{yyyy-MM-dd}.%i.log</FileNamePattern><MaxHistory>30</MaxHistory><TimeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><MaxFileSize>100MB</MaxFileSize></TimeBasedFileNamingAndTriggeringPolicy></rollingPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 --><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder charset="UTF-8"><pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="stdout"/><appender-ref ref="ErrorFile"/></root>
</configuration>
1.2 自定义appender代码
package com.ybw.logback.demo.filter;import ch.qos.logback.core.encoder.Encoder;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.spi.DeferredProcessingAware;
import ch.qos.logback.core.status.ErrorStatus;
import com.ybw.logback.demo.constant.fs.FSConstant;
import com.ybw.logback.demo.utils.FsUtils;import java.io.IOException;/*** 自定义的appender* 1.可以对接受到的event中的日志信息做任何操作处理* 2.可以在同步写日志文件的时候,存入MySQL或者es** @author ybw* @version V1.0* @className LogFileAppender* @date 2022/9/16**/
public class LogFileAppender<E> extends RollingFileAppender<E> {public void setEncoder(Encoder encoder) {//自定义的appender的父类OutputStreamAppender在启动的时候会判断是否有encoder ,无的话自定义appender启动会失败 super.setEncoder(encoder);}/*** 覆盖父类OutputStreamAppender的日志记录功能,再这里面做日志切操作功能** @param event*/protected void subAppend(E event) {if (this.isStarted()) {try {if (event instanceof DeferredProcessingAware) {((DeferredProcessingAware) event).prepareForDeferredProcessing();}//根据标签规则拿到日志字符串,这里可以再次修改日志信息byte[] byteArray = super.encoder.encode(event);//做一些日志的特殊处理sendFs(byteArray);
// writeMongo(...);
// writeRedis(...);
// writeMq(...);//写入日志文件writeBytes(byteArray);} catch (IOException var3) {this.started = false;this.addStatus(new ErrorStatus("IO failure in appender", this, var3));}}}/*** 飞书报警** @param byteArray* @methodName: sendFs* @return: void* @author: ybw* @date: 2022/9/15**/private void sendFs(byte[] byteArray) {if (byteArray != null && byteArray.length != 0) {this.lock.lock();try {FsUtils.sendTextMessage(FSConstant.TextContentEnum.ERROR_LOG, new String(byteArray));} finally {this.lock.unlock();}}}private void writeBytes(byte[] byteArray) throws IOException {if (byteArray != null && byteArray.length != 0) {this.lock.lock();try {this.getOutputStream().write(byteArray);if (this.isImmediateFlush()) {this.getOutputStream().flush();}} finally {this.lock.unlock();}}}
}
1.3 测试
package com.ybw.logback.demo.custom;import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;/*** @className CustomLog* @author ybw* @date 2022/9/15 * @version V1.0**/
@Slf4j
public class CustomLog {/**** @methodName: print* @return: void* @author: ybw* @date: 2022/9/15**/@Testpublic void print(){log.info("aa");log.error("bb");}
}
错误日志、报警内容如下:
[ERROR] 2022-09-17 18:07:51.577 [main] c.ybw.logback.demo.custom.CustomLog - bb
2、logback.xml变量使用-spring配置
logback的变量作用于有三种:local,context,system
- local 作用域在配置文件内有效;
- context 作用域的有效范围延伸至 logger context;
- system 作用域的范围最广,整个 JVM 内都有效;
logback 在替换变量时,首先搜索 local 变量,然后搜索 context,然后搜索 system,在spring项目中,应将变量的作用域设置为context,并交给spring控制。
2.1 spring的配置作为变量
application.yml
server:port: 8080
spring:application:name: logback-online-alarmprofiles:active: dev
application-dev.yml
#飞书
fs:bot:webhook:suf: /aa #测试
logback.xml配置如下,PROFILES-ACTIVE、FS-BOT-WEBHOOK-SUF为spring配置文件中的属性
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--获取spring配置文件的变量--><springProperty scope="context" name="PROFILES-ACTIVE" source="spring.profiles.active" defaultValue=""/><springProperty scope="context" name="FS-BOT-WEBHOOK-SUF" source="fs.bot.webhook.suf" defaultValue=""/><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 --><!-- <property name="LOG_HOME" value="d:" /> --><!-- ch.qos.logback.core.ConsoleAppender 控制台输出 --><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern></encoder></appender><!-- 所有日志输出 --><appender name="AllFile"class="ch.qos.logback.core.rolling.RollingFileAppender"><File>${LOG_HOME:-c:/}logs/all/all.log</File><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${LOG_HOME:-c:/}logs/all/all-%d{yyyy-MM-dd}.%i.log</FileNamePattern><MaxHistory>30</MaxHistory><TimeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><MaxFileSize>100MB</MaxFileSize></TimeBasedFileNamingAndTriggeringPolicy></rollingPolicy><layout class="ch.qos.logback.classic.PatternLayout"><pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern></layout></appender><!-- 自定义文件输出-错误日志 --><appender name="ErrorFile" class="com.ybw.logback.demo.config.LogFileAppender"><File>${LOG_HOME:-c:/}logs/error/error.log</File><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${LOG_HOME:-c:/}logs/error/error-%d{yyyy-MM-dd}.%i.log</FileNamePattern><MaxHistory>30</MaxHistory><TimeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><MaxFileSize>100MB</MaxFileSize></TimeBasedFileNamingAndTriggeringPolicy></rollingPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 --><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder charset="UTF-8"><pattern>[${PROFILES-ACTIVE}] [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern></encoder><fsSuf>${FS-BOT-WEBHOOK-SUF}</fsSuf></appender><root level="info"><appender-ref ref="stdout"/><appender-ref ref="ErrorFile"/><appender-ref ref="AllFile"/></root>
</configuration>
2.2 自定义appender代码
package com.ybw.logback.demo.config;import ch.qos.logback.core.encoder.Encoder;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.spi.DeferredProcessingAware;
import ch.qos.logback.core.status.ErrorStatus;
import com.ybw.logback.demo.constant.fs.FSConstant;
import com.ybw.logback.demo.utils.FsUtils;
import lombok.Data;import java.io.IOException;/*** 自定义的appender* 1.可以对接受到的event中的日志信息做任何操作处理* 2.可以在同步写日志文件的时候,存入mysql或者es** @author ybw* @version V1.0* @className LogFileAppender* @date 2022/9/16**/
@Data
public class LogFileAppender<E> extends RollingFileAppender<E> {private String fsSuf;@Overridepublic void setEncoder(Encoder encoder) {//自定义的appender的父类OutputStreamAppender在启动的时候会判断是否有encoder ,无的话自定义appender启动会失败 super.setEncoder(encoder);}/*** 覆盖父类OutputStreamAppender的日志记录功能,再这里面做日志切操作功能** @param event*/@Overrideprotected void subAppend(E event) {if (this.isStarted()) {System.out.println("fsSuf:"+fsSuf);try {if (event instanceof DeferredProcessingAware) {((DeferredProcessingAware) event).prepareForDeferredProcessing();}//根据标签规则拿到日志字符串,这里可以再次修改日志信息byte[] byteArray = super.encoder.encode(event);//做一些日志的特殊处理sendFs(byteArray);
// writeMongo(...);
// writeRedis(...);
// writeMq(...);//写入日志文件writeBytes(byteArray);} catch (IOException var3) {this.started = false;this.addStatus(new ErrorStatus("IO failure in appender", this, var3));}}}/*** 飞书报警** @param byteArray* @methodName: sendFs* @return: void* @author: ybw* @date: 2022/9/15**/private void sendFs(byte[] byteArray) {if (byteArray != null && byteArray.length != 0) {this.lock.lock();try {FsUtils.sendTextMessage(FSConstant.TextContentEnum.ERROR_LOG, new String(byteArray));} finally {this.lock.unlock();}}}private void writeBytes(byte[] byteArray) throws IOException {if (byteArray != null && byteArray.length != 0) {this.lock.lock();try {this.getOutputStream().write(byteArray);if (this.isImmediateFlush()) {this.getOutputStream().flush();}} finally {this.lock.unlock();}}}
}
fsSuf为logback.xml配置的属性。
2.3 测试
package com.ybw.logback.demo.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author ybw* @version V1.0* @className LogController* @date 2022/9/16**/
@RestController
@Slf4j
public class LogController {/**** @methodName: getLog* @return: java.lang.String* @author: ybw* @date: 2022/9/16**/@GetMapping("/getLog")public String getLog() {log.info("aa");log.error("bb");return "OK";}
}
访问接口:http://localhost:8080/getLog
错误日志、报警内容如下:
[dev] [ERROR] 2022-09-17 18:30:31.513 [http-nio-8080-exec-5] c.y.l.demo.controller.LogController - bb
[dev]为spring.profiles.active。
3、logback.xml变量使用-配置中心
以nacos为例
3.1 配置文件
bootstrap.yml配置
server:port: 8080
spring:application:name: logback-nacosprofiles:active: dev
logging:config: classpath:logback.xml #日志配置要放在nacos配置之后
bootstrap-dev.yml配置
spring:cloud:nacos:config:server-addr: localhost:8848username: nacospassword: nacosnamespace: nacos-config #命名空间# group: DEFAULT_GROUP #默认DEFAULT_GROUPfile-extension: yml #配置中心的格式,默认为properties
配置中心
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--获取spring配置文件的变量--><springProperty scope="context" name="PROFILES-ACTIVE" source="spring.profiles.active" defaultValue=""/><springProperty scope="context" name="FS-BOT-WEBHOOK-SUF" source="fs.bot.webhook.suf" defaultValue=""/><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 --><!-- <property name="LOG_HOME" value="d:" /> --><!-- ch.qos.logback.core.ConsoleAppender 控制台输出 --><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern></encoder></appender><!-- 所有日志输出 --><appender name="AllFile"class="ch.qos.logback.core.rolling.RollingFileAppender"><File>${LOG_HOME:-c:/}logs/all/all.log</File><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${LOG_HOME:-c:/}logs/all/all-%d{yyyy-MM-dd}.%i.log</FileNamePattern><MaxHistory>30</MaxHistory><TimeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><MaxFileSize>100MB</MaxFileSize></TimeBasedFileNamingAndTriggeringPolicy></rollingPolicy><layout class="ch.qos.logback.classic.PatternLayout"><pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern></layout></appender><!-- 自定义文件输出-错误日志 --><appender name="ErrorFile" class="com.ybw.logback.demo.config.LogFileAppender"><File>${LOG_HOME:-c:/}logs/error/error.log</File><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${LOG_HOME:-c:/}logs/error/error-%d{yyyy-MM-dd}.%i.log</FileNamePattern><MaxHistory>30</MaxHistory><TimeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><MaxFileSize>100MB</MaxFileSize></TimeBasedFileNamingAndTriggeringPolicy></rollingPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 --><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder charset="UTF-8"><pattern>[${PROFILES-ACTIVE}] [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern></encoder><fsSuf>${FS-BOT-WEBHOOK-SUF}</fsSuf></appender><root level="info"><appender-ref ref="stdout"/><appender-ref ref="ErrorFile"/><appender-ref ref="AllFile"/></root>
</configuration>
3.2 自定义appender代码
与2.2一致。
3.3 测试
与2.3一致。
fsSuf即配置中心的属性,会打印在控制台。
fsSuf:/aa
logback自定义appender相关推荐
- jpa日志 logback_SpringBoot | 第二十五章:日志管理之自定义Appender
前言 前面两章节我们介绍了一些日志框架的常见配置及使用实践.一般上,在开发过程中,像log4j2.logback日志框架都提供了很多Appender,基本上可以满足大部分的业务需求了.但在一些特殊需求 ...
- logback自定义日志格式
logback自定义日志格式 1.ClassicConverter 继承ClassicConverter package com.demo.conf;import ch.qos.logback.cla ...
- 阅读Logback文档笔记--Logback的Appender配置
Logback将执行日志事件输出的组件称为Appender,实现的Appender必须继承 ch.qos.logback.core.Appender 接口 接口如下: package ch.qos.l ...
- Logback各Appender详解及配置
转载自:http://blog.csdn.net/doraemon_wu/article/details/51972261 Logback将执行日志事件输出的组件称为Appender,实现的Appen ...
- appender log4j 扩展_java-如何在log4j2中创建自定义Appender?
在log4j2中,其工作原理与在log4j-1.2中完全不同. 在log4j2中,您将为此创建一个插件. 该手册在此处提供了自定义附加程序示例的说明:[http://logging.apache.or ...
- 【原创】自定义Appender类,输出DCMTK日志
就像DCMTK官方论坛说的那个问题一样:问题:自定义Appender输出DCMTK的oflog DCMTK日志输出类 大家都知道:DCMTK只提供下面四个日志输出类. FileAppender: Ap ...
- 问题:自定义Appender输出DCMTK的oflog
在我调试DCMTK的DcmNet过程中,发现在Oflog中,DCMTK的日志只能输出到控制台应用程序的console窗口,或者输出到文件中,无法单独获取日志信息. 如果想输出Gui项目中,需要自己继承 ...
- log4j 自定义 appender
如何使用Log4j? 1. Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要下载和了解更详细的内容,还是访问其官方网站吧: http://jakarta.ap ...
- log4j2自定义appender插件源码、配置及采坑说明
本篇为扩展appender标签,如果需要扩展filer.marker等其他的log4j2提供的扩展方式,可以查看相关的文档: 中文文档:https://www.docs4dev.com/docs/zh ...
最新文章
- DPDK 内存池rte_mempool实现(二十三)
- CEDD(Color and Edge Directivity Descriptor)学习篇
- 根据字符串选择类并完成类的初始化--方法二
- P1115 最大子段和(python3实现)
- 一台弹性云服务器可以挂载多块磁盘吗?
- [十]JavaIO之FilterInputStream FilterOutputStream
- 程序员,如何从平庸走向理想?答:干困难事!
- long在python中的意思_Python中的Long对象
- 万字总结:金融市场基础知识
- postfix搭建纯邮件转发服务器
- docker之SonarQube导出PDF报告
- 湘潭大学计算机分数线,湘潭大学录取分数线2021是多少分(附历年录取分数线)
- Oracle 启动失败报错“TNS-12555: TNS:permission denied”解决办法
- 南艺计算机作曲专业怎样,南京艺术学院作曲与作曲技术理论专业/学费/录取分数线/怎么样...
- LocalDateTime的基本使用
- QT -关于QLineEdit的函数text获取的值是空的
- 再一次打破局限:“华为云会议”和“畅连”到底连接了什么
- 拍照怎么测量尺寸?这些方法可以了解一下
- android 来电显示号码,android监控来电显示
- mxreality.js 免费开源的全景图/全景视频/VR 直播播放器介绍