티스토리 뷰

회사에서 늘 로그를 보면서 작업하다가 막상 개인프로젝트를 하려니 로그가 없어 불편해서 이리저리 알아보면서 만들어봤다

 

목표는 내가 들어간 클래스들이 나오고 SQL문이 나오느냐 정도로 찾았던거 같다

 

먼저 POM.XML에 태그들을 넣어준다.

 

		<!-- logging --> 
		<dependency> 
			<groupId>org.slf4j</groupId> 
			<artifactId>slf4j-api</artifactId> 
			<version>${slf4j.version}</version> 
		</dependency> 
		<dependency> 
			<groupId>org.slf4j</groupId> 
			<artifactId>jcl-over-slf4j</artifactId> 
			<version>${slf4j.version}</version> 
		<scope>runtime</scope> </dependency> 
		<dependency> 
			<groupId>org.slf4j</groupId> 
			<artifactId>slf4j-log4j12</artifactId> 
			<version>${slf4j.version}</version>
		 	<scope>runtime</scope> </dependency> 
		<dependency> 
		 	<groupId>org.apache.logging.log4j</groupId> 
		 	<artifactId>log4j-core</artifactId> 
		 	<version>${log4j.version}</version> 
		</dependency>
		
		
		<!-- https://mvnrepository.com/artifact/aspectj/aspectjrt -->
		<dependency>
		    <groupId>aspectj</groupId>
		    <artifactId>aspectjrt</artifactId>
		    <version>1.5.3</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
		<dependency>
		    <groupId>org.aspectj</groupId>
		    <artifactId>aspectjweaver</artifactId>
		    <version>1.9.6</version>
		    <scope>runtime</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjtools -->
		<dependency>
		    <groupId>org.aspectj</groupId>
		    <artifactId>aspectjtools</artifactId>
		    <version>1.8.9</version>
		</dependency>

일단 slf4j는 뭐 log4j를 확장해서 쓰는 개념? 이라고 읽은거 같은데 사실 자세한 것은 모르겠고, log4j가 프로퍼티나 xml개념을 잡아주고 slf4j는 자바단에서 실제로 사용하게 되는 애들을 불러와서 사용하는 느낌이었다

 

aspectj는 AOP로 일일히 클래스마다 LOGGER를 남기는게 아닌 하나의 클래스를 만들어서 클래스에 컴포넌트형식으로 불러와 간단하게 사용하는 방식이다.

 

main/resouces 안에 log4j.xml 을 남긴다

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOG4J//DTD LOG4J//EN" "https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd" >
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
 
  <appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out"/>
    <layout class="org.apache.log4j.PatternLayout">
    	<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    </layout>
  </appender>
	
	<logger name="com.pauselaboffice">
		<level value="info"></level>
	</logger>
		<logger name="org.springframework.core">
		<level value="info"></level>
	</logger>
		<logger name="org.springframework.context">
		<level value="info"></level>
	</logger>
	<logger name="org.springframework.beans">
		<level value="info"></level>
	</logger>
	<logger name="org.springframework.web">
		<level value="info"></level>
	</logger>
	<!-- 기본 로그 레벨 -->
	<root>
		<priority value="debug" />
		<appender-ref ref="console"/>
	</root>
</log4j:configuration>

 

같은 폴더안에 log4jdbc.log4j2.properties 파일을 만들어준다

 

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

log4jdbc.dump.sql.maxlinelength=0

간단히 남겨준후

 

사용하면되는데 log4j.xml에 기본로그레벨 부분에 debug는 개발 모드로써 이게 sql문을 보여주는것 같다 실은

root-context에서 datasource를 잡는 부분에

 

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url"
            value="jdbc:mysql://127.0.0.1:3306/pauselab?useSSL=false&amp;serverTimezone=UTC">
        </property>
        <property name="username" value="pauselab"></property>
        <property name="password" value="eastdoor"></property>
    </bean>     
<!--       <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    	<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
        <property name="url" value="jdbc:log4jdbc:mysql://127.0.0.1:3306/pauselab?useSSL=false&amp;serverTimezone=UTC" />
		<property name="username" value="pauselab"></property>
        <property name="password" value="eastdoor"></property>
    </bean>  -->

이 부분을 사용중인데 아래에 jdbc:log4jdbc:mysql 부분과 driverClassName을 사용함으로써 더 명확히 볼 수 있지만

현재로 충분하기에 사용하지 않았다. 그리고 어쩐지 계속 driverclass를 못찾는다는 오류가 나서.. 일단은 급하니 사용할 정도로만 사용하기로 했고

 

이후에

package com.pauselaboffice.common.log;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class LoggingAdvice {

	private static final Logger logger = LoggerFactory.getLogger(LoggingAdvice.class);
	
	
	@Before("execution(* com.pauselaboffice.*.admin.*.*(..)) or"
			+ "execution(* com.pauselaboffice.*.*.*(..))")
	public void startLog(JoinPoint jp) {
		
		logger.info("----------------------------------");
		logger.info("----------------------------------");
		
		// 전달되는 모든 파라미터들을 Object의 배열로 가져옵니다.
		logger.info("1:" + Arrays.toString(jp.getArgs()));
		
		// 해당 Advice의 타입을 알아냅니다.
		logger.info("2:" + jp.getKind());
		
		// 실행하는 대상 객체의 메소드에 대한 정보를 알아낼 때 사용합니다.
		logger.info("3:" + jp.getSignature().getName());
		
		//target 객체를 알아낼 때 사용합니다
		logger.info("4:" + jp.getTarget().toString());
		
		//Advice를 행하는 객체를 알아낼 때 사용합니다
		logger.info("5:" + jp.getThis().toString());
	}
	
	//@After("execution(* com.pauselaboffice.*.admin(..)) or"
	//		+ "execution(* com.pauselaboffice.*(..))")
	public void after(JoinPoint jp) {
		
		logger.info("----------------------------------");
		logger.info("----------------------------------");
		
		// 전달되는 모든 파라미터들을 Object의 배열로 가져옵니다.
		logger.info("1:" + Arrays.toString(jp.getArgs()));
		
		// 해당 Advice의 타입을 알아냅니다.
		logger.info("2:" + jp.getKind());
		
		// 실행하는 대상 객체의 메소드에 대한 정보를 알아낼 때 사용합니다.
		logger.info("3:" + jp.getSignature().getName());
		
		//target 객체를 알아낼 때 사용합니다
		logger.info("4:" + jp.getTarget().toString());
		
		//Advice를 행하는 객체를 알아낼 때 사용합니다
		logger.info("5:" + jp.getThis().toString());
	}
	
	//@After("execution(* com.pauselaboffice.*.admin(..)) or"
	//		+ "execution(* com.pauselaboffice.*(..))")
	public Object timeLog(ProceedingJoinPoint pjp) throws Throwable {
		long startTime = System.currentTimeMillis();
		logger.info(Arrays.toString(pjp.getArgs()));
		
		//실제 타겟을 실행하는 부분이다. 이 부분이 없으면 advice가 적용된 메소드가 동작하지 않습니다.
		Object result = pjp.proceed();
		
		long endTime = System.currentTimeMillis();
		//target 메소드의 동작 시간을 출력한다.
		
		logger.info(pjp.getSignature().getName() + " : " + (endTime - startTime));
		return result;
	}
}

이렇게 로그를 위한 클래스를 만들어주면 된다. 나는 before정도로 사용하는게 좋았고

com.pause..부분에 경로는 뒤쪽에 확장자부분 .java가 될 부분까지도 *로 표시를 해줘야 돌아갔다

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함