springboot3 多环境日志系统配置的问题,无法动态切换dev和prod,以及多环境日志系统的配置,和自动动态切换日志系统,include标签无法获取配置文件的active值

2023-11-04

        今天做一个多环境的日志系统,yml文件里面写dev 就使用 dev的日志系统,如果是prod。就指定开发环境的日志系统。

        结果今天倒好,写是写了,无法解析,老是在后面加一个 is_undefined的字符,我不知道这么回事,直到我用if和else来改写我才明白是缺少了依赖,需要添加janino依赖才跨域根据application的active的值来动态使用开发版或者生产环境的日志。

        这个文章该了两次了,下面这个依赖不用加了,因为我不用if 标签判断了,改用了springProfile 就不用这个依赖了

        想日志文件获取application.yml里面的active来选择对应的日志配置,需要添加如下依赖,不让无法解析获取yml里面的active的值。

<!--        logback 解析 条件表达式-->
        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
            <version>3.1.3</version>
        </dependency>

效果:

        好了,上面解决了include标签 无法获取application.yml的${} 的问题了,下面开始多环境日志系统的配置。


        所谓的多环境日志系统,就是获取spring boot的application.yml 文件里面的spring.profile.active的值来选择对应的日志配置,开发环境使用开发环境的日志配置文件,开发环境的日志在控制台输出,生产环境就用生产环境的日志配置文件,日志不是在控制台输出,而是输出到文件,报错的日志和不报错的日志,放在不同的文件里面。而且还有几个月前的日志,框架自动打包,压缩。

        application.yml文件  (改变active:prod 为active:dev 可以切换到开发的日志配置)

server:
  port: 8080
  servlet:
    context-path: /

spring:
  application:
    name: school
  profiles:
    active: prod
#    有prod dev环境
#    include: dev,prod
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/javawebtest?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root

logging:
#指定日志的配置文件的位置。
  config: classpath:logback-spring.xml

主要是loggind.config这里classpath:配置文件路径,还有spring.profiles.active的值,值是随便写的。后面你得用它。

1. 在resource目录下面放下面的三个文件

2. logback-spring.xml 配置文件(主配置文件)

include标签根据springProfile标签的值是否存在,存在就添加开发或者生产环境下的日志配置文件,不存在,就不执行里面的include.(关于使用<include resource="logback-${activeProfile}.xml"></include>)这个方法,好像不行 ${ }无法解析,这个是ai给我的,我感觉好假,根本就不行

<?xml version="1.0" encoding="UTF-8"?>
<!--scan logback 扫描指定目录下的配置文件 发生变化 重新加载 60秒检测一次 开发环境 关闭调试模型-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

<!--name 属性为dev 表示设置了dev 的值的话,就执行include 的标签,引入xxx-dev 文件-->
    <springProfile name="dev">
        <include resource="logback-dev.xml"/>
    </springProfile>
<!--同上 ,这个的定义prod是application.yml的active那个的值-->
    <springProfile name="prod">
        <include resource="logback-prod.xml"/>
    </springProfile>



    <!--    <include resource="logback-${profile}.xml"/>-->
    <!--        <include resource="logback-${spring.profiles.active}.xml"/>-->
    <!-- 定义变量 logPath 值是value后面的 定义日志存放目录 -->
    <property name="logPath" value="./logs"/>
    <!--    日志输出的格式-->
    <!--    %d{yyyy-MM-dd HH:mm:ss.SSS}:输出日志时间,格式为年-月-日 时:分:秒.毫秒。

[%t-%L]:输出线程名称和所在代码行号。

%-5level:输出日志级别,占用 5 个字符的宽度,左对齐。

%logger{36}:输出 Logger 名称,最大长度为 36。

%L:输出所在代码行号。

%M:输出所在方法名。

%msg:输出日志信息。

%xEx:输出异常信息。

%n:输出换行符。-->
    <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} %L %M - %msg%xEx%n"/>
    <!--  应该是本文件的命令空间 ,有多个log 文件  -->
    <contextName>logback</contextName>



