에러 로그를 웹을 통해 확인 할 때 스프링 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>
'java' 카테고리의 다른 글
java 덤프 생성 및 실행중인 jvm 메모리 확인 (0) | 2017.03.28 |
---|---|
java servlet api tomcat 버전 차이 및 web.xml 배포 선언문 (0) | 2017.03.06 |
java jdk 1.8 부터 나온 date 사용방법 (0) | 2016.12.09 |
java 특수문자 (디렉토리 변경 공격) ../ 치환 (0) | 2016.11.01 |
자바 문자열 비교 3가지 (0) | 2016.09.28 |