복붙노트

[SPRING] 스프링 부트 로그백 DB 애 퍼더 속성

SPRING

스프링 부트 로그백 DB 애 퍼더 속성

안녕 내 봄 부팅 응용 프로그램 DBAppenderin을 사용하고 싶습니다. application.properties 파일에서 데이터베이스 연결 속성을 검색하고 싶습니다. 그러나 그것은 그들을 인식하는 것 같지 않습니다. Spring boot 1.2.x를 사용하고 있으므로 logback-spring.xml을 아직 사용할 수 없다는 점에 유의하십시오.

내가 사용하고있는 구성은 다음과 같습니다.

<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">

            <driverClass>${spring.datasource.driver-class-name}</driverClass>
            <url>${spring.datasource.url}</url>
            <user>${spring.datasource.username}</user>
            <password>${spring.datasource.password}</password>
        </connectionSource>
    </appender>

해결법

  1. ==============================

    1.비슷한 해결책을 찾고있는 동안 이것에 비틀 거렸다. 아직 답변이 없으므로 다음과 같은 몇 가지 접근 방법이 있습니다.

    비슷한 해결책을 찾고있는 동안 이것에 비틀 거렸다. 아직 답변이 없으므로 다음과 같은 몇 가지 접근 방법이 있습니다.

    1) Spring Boot 1.3 이상을 사용하고 있다면 (나중에 참조할만한 것이 아니라는 것을 이미 지적 했음), 태그를 사용하여 application.properties에서 동일한 값을 재사용 할 수있었습니다.

    application.properties (임베디드 H2 DB 용) :

    spring.datasource.driverClassName=org.h2.Driver
    spring.datasource.url=jdbc:h2:mem:testdb
    spring.datasource.username=sa
    spring.datasource.password=
    

    logback-spring.xml :

    <springProperty name="spring.datasource.driverClassName" source="spring.datasource.driverClassName"/>
    <springProperty name="spring.datasource.url" source="spring.datasource.url"/>
    <springProperty name="spring.datasource.username" source="spring.datasource.username"/>
    <springProperty name="spring.datasource.password" source="spring.datasource.password"/>
    
    <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
            <driverClass>${spring.datasource.driverClassName}</driverClass>
            <url>${spring.datasource.url}</url>
            <user>${spring.datasource.username}</user>
            <password>${spring.datasource.password}</password>
        </connectionSource>
    </appender>
    

    2) 속성 소스로 응용 프로그램 속성 가져 오기 : logback.xml에 Spring 속성 자리 표시자를 사용할 수 없습니다.

    <property resource="application.properties" />
    

    3) 컨테이너 JNDI에 데이터 소스를 등록하고 대신 logback의 JNDIConnectionSource를 사용할 수 있습니까? 이 다른 게시물을 확인하십시오 : Embedded Tomcat Container로 Spring 부트에서 JNDI 컨텍스트를 만드는 방법

  2. ==============================

    2.그래서 jpt의 대답을 upvote하십시오. 왜냐하면 "

    그래서 jpt의 대답을 upvote하십시오. 왜냐하면 "

    "(또는 그 대답의 속성들), 나는 아무것도 할 일이 없을 것입니다.

    하지만 내 대답과 공헌 : 나는 또한 application.yml 함께 작동합니다 추가 싶었어요.

    나는 여기서 한 모든 것을 열거하려고 노력할 것이다.

    3 개의 환경 변수를 설정하십시오.

    SPRING_DATASOURCE_URL
    SPRING_DATASOURCE_USER
    SPRING_DATASOURCE_PASSWORD
    

    application.yml의 내용 (아래)

    spring:
      datasource:
        #SPRING_DATASOURCE_URL environment variable will be something like -> jdbc:sqlserver://MySqlServer\\MyInstance:1433;DatabaseName=MyDbName;
        url: ${SPRING_DATASOURCE_URL}
        username: ${SPRING_DATASOURCE_USERNAME}
        password: ${SPRING_DATASOURCE_PASSWORD}
        driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
    logging:
        config: classpath:logback-spring.xml
    

    참고로, "logback-spring.xml"파일을 사용하고 있습니다. 차이점이 있는지 확실하지 않습니다 ( "logback.xml"을 사용하는 것과 반대).

    logback-spring.xml의 내용 (아래)

    <configuration debug="true" scan="true" scanPeriod="30 seconds">
    
    
        <appender name="STDOUT" 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.SSS} [%thread] %-5level %logger{36} [%file:%line] %msg%n</pattern>
            </encoder>
        </appender>
    
    
    
        <!-- THIS IS THE MAGIC LINE that JPT figured out -->
        <property resource="application.yml" />
    
        <springProperty name="humptydumptyurl" source="spring.datasource.url"/>
        <springProperty name="humptydumptyusername" source="spring.datasource.username"/>
        <springProperty name="humptydumptypassword" source="spring.datasource.password"/>
    
    
        <appender name = "MyDbAppender" class="ch.qos.logback.classic.db.DBAppender">
            <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
                <driverClass>com.microsoft.sqlserver.jdbc.SQLServerDriver</driverClass>
                <url>${humptydumptyurl}</url>
                <user>${humptydumptyusername}</user>
                <password>${humptydumptypassword}</password>
            </connectionSource>
        </appender>
    
    
    
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="MyDbAppender"/>
        </root>
    
    </configuration>
    

    참고, 나는 모호함을 피하기 위해 의도적으로 "humptydumpty"를 사용했습니다. 아마 더 나은 접두어를 사용 하겠지만, 매핑의 왼쪽면에 원하는 이름을 붙일 수 있습니다.

    참고로, 내 application.properties 파일은 비어 있습니다. 저는 100 % application.yml입니다.

    참고로, 네 번째 환경 변수를 설정 / 사용할 수도 있습니다 (필자는 아직 작동하지 않을 것입니다)

    그리고 그 두 친구

    datasource:
        driverClassName: ${SPRING_DATASOURCE_DRIVER-CLASS-NAME}
    

      <springProperty name="humptydumptydriverclassname" source="spring.datasource.driver-class-name"/>
    

    ......

    아래의 몇 가지 mssql-server 노트 (아마 대부분의 사용자에게는 중요하지 않음)

    나는 사용했다.

            <dependency>
                <groupId>com.microsoft.sqlserver</groupId>
                <artifactId>mssql-jdbc</artifactId>
                <version>7.0.0.jre8</version>
            </dependency>
    

    그리고 그것을 작동 시켰습니다.

    INSERT에서 "truncate"오류가 발생했기 때문에 DDL을 약간 수정해야했습니다.

    -- This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender
    -- 
    -- The event_id column type was recently changed from INT to DECIMAL(40)
    -- without testing.
    
    DROP TABLE logging_event_property 
    DROP TABLE logging_event_exception 
    DROP TABLE logging_event 
    
    CREATE TABLE logging_event 
      ( 
        timestmp         DECIMAL(20) NOT NULL,
        formatted_message  VARCHAR(max) NOT NULL,
        logger_name       VARCHAR(512) NOT NULL,
        level_string      VARCHAR(512) NOT NULL,
        thread_name       VARCHAR(512),
        reference_flag    SMALLINT,
        arg0              VARCHAR(512),
        arg1              VARCHAR(512),
        arg2              VARCHAR(512),
        arg3              VARCHAR(512),
        caller_filename   VARCHAR(512) NOT NULL,
        caller_class      VARCHAR(512) NOT NULL,
        caller_method     VARCHAR(512) NOT NULL,
        caller_line       CHAR(16) NOT NULL,
        event_id          DECIMAL(38) NOT NULL identity,
        PRIMARY KEY(event_id) 
      ) 
    
    CREATE TABLE logging_event_property 
      ( 
        event_id          DECIMAL(38) NOT NULL, 
        mapped_key        VARCHAR(512) NOT NULL, 
        mapped_value      VARCHAR(1024), 
        PRIMARY KEY(event_id, mapped_key), 
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id) 
      ) 
    
    CREATE TABLE logging_event_exception 
      ( 
        event_id         DECIMAL(38) NOT NULL, 
        i                SMALLINT NOT NULL, 
        trace_line       VARCHAR(512) NOT NULL, 
        PRIMARY KEY(event_id, i), 
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id) 
      ) 
    

    마지막으로, 가장 중요한 디버그 힌트를 알려 드리겠습니다.

    하드 코드 연결 문자열 값을 먼저 설정하고 작동 시키십시오. 그런 다음 환경 변수 대체를 시작합니다.

    ch.qos.logback.classic.db.DBAppender는 "확인"을하기 위해 정상적으로 작동하는 연결 문자열을 가지고 있어야합니다 ..... 잘못된 연결 문자열을 넣으면이 오류가 발생합니다 (아래) . 나는 아래의 오류를 쫓고 있기 때문에 발생한 오류를 쫓아 다니는 데 4 시간을 보냈다. 왜냐하면 단순히 연결 문자열이 올바르게 작동하지 않았기 때문이다. 다시 한번 logback-spring.xml에 정확한 값 / 작업 값을 하드 코딩하고, 작동 시키십시오. 그런 다음 다시 돌아 서서 환경 변수가되는 스프링 속성 대체 부두를 만드십시오.

    그래서 db-appender를 위해 URL, 사용자 이름, 암호를 먼저 하드 코드하여 작동 시키십시오. 그런 다음 천천히 대체 작업을 시작합니다 ... 모든 대체 작업이 작동하지 않는다는 것을 깨닫기 전에 너무 오래 오류를 쫓았습니다. ..

    06:19:09,721 |-WARN in ch.qos.logback.classic.db.DBAppender[MyDbAppender] - Attempted to append to non started appender [MyDbAppender].
        at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:202)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
        at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:75)
        at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
        at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:347)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:306)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
    Caused by: java.lang.IllegalStateException: Logback configuration error detected: 
    ERROR in ch.qos.logback.core.joran.spi.Interpreter@68:16 - RuntimeException in Action for tag [appender] java.lang.IllegalStateException: DBAppender cannot function if the JDBC driver does not support getGeneratedKeys method *and* without a specific SQL dialect
        at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:169)
        at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithSpecificConfig(AbstractLoggingSystem.java:67)
        at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:57)
        at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:117)
        at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:298)
    

    그리고 모든 것을 다 정리해야합니다.

    다음과 같은 로그백 버전이 있습니다.

            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.3</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.2.3</version>
            </dependency>
    
  3. from https://stackoverflow.com/questions/33186668/spring-boot-logback-db-appender-properties by cc-by-sa and MIT license