kikisang 2023-07-04 16:39 采纳率: 0%
浏览 38
已结题

Logback-spring.xml配置中的参数property如何从数据库动态获取?

有个需求,利用Logback的SMTPAppender监控error级别日志,一旦有error级别日志就发出告警邮件,邮件接收者配置在mailTo的参数中,这个参数想实现利用数据库配置,以下是配置

<configuration>
<define name="mailTo" class="com.xxx.xxx.common.config.MyPropertyDefiner"/>
<appender name="MAIL" class="ch.qos.logback.classic.net.SMTPAppender">
            <smtpHost>${smtpHost}</smtpHost>
            <smtpPort>465</smtpPort>
            <username>${username}</username>
            <password>${password}</password>
            <SSL>true</SSL>
            <asynchronousSending>true</asynchronousSending>
            <from>${username}</from>
            <to>${mailTo}</to>
            <subject>${mailSubject}: %logger{0}</subject>
            <charsetEncoding>UTF-8</charsetEncoding>
            <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
                <bufferSize>1</bufferSize>
            </cyclicBufferTracker>
            <!--HTML展示-->
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%X%ip%date%level%thread%logger{0}%message</pattern>
            </layout>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
        </appender>
        <root level="info">
            <appender-ref ref="MAIL"/>
        </root>
</configuration>

@Component
public class MyPropertyDefiner extends PropertyDefinerBase {
    @Override
    public String getPropertyValue() {
        System.out.println("自定义的PropertyDefinerBase的getPropertyValue方法");
        try {
            rst = // 从数据库获取
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rst;

    }

    public static void updateProperty(String propertyName, String propertyValue) {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        loggerContext.putProperty(propertyName, propertyValue);
        loggerContext.reset();
    }
}

设想是通过自定义的方式从数据库获取mailTo配置信息,数据库更新时会调用一遍getPropertyValue()方法以达到更新目的,但显然不行,只能使用服务启动加载时获取到的初始值,比如服务启动时数据库中mailTo='xxx@163.com'后续即使修改成其他如:yyy@163.com也无用,依然发送到初始的xxx@163.com邮箱,也就是这种方法是行不通的,那么请教有没有其他方法能满足动态更新配置项?

  • 写回答

1条回答 默认 最新

  • 夜郎king 2022博客之星IT其它领域TOP 12 2023-07-05 08:06
    关注

    一般都是将运维信息统一出口,由一个固定邮箱来发送消息保证消息源头。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月5日
  • 修改了问题 7月4日
  • 创建了问题 7月4日

悬赏问题

  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错