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相关推荐

  1. jpa日志 logback_SpringBoot | 第二十五章:日志管理之自定义Appender

    前言 前面两章节我们介绍了一些日志框架的常见配置及使用实践.一般上,在开发过程中,像log4j2.logback日志框架都提供了很多Appender,基本上可以满足大部分的业务需求了.但在一些特殊需求 ...

  2. logback自定义日志格式

    logback自定义日志格式 1.ClassicConverter 继承ClassicConverter package com.demo.conf;import ch.qos.logback.cla ...

  3. 阅读Logback文档笔记--Logback的Appender配置

    Logback将执行日志事件输出的组件称为Appender,实现的Appender必须继承 ch.qos.logback.core.Appender 接口 接口如下: package ch.qos.l ...

  4. Logback各Appender详解及配置

    转载自:http://blog.csdn.net/doraemon_wu/article/details/51972261 Logback将执行日志事件输出的组件称为Appender,实现的Appen ...

  5. appender log4j 扩展_java-如何在log4j2中创建自定义Appender?

    在log4j2中,其工作原理与在log4j-1.2中完全不同. 在log4j2中,您将为此创建一个插件. 该手册在此处提供了自定义附加程序示例的说明:[http://logging.apache.or ...

  6. 【原创】自定义Appender类,输出DCMTK日志

    就像DCMTK官方论坛说的那个问题一样:问题:自定义Appender输出DCMTK的oflog DCMTK日志输出类 大家都知道:DCMTK只提供下面四个日志输出类. FileAppender: Ap ...

  7. 问题:自定义Appender输出DCMTK的oflog

    在我调试DCMTK的DcmNet过程中,发现在Oflog中,DCMTK的日志只能输出到控制台应用程序的console窗口,或者输出到文件中,无法单独获取日志信息. 如果想输出Gui项目中,需要自己继承 ...

  8. log4j 自定义 appender

    如何使用Log4j? 1. Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要下载和了解更详细的内容,还是访问其官方网站吧: http://jakarta.ap ...

  9. log4j2自定义appender插件源码、配置及采坑说明

    本篇为扩展appender标签,如果需要扩展filer.marker等其他的log4j2提供的扩展方式,可以查看相关的文档: 中文文档:https://www.docs4dev.com/docs/zh ...

最新文章

  1. DPDK 内存池rte_mempool实现(二十三)
  2. CEDD(Color and Edge Directivity Descriptor)学习篇
  3. 根据字符串选择类并完成类的初始化--方法二
  4. P1115 最大子段和(python3实现)
  5. 一台弹性云服务器可以挂载多块磁盘吗?
  6. [十]JavaIO之FilterInputStream FilterOutputStream
  7. 程序员,如何从平庸走向理想?答:干困难事!
  8. long在python中的意思_Python中的Long对象
  9. 万字总结:金融市场基础知识
  10. postfix搭建纯邮件转发服务器
  11. docker之SonarQube导出PDF报告
  12. 湘潭大学计算机分数线,湘潭大学录取分数线2021是多少分(附历年录取分数线)
  13. Oracle 启动失败报错“TNS-12555: TNS:permission denied”解决办法
  14. 南艺计算机作曲专业怎样,南京艺术学院作曲与作曲技术理论专业/学费/录取分数线/怎么样...
  15. LocalDateTime的基本使用
  16. QT -关于QLineEdit的函数text获取的值是空的
  17. 再一次打破局限:“华为云会议”和“畅连”到底连接了什么
  18. 拍照怎么测量尺寸?这些方法可以了解一下
  19. android 来电显示号码,android监控来电显示
  20. mxreality.js 免费开源的全景图/全景视频/VR 直播播放器介绍

热门文章

  1. 网易云音乐中间件改造
  2. 玻璃厂CCD视觉设备APS系统数据采集对接格式规范
  3. 程序员面试金典(第六版)
  4. 车辆路径优化matlab代码,5个求解车辆路径问题(VRP)的MATLAB算法
  5. 使用NtUserBuildHwndList遍历窗口_win7x64
  6. html sql网页游戏源码,魔兽世界网页游戏webgame源码(asp)
  7. AD域根据组名称获取DirectoryEntry对象
  8. 高效的股票数据接口工具有哪些?
  9. canvas 绘制圆弧
  10. CycleGAN与pix2pix不得不玩的模型