logback动态获取nacos配置

文章目录


前言

主要是logback动态获取nacos的配置信息,结尾完整代码

项目springcloud+nacos+plumelog,使用的时候、特别是部署的时候,需要改环境,改地址

application.yml

logback-spring.xml

yaml 复制代码
<?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环境需要再机器上执行命令

yaml 复制代码
export NACOS_SERVER_ADDR=192.168.31.11:8848
export NACOS_NAMESPACE=bd1c9d0c-be99-425f-a0bc-93838b2171a5

四、pom文件

pom中增加nacos-config依赖

yaml 复制代码
        <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的配置文件中。做日志指向。

yaml 复制代码
logging:
  config: classpath:logback-nacos.xml

这步最重要,不然动态获取失败。也是看别人解决的

完整的代码

bootstrap.yml

yaml 复制代码
# 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 复制代码
<?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中。这样就维护一份就可以了。但是没有成功,之后有空再试吧

相关推荐
EumenidesJ19 天前
Java常用日志框架介绍
java·log4j·logback·slf4j
躲在没风的地方1 个月前
logback日志控制服务器日志输出
java·服务器·logback
ta叫我小白1 个月前
Spring Boot 设置滚动日志logback
java·spring boot·spring·logback
代码的余温1 个月前
Spring Boot集成Logback日志全攻略
xml·spring boot·logback
代码的余温1 个月前
Logback.xml配置详解与实战指南
xml·logback
清风92001 个月前
Logback——日志技术(基础)
java·前端·logback
代码的余温1 个月前
MyBatis集成Logback日志全攻略
java·tomcat·mybatis·logback
秋千码途1 个月前
小架构step系列08:logback.xml的配置
xml·java·logback
枣伊吕波1 个月前
第十五节:第六部分:日志技术:logback的核心配置文件详解、日志级别
logback
再见晴天*_*1 个月前
logback 日志不打印
java·服务器·logback