logback动态获取nacos配置


前言

主要是logback动态获取nacos的配置信息,结尾完整代码
项目springcloud+nacos+plumelog,使用的时候、特别是部署的时候,需要改环境,改地址
在这里插入图片描述
application.yml
在这里插入图片描述
logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">

    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->

    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="./logs"/>
    <property name="log.name" value="main"/>

    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <pattern>%green(TIMESTAMP):%-5d{yyyy-MM-dd HH:mm:ss.SSS}; %yellow(LEVEL):%level; %magenta(CLASS):%C{50};
                %magenta(METHOD):%M; %yellow(CT):%thread; %green(MSG):%msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/${log.name}.log</file>
        <!--日志文件输出格式-->
        <!-- class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder"-->
        <encoder>
            <pattern>%green(TIMESTAMP):%-5d{yyyy-MM-dd HH:mm:ss.SSS}; %yellow(LEVEL):%level; %magenta(CLASS):%C{50};
                %magenta(METHOD):%M; %yellow(CT):%thread; %green(MSG):%msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按小时 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/all/${log.name}-%d{yyyy-MM-dd-HH}.gz</fileNamePattern>
            <!--日志文件保留小时数-->
            <maxHistory>2160</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件全部记录,不加入Filter -->
    </appender>

    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/${log.name}-error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%green(TIMESTAMP):%-5d{yyyy-MM-dd HH:mm:ss.SSS}; %yellow(LEVEL):%level; %magenta(CLASS):%C{50};
                %magenta(METHOD):%M; %yellow(CT):%thread; %green(MSG):%msg%n
            </pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按小时 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/${log.name}-error-%d{yyyy-MM-dd-HH}.gz</fileNamePattern>
            <!--日志文件保留小时数-->
            <maxHistory>2160</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 异步输出 -->
    <appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志的话,discardingThreshold必须大于0,并且应小于appender的maxQueueSize -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 设置日志事件的最大队列长度 -->
        <queueSize>256</queueSize>
        <!-- 添加真正的日志appender,引用同步,将其包装为异步 -->
        <appender-ref ref="CONSOLE"/>
    </appender>
    <!-- 异步输出 -->
    <appender name="ASYNC_INFO_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志的话,discardingThreshold必须大于0,并且应小于appender的maxQueueSize -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 设置日志事件的最大队列长度 -->
        <queueSize>256</queueSize>
        <!-- 添加真正的日志appender,引用同步,将其包装为异步 -->
        <appender-ref ref="INFO_FILE"/>
    </appender>
    <!-- 异步输出 -->
    <appender name="ASYNC_ERROR_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志的话,discardingThreshold必须大于0,并且应小于appender的maxQueueSize -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 设置日志事件的最大队列长度 -->
        <queueSize>256</queueSize>
        <!-- 添加真正的日志appender,引用同步,将其包装为异步-->
        <appender-ref ref="ERROR_FILE"/>
    </appender>

    <!-- 使用kafka启用下面配置-->
    <appender name="plumelog" class="com.plumelog.logback.appender.KafkaAppender">
        <appName>cmp-system</appName>
        <!--        qa-->
        <!--                <kafkaHosts>192.168.31.12:6667,192.168.31.13:6667,192.168.31.14:6667</kafkaHosts>-->
        <!--prod-->
        <kafkaHosts>192.168.30.17:6667,192.168.30.18:6667,192.168.30.19:6667,192.168.30.20:6667,192.168.30.21:6667
        </kafkaHosts>
    </appender>

    <!--开发环境:打印控制台-->
    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="CONSOLE"/>
            <!--<appender-ref ref="DEBUG_FILE" />-->
            <appender-ref ref="INFO_FILE"/>
            <!--<appender-ref ref="WARN_FILE" />-->
            <appender-ref ref="ERROR_FILE"/>
            <appender-ref ref="plumelog"/>
        </root>
    </springProfile>

    <!--测试环境:输出到文件-->
    <springProfile name="test">
        <root level="info">
            <appender-ref ref="CONSOLE"/>
            <!--<appender-ref ref="DEBUG_FILE" />-->
            <appender-ref ref="INFO_FILE"/>
            <!--<appender-ref ref="WARN_FILE" />-->
            <appender-ref ref="ERROR_FILE"/>
            <appender-ref ref="plumelog"/>
        </root>
    </springProfile>

    <!--QA环境:输出到文件-->
    <springProfile name="qa">
        <root level="info">
            <appender-ref ref="CONSOLE"/>
            <!--<appender-ref ref="DEBUG_FILE" />-->
            <appender-ref ref="INFO_FILE"/>
            <!--<appender-ref ref="WARN_FILE" />-->
            <appender-ref ref="ERROR_FILE"/>
            <appender-ref ref="plumelog"/>
        </root>
    </springProfile>

    <!--生产环境:输出到文件-->
    <springProfile name="prod">
        <root level="info">
            <appender-ref ref="CONSOLE"/>
            <!--<appender-ref ref="DEBUG_FILE" />-->
            <appender-ref ref="INFO_FILE"/>
            <!--<appender-ref ref="WARN_FILE" />-->
            <appender-ref ref="ERROR_FILE"/>
            <appender-ref ref="plumelog"/>
        </root>
    </springProfile>

