1 Star 0 Fork 29

lihe01 / notebook

forked from JustryDeng / notebook 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
[05]logback & springboot不同环境激活不同配置.md 13.17 KB
一键复制 编辑 原始数据 按行查看 历史

logback & springboot不同环境激活不同配置

相关知识点

  • logback日志模块在和 springboot 整合过程中,官方建议使用-spring 来命名日志文件(如logback-spring.xml),这样的话日志配置文件将由springboot进行配置(对比:如果直接命名为logback.xml的话,是由logback直接解析而不是springboot解析的);spring-boot解析的话,就能填充logback-spring.xml中的一些变量的值,进而实现非常灵活的配置
  • logback配置文件logback-spring.xml中的springProfile指令允许您根据springboot配置文件激活参数(spring.profiles.active) 选择性的包含和排查部分配置信息
  • springProfile指令可以出现在configuration元素内任意地方使用
  • springProfile指令通过指定name属性的值来和springboot的spring.profiles.active对应

springProfile使用示例

  • 定值

    <springProfile name="test">
        <!-- configuration to be enabled when springb-boot "test" profile is active -->
    </springProfile>
  • <springProfile name="dev | test">
        <!-- configuration to be enabled when springb-boot "dev" or "test" profiles are active -->
    </springProfile>
  • <springProfile name="!production">
        <!-- configuration to be enabled when springb-boot "production" profile is not active -->
    </springProfile>

测试验证

spring-boot:2.6.6

环境说明

  • 项目结构

    image-20221020101410200

  • 各配置文件内容

    • application-dev.properties

      curr.env.info=我是dev环境
    • application-test.properties

      curr.env.info=我是test环境
    • application-prod.properties

      curr.env.info=我是prod环境
  • DemoApplication启动类

    @Slf4j
    @SpringBootApplication
    public class DemoApplication implements ApplicationRunner {
        
        @Value("${spring.profiles.active}")
        private String springProfilesActive;
        
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
        
        @Override
        public void run(ApplicationArguments args) throws Exception {
            log.info("随便记录点什么吧,那就~ 此时, spring.profiles.active=" + springProfilesActive);
        }
    }
  • logback-spring.xml配置

    <configuration>
        <!-- 多环境定制logger配置 -->
        <!--  dev  -->
        <springProfile name="dev">
            <springProperty name="currEnvInfo" scope="context" source="curr.env.info" defaultValue=""/>
            <property name="pattern"  value="${currEnvInfo} %msg%n"/>
            <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <pattern>${pattern}</pattern>
                    <charset class="java.nio.charset.Charset">UTF-8</charset>
                </encoder>
            </appender>
            <root level="INFO">
                <appender-ref ref="consoleAppender"/>
            </root>
        </springProfile>
    
        <!--  test  -->
        <springProfile name="test">
            <springProperty name="currEnvInfo" scope="context" source="curr.env.info" defaultValue=""/>
            <property name="pattern"  value="${currEnvInfo} %msg%n"/>
            <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <pattern>${pattern}</pattern>
                    <charset class="java.nio.charset.Charset">UTF-8</charset>
                </encoder>
            </appender>
            <root level="INFO">
                <appender-ref ref="consoleAppender"/>
            </root>
        </springProfile>
    
        <!--  prod  -->
        <springProfile name="prod">
            <springProperty name="currEnvInfo" scope="context" source="curr.env.info" defaultValue=""/>
            <property name="pattern"  value="${currEnvInfo} %msg%n"/>
            <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <pattern>${pattern}</pattern>
                    <charset class="java.nio.charset.Charset">UTF-8</charset>
                </encoder>
            </appender>
            <root level="INFO">
                <appender-ref ref="consoleAppender"/>
            </root>
        </springProfile>
    
    </configuration>