</configuration>

3. logback-prod.xml 生产环境的日志配置文件

<?xml version="1.0" encoding="UTF-8"?>
<included>

    <!--    正常的日志文件,输出到文件中-->
    <!--   日志回滚,超过一定时间和文件大小,自动归档 然后进行压缩 -->
    <appender name="fileDEBUGLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
        所以我们使用下面的策略,可以避免输出 Error 的日志-->
        <!--    可能是防止不必要的日志,对系统性能的影响   定义一个过滤器 ,日志Error的就Deny 调 ,否者就是接受  -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--过滤 Error-->
            <level>Error</level>
            <!--匹配到就禁止-->
            <onMatch>DENY</onMatch>
            <!--没有匹配到就允许-->
            <onMismatch>ACCEPT</onMismatch>
        </filter>

        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
            的日志改名为今天的日期。即,<File> 的日志都是当天的。
        -->
        <!--        指定日志文件的路径和名称 -->
        <File>${logPath}/log_demo.log</File>
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <!--        日志回滚,梅泰诺都滚动到一个新的文件中 文件名是日期格式 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${logPath}/log_demo_%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--只保留最近90天的日志-->
            <maxHistory>90</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>
        <!--日志输出编码格式化-->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>

    <!--为日志输出加一个过滤器 输出ERROR日志到指定的文件中-->
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>Error</level>
        </filter>
        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
            的日志改名为今天的日期。即,<File> 的日志都是当天的。
        -->
        <File>${logPath}/error.log</File>
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${logPath}/error_%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--只保留最近90天的日志-->
            <maxHistory>90</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>
        <!--日志输出编码格式化-->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>



    <!--    定义指定package的日志级别-->
    <logger name="org.springframework" level="DEBUG"/>
    <logger name="org.mybatis" level="DEBUG"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    <logger name="io.lettuce.*" level="INFO"/>
    <logger name="io.netty.*" level="ERROR"/>
    <logger name="com.rabbitmq.*" level="DEBUG"/>
    <logger name="org.springframework.amqp.*" level="DEBUG"/>
    <logger name="org.springframework.scheduling.*" level="DEBUG"/>
    <!--定义com.xxx..xx..xx包下的日志信息不上传,直接输出到fileDEBUGLog和fileErrorLog这个两个appender中,日志级别为DEBUG-->
    <logger name="com.baiyu" additivity="false" level="DEBUG">
        <appender-ref ref="fileDEBUGLog"/>
        <appender-ref ref="fileErrorLog"/>
    </logger>
  <root level="DEBUG">
        <appender-ref ref="fileDEBUGLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>

</included>

4. logback-dev.xml 开发环境的日志配置文件

<?xml version="1.0" encoding="UTF-8"?>
<included>


    <!--配置日志的输出目标  输出到控制台 ConsoleAppender-->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <!--指定日志输出格式 展示格式 layout-->
        <encoder>
            <pattern>${PATTERN}</pattern>
        </encoder>
<!--        <layout class="ch.qos.logback.classic.PatternLayout">-->
<!--            <pattern>${PATTERN}</pattern>-->
<!--        </layout>-->
        <!--根据条件过滤日志 满足条件的才输出  过滤器,只有过滤到指定级别的日志信息才会输出,如果level为ERROR,那么控制台只会输出ERROR日志-->
        <!--        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
        <!--               指定日志级别 Error 以上才输出         -->
        <!--            <level>ERROR</level>-->
        <!--        </filter>-->
    </appender>

    <!--指定最基础的日志输出级别-->
    <root level="DEBUG">
        <!--appender将会添加到这个loger-->
            <appender-ref ref="consoleLog"/>
    </root>
</included>

ok 如果是生产环境的话,产生两个文件,我这是4个是两天的日志了,你们第一次是两个日志,今天4月9日,昨天的日志是04-08

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot3 多环境日志系统配置的问题,无法动态切换dev和prod,以及多环境日志系统的配置,和自动动态切换日志系统,include标签无法获取配置文件的active值 的相关文章

随机推荐