</configuration>

每次部署需要修改使用active的版本。和修改xml的kafka地址。已经使用了nacos的服务发现功能。决定用配置中心整理下。


一、整体思路

在nacos上将配置信息配置上。logback动态获取nacos的配置

二、使用bootstrap.yml

原来是application.yml,但是在spring中,logback.xml的加载循序在application.yml之前。导致logback.xml动态获取kafka服务器地址失败。
bootstrap.yml
在这里插入图片描述
NACOS_SERVER_ADDR、NACOS_NAMESPACE是自定义环境变量。
如果读取不到NACOS_SERVER_ADDR、NACOS_NAMESPACE值,默认值为后面的nacos地址、命名空间

三、增加环境变量

本地不用管。默认即可。qa、prod环境需要再机器上执行命令

export NACOS_SERVER_ADDR=192.168.31.11:8848
export NACOS_NAMESPACE=bd1c9d0c-be99-425f-a0bc-93838b2171a5

四、pom文件

pom中增加nacos-config依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

五、logback-spring.xml更改

logback-spring.xml修改为logback-nacos.xml,名字可以自定义。
在nacos的配置文件中。做日志指向。

logging:
  config: classpath:logback-nacos.xml

这步最重要,不然动态获取失败。也是看别人解决的
在这里插入图片描述
在这里插入图片描述
完整的代码
在这里插入图片描述
bootstrap.yml

# Tomcat
server:
  port: 9003

# Spring
spring:
  application:
    # 应用名称
    name: cmp-sim-management
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: ${NACOS_SERVER_ADDR:10.10.10.20:8848}
      config:
        # 配置中心地址
        server-addr: ${NACOS_SERVER_ADDR:10.10.10.20:8848}
        # 配置文件格式
        file-extension: yaml
        namespace: ${NACOS_NAMESPACE:bd1c9d0c-be99-425f-a0bc-93838b2171a5}
        refresh-enabled: true

logback-nacos-xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">

    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->

<!--    <contextName>logback1</contextName>-->
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="./logs"/>
    <property name="log.name" value="main"/>
    <springProperty scope="context" name="application.name" source="spring.application.name"/>
    <springProperty scope="context" name="plumelog.kafka" source="spring.kafka.bootstrap-servers"/>
    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
        <encoder>
            <pattern>%green(TIMESTAMP):%-5d{yyyy-MM-dd HH:mm:ss.SSS}; %yellow(LEVEL):%level; %magenta(CLASS):%C{50};
                %magenta(METHOD):%M; %yellow(CT):%thread; %green(MSG):%msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/${log.name}.log</file>
        <!--日志文件输出格式-->
        <!-- class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder"-->
        <encoder>
            <pattern>%green(TIMESTAMP):%-5d{yyyy-MM-dd HH:mm:ss.SSS}; %yellow(LEVEL):%level; %magenta(CLASS):%C{50};
                %magenta(METHOD):%M; %yellow(CT):%thread; %green(MSG):%msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按小时 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/all/${log.name}-%d{yyyy-MM-dd-HH}.gz</fileNamePattern>
            <!--日志文件保留小时数-->
            <maxHistory>2160</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件全部记录,不加入Filter -->
    </appender>

    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/${log.name}-error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%green(TIMESTAMP):%-5d{yyyy-MM-dd HH:mm:ss.SSS}; %yellow(LEVEL):%level; %magenta(CLASS):%C{50};
                %magenta(METHOD):%M; %yellow(CT):%thread; %green(MSG):%msg%n
            </pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按小时 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/${log.name}-error-%d{yyyy-MM-dd-HH}.gz</fileNamePattern>
            <!--日志文件保留小时数-->
            <maxHistory>2160</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 异步输出 -->
    <appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志的话,discardingThreshold必须大于0,并且应小于appender的maxQueueSize -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 设置日志事件的最大队列长度 -->
        <queueSize>256</queueSize>
        <!-- 添加真正的日志appender,引用同步,将其包装为异步 -->
        <appender-ref ref="CONSOLE"/>
    </appender>
    <!-- 异步输出 -->
    <appender name="ASYNC_INFO_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志的话,discardingThreshold必须大于0,并且应小于appender的maxQueueSize -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 设置日志事件的最大队列长度 -->
        <queueSize>256</queueSize>
        <!-- 添加真正的日志appender,引用同步,将其包装为异步 -->
        <appender-ref ref="INFO_FILE"/>
    </appender>
    <!-- 异步输出 -->
    <appender name="ASYNC_ERROR_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志的话,discardingThreshold必须大于0,并且应小于appender的maxQueueSize -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 设置日志事件的最大队列长度 -->
        <queueSize>256</queueSize>
        <!-- 添加真正的日志appender,引用同步,将其包装为异步-->
        <appender-ref ref="ERROR_FILE"/>
    </appender>

    <!--    &lt;!&ndash; 使用kafka启用下面配置&ndash;&gt;-->
        <appender name="plumelog" class="com.plumelog.logback.appender.KafkaAppender">
            <appName>${application.name}</appName>
            <kafkaHosts>${plumelog.kafka}</kafkaHosts>
        </appender>

    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <!--<appender-ref ref="DEBUG_FILE" />-->
        <appender-ref ref="INFO_FILE"/>
        <!--<appender-ref ref="WARN_FILE" />-->
        <appender-ref ref="ERROR_FILE"/>
        <appender-ref ref="plumelog"/>
    </root>

