java

log4j2 xml 이용 db에 에러 로그 쌓기 databaseAppender JDBCAppender

초이짬 2016. 12. 14. 07:48
728x90

에러 로그를 웹을 통해 확인 할 때 스프링 aop 를 이용해서 사용해도 된다.


====추가====

특정 사이트에서 해당 설정으로 로그가 쌓이지 않는 경우가

존재 했다. 로그를 log.error 를 이용해서 명시 하지 않으면 쌓이지가 않았다.

해당 경우는 aop 를 이용해서(전자정부에서 익셉션 aop 방식사용) 원하는

class 에서 위임받은뒤 log.errro로 해당 로그를 쌓으니 디비에 적재가 되었다.

그 방법 외에 따로 log4j 를 이용해서 쌓는 방법도 존재 하기에 아래에 설명한다.

db는 db2를 사용했다.


기본으로 log4j2를 이용하고


log4j의 자세한 설정은 아래 사이트 참고

https://logging.apache.org/log4j/2.x/manual/appenders.html


필요라이브러리는 아래와 같다.

pom.xml 에 아래 내용 추가


  <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
  <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/commons-pool/commons-pool -->
  <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>1.6</version>
  </dependency>


---db connection factory  ConnectionFactory.java 생성-------------


package sample.common;


import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnection;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.impl.GenericObjectPool;

public class ConnectionFactory {
    private static interface Singleton {
        final ConnectionFactory INSTANCE = new ConnectionFactory();
    }

    private final DataSource dataSource;

    private ConnectionFactory() {
        Properties properties = new Properties();
        properties.setProperty("user", "user");
        properties.setProperty("password", "pwd"); // or get properties from some configuration file
//        properties.setProperty("driverClassName", "com.ibm.db2.jcc.DB2Driver");

        try {
   loadDriver("com.ibm.db2.jcc.DB2Driver");
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

        GenericObjectPool<PoolableConnection> pool = new GenericObjectPool<PoolableConnection>();
        DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
                "jdbc:db2://localhost:50001/sample", properties
        );
        new PoolableConnectionFactory(
                connectionFactory, pool, null, "SELECT 1", 3, false, false, Connection.TRANSACTION_READ_COMMITTED
        );

        this.dataSource = new PoolingDataSource(pool);
    }

    public static Connection getDatabaseConnection() throws SQLException {
        return Singleton.INSTANCE.dataSource.getConnection();
    }

    private static void loadDriver(String driver)
            throws SQLException
        {
            try
            {
                Class.forName(driver).newInstance();
            }
            catch(Exception e)
            {
                throw new SQLException("Unable to load driver: " + driver);
            }
        }

}



-------------log4j2.xml-------------

아래 설정중 테이블의 string data 인서트는 isUnicode="false" 이 옵션을 안 줄 경우 setString 에러를

db2에서는 뱉어낸다. 타 데이터베이스는 설명에 없이도 된다고 하니 참고.



<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">

<!-- Author: Crunchify.com -->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
</Console>

<!-- <RollingFile name="RollingFile" filename="log/CrunchifyTest.log"
filepattern="${logPath}/%d{YYYYMMddHHmmss}-fargo.log">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
<Policies>
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile> -->

<JDBC name="databaseAppender" tableName="DB2COM.LOGGING_ERROR" >
<ConnectionFactory class="sample.common.ConnectionFactory" method="getDatabaseConnection" />
<!-- <Column name="EVENT_ID" literal="LOGGING.APPLICATION_LOG_SEQUENCE.NEXTVAL" /> -->
<Column name="LOG_DATE" isEventTimestamp="true" />
<Column name="LOG_LEVEL" pattern="%level" isUnicode="false"/>
<Column name="LOCATION" pattern="%logger" isUnicode="false"/>
<Column name="MESSAGE" pattern="%message" isUnicode="false"/>
<Column name="THROWABLE" pattern="%throwable{short}" isUnicode="false"/>
</JDBC>

</Appenders>
<Loggers>
<Root level="info">
<!-- <Root level="FATAL"> -->
<AppenderRef ref="Console" />
<!-- <AppenderRef ref="RollingFile" /> -->
</Root>

  <Logger name="java.sql" level="DEBUG" additivity="false">
<AppenderRef ref="Console" />
</Logger>
<Logger name="egovframework" level="DEBUG" additivity="false">
<AppenderRef ref="Console" />
</Logger>
<!-- log SQL with timing information, post execution -->
<Logger name="jdbc.sqltiming" level="DEBUG" additivity="false">
<AppenderRef ref="Console" />
</Logger>

<Logger name="sample.common" level="error" additivity="false">
<AppenderRef ref="Console" />
<appender-ref ref="databaseAppender"/>
</Logger>

  <Logger name="java.sql.ResultSet" level="DEBUG" additivity="false" >
<AppenderRef ref="Console" />
</Logger>

</Loggers>
</Configuration>

728x90