logging
로그메세지를 소스 코드 안에 삽입하는 것은 디버깅을 위한 가방 단순 무식한 로깅방법
별도의 디버깅 툴이 제공되지 않는다면 이 방법이 최선의 방법일 수도 있다.
log4j
- JAVA를 위한 빠르고 유연한 로깅 프레임워크
- Log4j를 이용하면 프로그램 실행 시, 실행 코드의 수정없이 설정파일을 통해서 로깅 작업을 컨트롤 할 수 있다.
- Log4J의 특별한 기능 중 하나는 로거의 상속 개념의 사용이다.
- Logger 계층 구조를 이용하면 어떤 로그문을 출력할지 상세하게 컨트롤하기가 무척 쉬워진다.
Logger
- 로깅 정보를 캡쳐
- 로깅 메세지를 Appender에 전달
- log4J의 심장부에 위치
- 개발자가 직접 로그 출력 여부를 런타임에 조정
- logger는 로그 레벨을 가지고 있으며, 로그에 출력여부는 로그문의 레벨과 로거의 레벨을 가지고 결정
Appender
- 다양한 목적지로 로깅 정보를 출력
- 로그의 출력 위치를 결정(파일, 콘솔, DB 등)
- log4J API문서의 XXXAppender로 끝나는 클래스들의 이름을 보면, 출력 위치를 어느정도 짐작이 가능하다
ConsoleAppender, FileAppender, JDBCAppender, JMSAppender, SMTPAppender, socketAppender, SyslogAppender
layouts
로깅 정보를 위한 다양한 출력 포맷 구성
Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것인지 출력 layout을 결정
로그 레벨
우선 순위 : TRACE < DEBUG < INFO < WARN < ERROR < FATAL
DEBUG 레벨로 했다면 INFO~FATAL까지 모두 logging이 된다
Patten Conversion Characters
log4j.properties
# Root logger option
# 1. 로그 출력 Level은 INFO부터 할것임.
# 2. rootLogger 에 사용할 로깅 Appender로 stdout이라는것과
# logfile이라는 것 두가지를 사용하겠다
#log4j.rootLogger=debug, stdout, logfile
# stdout console출력
# logfile 로그파일로 출력
log4j.rootLogger=trace, stdout, logfile
# Direct log messages to stdout
# ConversionPattern은 로그가 어떠한 형식으로 출력될것인지
# 그 포맷을 정의하는 것.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p (%C{2}:%L) - %m%n
# Direct log message to log file
# logfile이라는 appender는 로그를 파일로 출력해주는 놈인데,
# 파일path를 정의 할 수 있다.
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
log4j.appender.logfile.File=D:/application.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %5p (%C{2} - %M:%L) - %m%n
log4j.appender.logfile.Append=true
# 기존에 있던 데이터 뒤에 내용을 추가시키는 것
[%d{yyyy-MM-dd HH:mm:ss}] | %5p | (%C{2} - %M:%L) | - %m%n |
[2024-05-27 10:51:24] | INFO | (basic.Log4jTest - main:18) | - 이 것은 log4j의 info레벨의 메세지 입니다 |
Log4jTest.java
package kr.or.ddit.basic;
import org.apache.log4j.Logger;
public class Log4jTest {
// Logger 클래스의 인스턴스를 받아온다
private static Logger logger = Logger.getLogger(Log4jTest.class);
public static void main(String[] args) {
// 로그 레벨별로 로그 메세지를 출력하는 방법
// 형식 ) Logger객체.로그레벨이름("출력할 메세지");
// 로그레벨 이름 ==> trace, debug, info, warn, error, fatal
logger.trace("이 메세지는 trace레벨의 메세지 입니다");
logger.debug("이 것은 debug레벨의 메세지 입니다");
logger.info("이 것은 log4j의 info레벨의 메세지 입니다");
logger.warn("이 것은 경고(warn)레벨의 메세지 입니다");
logger.error("이 것은 오류(error)레벨의 메세지 입니다");
logger.fatal("이 메세지는 심각한 오류 (fatal)레벨의 메세지 입니다");
}
}
결과
application.log
[2024-05-27 10:51:24] INFO (basic.Log4jTest - main:18) - 이 것은 log4j의 info레벨의 메세지 입니다
[2024-05-27 10:51:24] WARN (basic.Log4jTest - main:20) - 이 것은 경고(warn)레벨의 메세지 입니다
[2024-05-27 10:51:24] ERROR (basic.Log4jTest - main:22) - 이 것은 오류(error)레벨의 메세지 입니다
[2024-05-27 10:51:24] FATAL (basic.Log4jTest - main:24) - 이 메세지는 심각한 오류 (fatal)레벨의 메세지 입니다
회원 정보에 추가하기
DBUtil.java
package kr.or.ddit.util;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.ResourceBundle;
import org.apache.log4j.Logger;
// JDBC드라이버를 로딩하고 Connection 객체를 생성하여 반환하는 메서드로 구성된 class 만들기
// (dbinfo.properties파일의 내용으로 설정하기)
// ResourceBundle객체 이용하기
public class DBUtil {
private static final Logger logger = Logger.getLogger(DBUtil.class);
private static ResourceBundle bundle;
static {
bundle = ResourceBundle.getBundle("kr.or.ddit.config.dbinfo");
logger.info("ResourceBundle객체 생성 완료 - dbinfo.properties파일이용");
try {
// Class.forName("oracle.jdbc.driver.OracleDriver");
Class.forName(bundle.getString("driver"));
logger.debug("DB 드라이버 로딩 성공");
} catch (Exception e) {
// TODO: handle exception
logger.error("드라이버 로딩 실패");
// System.out.println("드라이버 로딩 실패");
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection conn = null; // 반환값이 저장될 변수
try {
conn = DriverManager.getConnection(bundle.getString("url"),
bundle.getString("user"),bundle.getString("pass"));
// conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","JIN96","java");
logger.debug("DB 연결 성공");
} catch (SQLException e) {
// TODO: handle exception
// System.out.println("DB 연결 실패");
logger.error("DB 연결 실패");
e.printStackTrace();
}
return conn;
}
}
MemberDaoImpl.java
package kr.or.ddit.member.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import kr.or.ddit.member.vo.MemberVO;
import kr.or.ddit.util.DBUtil;
public class MemberDaoImpl implements IMemberDao {
private static final Logger logger = Logger.getLogger(MemberDaoImpl.class);
private static MemberDaoImpl dao;
private MemberDaoImpl() {
// TODO Auto-generated constructor stub
}
public static MemberDaoImpl getInstance() {
if (dao == null) {
dao = new MemberDaoImpl();
}
return dao;
}
@Override
public int insertMember(MemberVO memVo) {
Connection conn = null;
PreparedStatement pstmt = null;
int cnt = 0; // 반환값이 저장될 변수
try {
conn = DBUtil.getConnection();
logger.info("Connection 객체 생성 완료");
String sql = "insert into mymember" + "(mem_id, mem_pass, mem_name, mem_tel, mem_addr) "
+ " values(?, ?, ?, ?, ?) ";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memVo.getMem_id());
pstmt.setString(2, memVo.getMem_pass());
pstmt.setString(3, memVo.getMem_name());
pstmt.setString(4, memVo.getMem_tel());
pstmt.setString(5, memVo.getMem_addr());
logger.debug("PreparedStatement객체 생성");
logger.debug("실행 SQL문 >> " + sql);
logger.debug("사용 데이터 >> [" + memVo.getMem_id() + ", " + memVo.getMem_pass() + ", " + memVo.getMem_name()
+ ", " + memVo.getMem_tel() + ", " + memVo.getMem_addr()+"]");
cnt = pstmt.executeUpdate();
logger.info("실행 성공 결과 : " + cnt);
} catch (Exception e) {
logger.error("insert 작업 실패", e);
// TODO: handle exception
} finally {
if (pstmt != null)
try {
pstmt.close();
logger.debug("PreparedStatement객체 반납 성공");
} catch (SQLException e) {
}
if (conn != null)
try {
conn.close();
logger.debug("Connection객체 반납 성공");
} catch (SQLException e) {
}
}
return cnt;
}
@Override
public int deleteMember(String mem_id) {
Connection conn = null;
PreparedStatement pstmt = null;
int cnt = 0; // 반환값이 저장될 변수
try {
conn = DBUtil.getConnection();
logger.info("Connection 객체 생성 완료");
String sql = "delete from mymember where mem_id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, mem_id);
logger.debug("PreparedStatement객체 생성");
logger.debug("실행 SQL문 >> " + sql);
logger.debug("사용 데이터 >> [" +mem_id+ "]");
cnt = pstmt.executeUpdate();
logger.info("실행 성공 결과 : " + cnt);
} catch (Exception e) {
// TODO: handle exception
} finally {
if (pstmt != null)
try {
pstmt.close();
logger.debug("PreparedStatement객체 반납 성공");
} catch (SQLException e) {
}
if (conn != null)
try {
conn.close();
logger.debug("Connection객체 반납 성공");
} catch (SQLException e) {
}
}
return cnt;
}
@Override
public int updateMember(MemberVO memVo) {
Connection conn = null;
PreparedStatement pstmt = null;
int cnt = 0; // 반환값이 저장될 변수
try {
conn = DBUtil.getConnection();
logger.info("Connection 객체 생성 완료");
String sql = "update mymember set mem_pass=?, mem_name=?, mem_tel=?, mem_addr=? where mem_id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memVo.getMem_pass());
pstmt.setString(2, memVo.getMem_name());
pstmt.setString(3, memVo.getMem_tel());
pstmt.setString(4, memVo.getMem_addr());
pstmt.setString(5, memVo.getMem_id());
logger.debug("PreparedStatement객체 생성");
logger.debug("실행 SQL문 >> " + sql);
logger.debug("사용 데이터 >> [" + memVo.getMem_id() + ", " + memVo.getMem_pass() + ", " + memVo.getMem_name()
+ ", " + memVo.getMem_tel() + ", " + memVo.getMem_addr()+"]");
cnt = pstmt.executeUpdate();
logger.info("실행 성공 결과 : " + cnt);
} catch (Exception e) {
// TODO: handle exception
} finally {
if (pstmt != null)
try {
pstmt.close();
logger.debug("PreparedStatement객체 반납 성공");
} catch (SQLException e) {
}
if (conn != null)
try {
conn.close();
logger.debug("Connection객체 반납 성공");
} catch (SQLException e) {
}
}
return cnt;
}
@Override
public List<MemberVO> getAllMember() {
List<MemberVO> list = new ArrayList<MemberVO>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
logger.info("Connection 객체 생성 완료");
String sql = "select * from mymember";
pstmt = conn.prepareStatement(sql);
logger.debug("PreparedStatement객체 생성");
logger.debug("실행 SQL문 >> " + sql);
rs = pstmt.executeQuery();
logger.debug("ResultSet 객체 생성");
while (rs.next()) {
MemberVO memVo = new MemberVO();
memVo.setMem_id(rs.getString("mem_id"));
memVo.setMem_pass(rs.getString("mem_pass"));
memVo.setMem_name(rs.getString("mem_name"));
memVo.setMem_tel(rs.getString("mem_tel"));
memVo.setMem_addr(rs.getString("mem_addr"));
list.add(memVo);
}
logger.debug("회원 list 생성 완료");
} catch (Exception e) {
// TODO: handle exception
} finally {
if (rs != null)
try {
rs.close();
logger.debug("ResultSet객체 반납 성공");
} catch (SQLException e) {
}
if (pstmt != null)
try {
pstmt.close();
logger.debug("PreparedStatement객체 반납 성공");
} catch (SQLException e) {
}
if (conn != null)
try {
conn.close();
logger.debug("Connection객체 반납 성공");
} catch (SQLException e) {
}
}
return list;
}
@Override
public int getMemIdCount(String mem_id) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int count = 0;
try {
conn = DBUtil.getConnection();
logger.info("Connection 객체 생성 완료");
String sql = "select count(*) count from mymember where mem_id=?";
pstmt = conn.prepareStatement(sql);
logger.debug("PreparedStatement객체 생성");
pstmt.setString(1, mem_id);
rs = pstmt.executeQuery();
logger.debug("ResultSet객체 생성");
if (rs.next()) {
count = rs.getInt("count");
}
logger.debug("회원 id count : "+count);
} catch (Exception e) {
// TODO: handle exception
} finally {
if (rs != null)
try {
rs.close();
logger.debug("ResultSet객체 반납 성공");
} catch (SQLException e) {
}
if (pstmt != null)
try {
pstmt.close();
logger.debug("PreparedState객체 반납 성공");
} catch (SQLException e) {
}
if (conn != null)
try {
conn.close();
logger.debug("Connection객체 반납 성공");
} catch (SQLException e) {
}
}
return count;
}
@Override
public MemberVO getMemInfo(String mem_id) {
MemberVO memVo = new MemberVO();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int count = 0;
try {
conn = DBUtil.getConnection();
logger.info("Connection 객체 생성 완료");
String sql = "select * from mymember where mem_id=?";
pstmt = conn.prepareStatement(sql);
logger.debug("PreparedStatement객체 생성");
logger.debug("실행 SQL문 >> " + sql);
logger.debug("사용 데이터 >> [" +mem_id+ "]");
pstmt.setString(1, mem_id);
rs = pstmt.executeQuery();
if (rs.next()) {
memVo.setMem_id(rs.getString("mem_id"));
memVo.setMem_pass(rs.getString("mem_pass"));
memVo.setMem_name(rs.getString("mem_name"));
memVo.setMem_tel(rs.getString("mem_tel"));
memVo.setMem_addr(rs.getString("mem_addr"));
}
logger.debug("memVo 가져오기 완료");
} catch (Exception e) {
// TODO: handle exception
} finally {
if (rs != null)
try {
rs.close();
logger.debug("ResultSet객체 반납 성공");
} catch (SQLException e) {
}
if (pstmt != null)
try {
pstmt.close();
logger.debug("PreparedState객체 반납 성공");
} catch (SQLException e) {
}
if (conn != null)
try {
conn.close();
logger.debug("Connection객체 반납 성공");
} catch (SQLException e) {
}
}
return memVo;
}
@Override
public int updateMember2(Map<String, String> paramMap) {
Connection conn = null;
PreparedStatement pstmt = null;
int cnt = 0; // 반환값이 저장될 변수
try {
conn = DBUtil.getConnection();
logger.info("Connection 객체 생성 완료");
String sql = "update mymember set " + paramMap.get("FIELD") + "=? where mem_id=?";
pstmt = conn.prepareStatement(sql);
logger.debug("PreparedStatement객체 생성");
pstmt.setString(1, paramMap.get("VALUE"));
pstmt.setString(2, paramMap.get("MEMID"));
logger.debug("실행 SQL문 >> " + sql);
logger.debug("사용 데이터 >> [" +paramMap.get("FIELD")+", " +paramMap.get("VALUE")+", "+paramMap.get("MEMID")+ "]");
cnt = pstmt.executeUpdate();
logger.info("실행 성공 결과 : " + cnt);
} catch (Exception e) {
// TODO: handle exception
} finally {
if (pstmt != null)
try {
pstmt.close();
logger.debug("PreparedState객체 반납 성공");
} catch (SQLException e) {
}
if (conn != null)
try {
conn.close();
logger.debug("Connection객체 반납 성공");
} catch (SQLException e) {
}
}
return cnt;
}
}
'JAVA > HIGH JAVA' 카테고리의 다른 글
[JAVA] Servlet 활용 & forward방식 redirect방식 (0) | 2024.05.29 |
---|---|
[JAVA] 서블릿(Servlet) (1) | 2024.05.28 |
5/24 Homework - 게시판 mybatis적용 (0) | 2024.05.24 |
[JAVA] mybatis - session유틸, 전화번호관리 mybatis (0) | 2024.05.24 |
5/23 Homework - mybatis적용 lprod테이블추가 (0) | 2024.05.23 |