2011-10-05 4 views
2

logback에서 dbAppender를 사용하여 데이터를 쓰는 테이블을 변경하는 방법이 있습니까? dbAppender를 사용하기 전에 만들어야하는 세 개의 기본 테이블이 있지만이 테이블을 하나의 테이블에 작성하도록 사용자 지정하고 싶습니다. 내 선택. 로그를 데이터베이스에 삽입 할 때 실행되는 SQL을 지정할 수있는 Log4J와 비슷한 점이 있습니다.Logback dbAppender 사용자 지정 SQL

+0

[DBAppender - 기본 테이블 이름을 변경하는 방법?] (http://stackoverflow.com/questions/4690381)/dbappender-how-to-change-default-table-names) –

답변

0

당신은 ch.qos.logback.classic.db.names.DBNameResolver를 구현하고 구성에서 사용해야합니다

<appender name="DB" class="ch.qos.logback.classic.db.DBAppender"> 
    <dbNameResolver class="com.example.MyDBNameResolver"/> 
    <!-- ... --> 
</appender> 
+0

안녕하세요, 답변 주셔서 감사합니다. 구현 된 예제가 어디에 있는지 알고 있습니까? DBNameresolver를 구현했습니다. 그들이 돌아온다. – Magezy

+0

기본적으로이 클래스는'ch.qos.logback.classic.db.names.ColumnName'의 인스턴스를 취하여 각 열거 형 값의 이름을 반환합니다. Logback 배포에서 두 가지 구현을 살펴보십시오. 이 기능을 문서화하려면 문제를 제기하십시오. –

3

토마스, 어쩌면 내가 뭔가를 놓친 해요하지만 난 그냥 사용자 정의 DBNameResolver를 사용하여 Magezy이 무엇을 요구에 대한 해답이 될 수 표시되지 않습니다 . DBNameResolver는 SQLBuilder를 통해 DBAppender에서 3 개의 SQL 삽입 쿼리를 생성하는 데 사용됩니다. - DBNameResolve를 통해 데이터가 삽입되는 테이블과 컬럼의 이름에만 영향을 미칠 수 있지만 한 테이블에만 삽입하는 것을 제한 할 수는 없습니다. 실제로 삽입되는 것을 제어 할 수단이 없습니다.

log4j의 JDBCAppender IMO와 일치 시키려면 logback의 DBAppender 또는 DBAppenderBase를 확장해야하거나 완전히 새로운 사용자 정의 Appender를 구현해야 할 수도 있습니다.

1

나를 위해 가장 쉬운 방법은 처음부터 appender를 만드는 것이 었습니다. 스프링 JDBC를 사용하여 하나의 테이블에 추가하고 있습니다. 그것은 이런 식으로 작동합니다 :

public class MyAppender extends AppenderBase<ILoggingEvent> 
{ 
    private String _jndiLocation; 
    private JDBCTemplate _jt; 

    public void setJndiLocation(String jndiLocation) 
    { 
    _jndiLocation = jndiLocation; 
    } 

    @Override 
    public void start() 
    { 
    super.start(); 

    if (_jndiLocation == null) 
    { 
     throw new IllegalStateException("Must have the JNDI location"); 
    } 
    DataSource ds; 
    Context ctx; 
    try 
    { 
     ctx = new InitialContext(); 
     Object obj = ctx.lookup(_jndiLocation); 
     ds= (DataSource) obj; 

     if (ds == null) 
     { 
     throw new IllegalStateException("Failed to obtain data source"); 
     } 
     _jt = new JDBCTemplate(ds); 
    } 
    catch (Exception ex) 
    { 
     throw new IllegalStateException("Unable to obtain data source", ex); 
    } 

    } 

    @Override 
    protected void append(ILoggingEvent e) 
    { 
    // log to database here using my JDBCTemplate instance 
    } 
} 

내가 SLF4J에 문제로 실행 - 대체 로거 오류가 여기에 설명 : http://www.slf4j.org/codes.html#substituteLogger

This thread on multi-step configuration 그 문제를 해결하기 위해 나를 수 있었다.

1

Java MyDbAppender에는 setter가있는 문자열 jndiLocation이 있어야합니다. 이제 jndi 조회를 수행하십시오 (해결책은 10 월 17 일 16:03에 응답 함 참조)

관련 문제