当前位置: 首页 > 知识库问答 >
问题:

在代码之外将配置和日志记录外部化

司徒杜吟
2023-03-14

我有Spring Boot应用程序在Gradle与Liquibase变更集。

此代码是多模块应用程序,在六边形体系结构中具有大约四个模块。

并且对于医生数据部署模块,资源文件夹结构如下所示:

我的问题是我想把配置和日志文件放在代码之外,我怎么能从代码中外部化这些文件。

我想以2种方式运行代码,如下所示:

>

  • 我想将我的代码作为 Jar 文件运行,并希望在运行 jar 时传递这些配置和日志回传文件,例如.java -Dspring.profiles.active=本地 -jar 医生-0.1.0-快照.jar -Dlogback-配置文件=日志备份.xml -多瑟-配置文件=应用程序.yml

    不确定它的确切语法是什么?

    如果我将config和logback文件都外部化,如果我通过点击intelliJ中的run按钮运行spring boot应用程序,我如何在我的coode中传递这些属性呢?

    下面是我的申请yml文件

    server:
      tomcat:
        connectionTimeout: 300000
    management:
      endpoint:
        mappings:
          enabled: true
    spring:
      liquibase:
        change-log: classpath:/db/changelog/db.changelog-master.xml
      datasource:
        driver-class-name: oracle.jdbc.driver.OracleDriver
        hikari:
          minimum-idle: 5
          maximumPoolSize: 20
          idleTimeout: 30000
          maxLifetime: 2000000
          connectionTimeout: 30000
          poolName: data-pool
      jpa:
        hibernate:
          use-new-id-generator-mappings: false
          ddl-auto: none
        database-platform: org.hibernate.dialect.Oracle12cDialect
      quartz:
        job-store-type: jdbc
        jdbc:
          initialize-schema: never
        properties:
          org:
            quartz:
              scheduler:
                instanceId: AUTO
              jobStore:
                class: org.quartz.impl.jdbcjobstore.JobStoreTX
                driverDelegateClass: org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
                useProperties: false
                misfireThreshold: 60000
                clusterCheckinInterval: 5000
                isClustered: true
              threadPool:
                class: org.quartz.simpl.SimpleThreadPool
                threadCount: 10
                threadPriority: 5
                threadsInheritContextClassLoaderOfInitializingThread: true
    

    下面是我的logback-spring.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration>
    <configuration>
    
        <springProperty scope="context" name="app_name" source="spring.application.name"/>
        <springProperty scope="context" name="environment" source="param_env" defaultValue="default_env"/>
        <springProperty scope="context" name="tenant" source="param_tenant" defaultValue="default_tenant"/>
    
        <property name="GENERIC_PATTERN"
                  value="[%date{ISO8601}] [%p] [%t] [%X{traceId:-}] [%X{orderId:-}] [%X{batchJobId:-}] [%X{username:-}] [%X{functional-context}] [%c{2}] %4L | %m%n"/>
        <property name="CONSOLE_LOG_PATTERN" value="$GENERIC_PATTERN"/>
        <property name="CHARSET" value="UTF-8"/>
    
        <property name="LOG_DIR"
                  value="logs/${envname:-${environment}}/${param_dtlogname:-${app_name}}"/>
    
        <logger name="org.springframework" level="INFO"/>
        <logger name="org.springframework.web" level="INFO"/>
        <logger name="org.dt" level="INFO"/>
        <logger name="com.dt" level="INFO"/>
    
        <logger name="org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"
                level="INFO"/>
    
        <logger name="org.springframework.security" level="INFO"/>
        <logger name="org.hibernate" level="INFO"/>
    
        <!-- Auto configuration report-->
        <logger name="org.springframework.boot.autoconfigure" level="DEBUG"/>
        <logger name="org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener"
                level="TRACE"/>
    
        <springProfile name="local,component-test,component-test-security,scheduler-test">
    
            <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <charset>${CHARSET}</charset>
                    <pattern>${GENERIC_PATTERN}</pattern>
                </encoder>
            </appender>
    
            <logger name="zuul.web.request.logger" level="DEBUG" additivity="false">
                <appender-ref ref="CONSOLE"/>
            </logger>
    
            <root level="INFO">
                <appender-ref ref="CONSOLE"/>
            </root>
    
        </springProfile>
    
    
            <appender name="FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
                <file>${LOG_DIR}/${param_dtlogname}-${HOSTNAME}.log</file>
    
                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                    <!-- daily rollover -->
                    <fileNamePattern>
                        ${LOG_DIR}/${param_dtlogname}-${HOSTNAME}.%d{yyyy-MM-dd}.%i.log
                    </fileNamePattern>
                    <maxFileSize>1GB</maxFileSize>
                    <totalSizeCap>10GB</totalSizeCap>
                    <!-- keep 30 days worth of history -->
                    <maxHistory>30</maxHistory>
                </rollingPolicy>
    
                <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
                    <providers>
                        <mdc/>
                        <pattern>
                            <omitEmptyFields>true</omitEmptyFields>
                            <pattern>
                                {
                                "app_name": "${app_name}",
                                "HOSTNAME":"${HOSTNAME}",
                                "environment":"${environment}"
                                }
                            </pattern>
                        </pattern>
                        <logLevel/>
                        <timestamp/>
                        <threadName/>
                        <logstashMarkers/>
                        <tags/>
                        <arguments/>
                        <version/>
                        <stackTrace/>
                        <loggerName/>
                        <threadName/>
                        <message/>
                    </providers>
                </encoder>
            </appender>
    
            <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <charset>${CHARSET}</charset>
                    <pattern>${GENERIC_PATTERN}</pattern>
                </encoder>
            </appender>
    
            <appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender">
                <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                    <fieldNames>
                        <timestamp>timestamp</timestamp>
                        <message>logdata</message>
                        <version>[ignore]</version>
                        <levelValue>[ignore]</levelValue>
                    </fieldNames>
                    <timeZone>UTC</timeZone>
                </encoder>
            </appender>
    
            <appender name="API_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
                <file>${LOG_DIR}/api-${param_dtlogname}-${HOSTNAME}.log</file>
                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                    <!-- daily rollover -->
                    <fileNamePattern>
                        ${LOG_DIR}/api-${param_dtlogname}-${HOSTNAME}.%d{yyyy-MM-dd}.%i.log
                    </fileNamePattern>
                    <maxFileSize>1GB</maxFileSize>
                    <totalSizeCap>10GB</totalSizeCap>
                    <!-- keep 30 days worth of history -->
                    <maxHistory>30</maxHistory>
                </rollingPolicy>
    
                <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                    <fieldNames>
                        <timestamp>[ignore]</timestamp>
                        <message>logdata</message>
                        <version>[ignore]</version>
                        <levelValue>[ignore]</levelValue>
                    </fieldNames>
                    <timeZone>UTC</timeZone>
                </encoder>
            </appender>
    
            <appender name="APPLICATION_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
                <file>${LOG_DIR}/startup-${param_dtlogname}-${HOSTNAME}.log</file>
                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                    <!-- daily rollover -->
                    <fileNamePattern>
                        ${LOG_DIR}/startup-${param_dtlogname}-${HOSTNAME}.%d{yyyy-MM-dd}.%i.log
                    </fileNamePattern>
                    <maxFileSize>1GB</maxFileSize>
                    <totalSizeCap>10GB</totalSizeCap>
                    <!-- keep 30 days worth of history -->
                    <maxHistory>30</maxHistory>
                </rollingPolicy>
    
                <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                    <fieldNames>
                        <timestamp>timestamp</timestamp>
                        <message>logdata</message>
                        <version>[ignore]</version>
                        <levelValue>[ignore]</levelValue>
                    </fieldNames>
                    <timeZone>UTC</timeZone>
                </encoder>
            </appender>
    
            <logger name="api.logger" level="INFO" additivity="false">
                <appender-ref ref="API_FILE_APPENDER"/>
            </logger>
    
            <logger name="application.startup.logger" level="INFO" additivity="false">
                <appender-ref ref="APPLICATION_FILE_APPENDER"/>
            </logger>
    
            <appender name="SENTRY" class="io.sentry.logback.SentryAppender">
                <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                    <level>ERROR</level>
                </filter>
                <encoder>
                    <pattern>${GENERIC_PATTERN}</pattern>
                </encoder>
            </appender>
    
            <root level="INFO">
                <appender-ref ref="CONSOLE"/>
                <appender-ref ref="FILE_APPENDER"/>
                <appender-ref ref="SENTRY"/>
            </root>
        </springProfile>
    </configuration>
    

    有人能帮忙吗?

  • 共有1个答案

    怀展
    2023-03-14

    < code >-spring . config . location 。

    更多信息请参考相关文档页面:https://docs . spring . io/spring-boot/docs/2 . 1 . 9 . release/reference/html/boot-features-external-config . html。

    至于回溯,你可能想试试这里提出的解决方案-Dlogback.configurationFile=日志回.xml运行Spring引导时被忽略。

    为了在IntelliJ中传递程序参数,只需转到运行/调试配置,选择所需的运行配置,并将所有参数放在“程序参数”文本字段中。

     类似资料:
    • 每当我部署一个外部化配置有错误的生产应用程序时,我都会在Tomcat日志中收到以下消息: 显然,外部化的配置是在log4j被正确初始化之前处理的,因此没有附加程序可以接受来自的消息。 有没有办法预先初始化log4j,以便在标准Grails log4j初始化发生之前捕获这些消息?

    • 我在两个问题上需要你的帮助: 我怎样才能使这两个特性得到满足呢? 感谢您的帮助:)

    • 更新:我添加了一个logback-spring.xml,它在嵌入式tomcat上运行良好,但在外部tomcat上就不行了(它不创建文件)

    • 目前,我正在与 log4j2.7 springframework 4.3。5; 冬眠5.2。三, 我通过一个xml文件配置log4j 为此,我创建了一些appender,其中一个名为“General”。我需要的是,所有日志都必须转到该appender(包括springframework或hibernate生成的日志),并且后者都不会打印在控制台上(我仍然需要其他类中的其他日志) 我试着写这些日志:

    • 我使用带有路由附加器和包装器的log4j2xml配置。我将传递不同的appender,以记录项目不同部分的不同文件。我的配置看起来像这样。 问题是,我在第二个路由中获得了外部库日志(那些没有附加程序的)和我的项目日志,尽管我只想要外部日志。

    • 我使用的是JBoss7,因为我在这个JBoss中部署的ear很少。StandalOne.xml已经使用以下日志记录配置进行了配置 然后我尝试将logging.properties文件添加到一个ear META-INF中,结果如预期的那样。再次,我想从那个logging.properties文件(我已经将其放置到ear之一的META-INF中)引用一个处理程序(在stanalone.xml中定义的M