测试

  • 当springboot配置spring.profiles.active=dev激活dev环境时,日志输出

      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::                (v2.6.6)
    
    我是dev环境 Starting DemoApplication using Java 1.8.0_291 on DESKTOP-K08MNSB with PID 15340 (G:\working\demo\demo\target\classes started by 邓沙利文 in G:\working\demo\demo)
    我是dev环境 The following 1 profile is active: "dev"
    我是dev环境 Tomcat initialized with port(s): 8080 (http)
    我是dev环境 Initializing ProtocolHandler ["http-nio-8080"]
    我是dev环境 Starting service [Tomcat]
    我是dev环境 Starting Servlet engine: [Apache Tomcat/9.0.60]
    我是dev环境 Initializing Spring embedded WebApplicationContext
    我是dev环境 Root WebApplicationContext: initialization completed in 754 ms
    我是dev环境 Starting ProtocolHandler ["http-nio-8080"]
    我是dev环境 Tomcat started on port(s): 8080 (http) with context path ''
    我是dev环境 Started DemoApplication in 1.455 seconds (JVM running for 2.647)
    我是dev环境 随便记录点什么吧,那就~ 此时, spring.profiles.active=dev
  • 当springboot配置spring.profiles.active=dev激活dev环境时,日志输出

      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::                (v2.6.6)
    
    我是test环境 Starting DemoApplication using Java 1.8.0_291 on DESKTOP-K08MNSB with PID 13540 (G:\working\demo\demo\target\classes started by 邓沙利文 in G:\working\demo\demo)
    我是test环境 The following 1 profile is active: "test"
    我是test环境 Tomcat initialized with port(s): 8080 (http)
    我是test环境 Initializing ProtocolHandler ["http-nio-8080"]
    我是test环境 Starting service [Tomcat]
    我是test环境 Starting Servlet engine: [Apache Tomcat/9.0.60]
    我是test环境 Initializing Spring embedded WebApplicationContext
    我是test环境 Root WebApplicationContext: initialization completed in 539 ms
    我是test环境 Starting ProtocolHandler ["http-nio-8080"]
    我是test环境 Tomcat started on port(s): 8080 (http) with context path ''
    我是test环境 Started DemoApplication in 0.986 seconds (JVM running for 2.003)
    我是test环境 随便记录点什么吧,那就~ 此时, spring.profiles.active=test
  • 当springboot配置spring.profiles.active=dev激活dev环境时,日志输出

      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::                (v2.6.6)
    
    我是prod环境 Starting DemoApplication using Java 1.8.0_291 on DESKTOP-K08MNSB with PID 16220 (G:\working\demo\demo\target\classes started by 邓沙利文 in G:\working\demo\demo)
    我是prod环境 The following 1 profile is active: "prod"
    我是prod环境 Tomcat initialized with port(s): 8080 (http)
    我是prod环境 Initializing ProtocolHandler ["http-nio-8080"]
    我是prod环境 Starting service [Tomcat]
    我是prod环境 Starting Servlet engine: [Apache Tomcat/9.0.60]
    我是prod环境 Initializing Spring embedded WebApplicationContext
    我是prod环境 Root WebApplicationContext: initialization completed in 535 ms
    我是prod环境 Starting ProtocolHandler ["http-nio-8080"]
    我是prod环境 Tomcat started on port(s): 8080 (http) with context path ''
    我是prod环境 Started DemoApplication in 0.996 seconds (JVM running for 2.058)
    我是prod环境 随便记录点什么吧,那就~ 此时, spring.profiles.active=prod

logback-spring.xml简单完整示例

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty name="appName" scope="context" source="spring.application.name"/>
    <springProperty name="logFileDir" scope="context" source="logback.logFileDir" defaultValue="./logs/${appName}"/>
    <springProperty name="elkLogFileDir" scope="context" source="logback.elkLogFileDir" defaultValue="./logs/elk-log"/>
    <springProperty name="maxFileSize" scope="context" source="logback.maxFileSize" defaultValue="50MB"/>
    <springProperty name="maxHistoryDay" scope="context" source="logback.maxHistoryDay" defaultValue="7"/>
    <springProperty name="serverPort" scope="context" source="server.port" defaultValue="0000"/>

    <property name="pattern"
              value="${appName}:${serverPort} %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%X{traceId}] %thread %logger{50}:%L %msg%n"/>

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${pattern}</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>
    </appender>

    <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logFileDir}/${appName}.log</file>
        <encoder>
            <pattern>${pattern}</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${logFileDir}/${appName}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>${maxHistoryDay}</MaxHistory>
            <MaxFileSize>${maxFileSize}</MaxFileSize>
        </rollingPolicy>
    </appender>

    <!-- 多环境定制logger配置 -->
    <springProfile name="dev-kuoyi">
        <appender name="elkEventAppender" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>47.105.39.189:5044</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
                <customFields>{"elk_data_type": "listen_data"}</customFields>
            </encoder>
        </appender>

        <appender name="elkAppender" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>47.105.39.189:5044</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
                <customFields>{"elk_data_type": "all_data"}</customFields>
            </encoder>
        </appender>

        <logger name="com.ultronsoft.port.acs.visitor.util.statics.ElkEventLogger" level="INFO" addtivity="false">
            <appender-ref ref="elkEventAppender"/>
        </logger>

        <root level="INFO">
            <appender-ref ref="consoleAppender"/>
            <appender-ref ref="fileAppender"/>
            <appender-ref ref="elkAppender"/>
        </root>
    </springProfile>

    <springProfile name="dev-qishi">
        <root level="INFO">
            <appender-ref ref="consoleAppender"/>
            <appender-ref ref="fileAppender"/>
        </root>
    </springProfile>

    <springProfile name="test">
        <root level="INFO">
            <appender-ref ref="consoleAppender"/>
            <appender-ref ref="fileAppender"/>
        </root>
    </springProfile>

    <springProfile name="prod">
        <appender name="elkEventAppender" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>127.0.0.1:5044</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
                <customFields>{"elk_data_type": "listen_data"}</customFields>
            </encoder>
        </appender>

        <appender name="elkAppender" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>127.0.0.1:5044</destination>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
                <customFields>{"elk_data_type": "all_data"}</customFields>
            </encoder>
        </appender>

        <logger name="com.ultronsoft.port.acs.visitor.util.statics.ElkEventLogger" level="INFO" addtivity="false">
            <appender-ref ref="elkEventAppender"/>
        </logger>

        <root level="INFO">
            <appender-ref ref="consoleAppender"/>
            <appender-ref ref="fileAppender"/>
            <appender-ref ref="elkAppender"/>
        </root>
    </springProfile>
    
</configuration>
1
https://gitee.com/lihe01/notebook.git
git@gitee.com:lihe01/notebook.git
lihe01
notebook
notebook
master

搜索帮助