</configuration>

从nacos中动态获取kafka信息
在这里插入图片描述
在这里插入图片描述


总结

原本想着将logback-nacos.xml也放到nacos中。这样就维护一份就可以了。但是没有成功,之后有空再试吧

### Nacos 中集成 logback-spring.xml 的方法 要在基于 Spring Cloud 和 Nacos 的微服务架构中集成 `logback-spring.xml` 文件,可以通过以下方式完成: #### 1. **通过 Nacos 动态加载 Logback 配置** Nacos 支持动态配置管理功能,可以将 `logback-spring.xml` 存储为远程配置文件并由应用动态拉取。以下是具体的实现过程。 ##### a. 配置 application.yml 在项目的 `application.yml` 文件中定义日志路径以及从 Nacos 获取配置的方式[^1]: ```yaml logging: file: name: logs/${spring.application.name}.log config: http://${spring.cloud.nacos.config.server-addr}/nacos/v1/cs/configs?group=DEFAULT_GROUP&tenant=${spring.cloud.nacos.config.namespace}&dataId=logback-spring.xml ``` 上述配置表示应用程序会尝试从 Nacos Server 加载名为 `logback-spring.xml` 的配置文件作为日志框架的核心配置。 ##### b. 添加必要的依赖项 为了支持 LogbackNacos 的联动,需引入如下 Maven 或 Gradle 依赖项: ```xml <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>${nacos.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> ``` ##### c. 创建 logback-spring.xml 并上传至 Nacos 创建一个标准的 `logback-spring.xml` 文件,并将其存储到 Nacos 控制台中的 Configurations 页面下。例如,下面是一个简单的示例配置文件[^4]: ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 输出到控制台 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 定义根日志级别 --> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration> ``` 将该 XML 文件保存为 `logback-spring.xml`,并通过 Nacos Console 发布它,确保其 Group ID 是默认组 (`DEFAULT_GROUP`),Data ID 命名为 `logback-spring.xml`。 #### 2. **启用 Discovery Client** 为了让项目能够正常连接到 Nacos Server 来获取配置信息,在启动类上添加 `@EnableDiscoveryClient` 注解[^2]: ```java @SpringBootApplication @EnableDiscoveryClient public class ConsumerNacos8080 { public static void main(String[] args) { SpringApplication.run(ConsumerNacos8080.class, args); } } ``` 这样做的目的是让 Spring Boot 应用程序注册到 Nacos Service Registry 上的同时也能访问 Configuration Management 功能模块。 #### 3. **调整日志级别 (可选)** 如果需要针对某些特定包或者组件单独设定不同的日志等级,则可以在 `application.yml` 中进一步细化设置[^3]: ```yaml logging: level: com.alibaba.nacos: WARN com.chint.smartpower.common.repository.dao: DEBUG ``` 以上配置表明对于阿里巴巴旗下的 Nacos SDK,默认仅记录警告及以上严重程度的消息;而对于自定义 DAO 层逻辑部分则开启调试模式以便于排查问题。 --- ### 总结 综上所述,要成功地把 `logback-spring.xml` 整合进使用了 Nacos 的分布式系统里,主要分为三步操作——修改本地 YAML 参数指向远端地址、编写标准化格式化的 Logging Template 文档存入云端平台以及最后确认客户端具备发现能力从而顺利同步最新改动后的策略方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值