res 폴더 확인
1. 폴더 생성
2. 폴더 이름 짓기
3. 폴더 우클릭 후 Bulid Path선택
4. Add Folder 선택
5. 소스 폴더 선택
6. 폴더 샵모양 확인
로깅 파일 넣기
1. log4j-api-2.20.0.jar , log4j-core-2.20.0.jar , lo4j2.xml 파일 다운로드
2. 프로젝트 우클릭 후 Bulid Path선택
3. log4j-api-2.20.0.jar , log4j-core-2.20.0.jar 선택 → 열기
4. 확인 후 Apply and Close
5. Referenced Libraries 확인
6. log4j2.xml 드래그하고 res 파일 붙여넣기
7. res 폴더log4j2.xml 들어왔는지 확인
log4j2.xml
level :로깅 수준 결정
- trace < debug < info < warn < error< fatal (가장 심각)
로그레벨 | 설명 |
trace | 모든 메시지 표시하기 위한 정보 |
debug | 프로그램 디버깅하기 위한 정보 |
info | 상태변경, 서비스 동작 상태를 위한 정보 |
warn | 향후 잠재적으로 문제를 야기할 수 있는 정보 |
error | 의도하지 않은 오류 발생 정보 |
fatal | 시스템적으로 심각한 문제가 발생해서 어플리케이션 작동이 불가능한 정보 |
- info 레벨이면 "info ~ fatal"까지 로깅
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name = "Myfile" fileName ="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<!-- 여기에 로거 추가 -->
<Logger name = "log4fexam.sql.Query" level = "trace" additivity = "false" >
<AppenderRef ref = "Console"/>
</Logger>
<Logger name = "log4fexam.sql.Parameter" level = "trace" additivity = "false">
<AppenderRef ref = "Console"/>
<!-- Myfile에도 등록 -->
<AppenderRef ref = "Myfile"/>
</Logger>
<Logger name = "파일위치" level = "trace" additivity = "false">
<AppenderRef ref = "Console"/>
</Logger>
<Root level="info">
<!-- 참조 : Console -->
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
더보기
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name = "Myfile" fileName ="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<!-- 여기에 로거 추가 -->
<Logger name = "log4fexam.sql.Query" level = "trace" additivity = "false" >
<AppenderRef ref = "Console"/>
</Logger>
<Logger name = "log4fexam.sql.Parameter" level = "trace" additivity = "false">
<AppenderRef ref = "Console"/>
<!-- Myfile에도 등록 -->
<AppenderRef ref = "Myfile"/>
</Logger>
<Logger name = "kr.or.ddit.basic.T01MemberInfoTest" level = "trace" additivity = "false">
<AppenderRef ref = "Console"/>
</Logger>
<Root level="info">
<!-- 참조 : Console -->
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
로그선언
import 추가
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static final Logger SQL_LOGGER =
LogManager.getLogger("log4fexam.sql.Query");
private static final Logger PARAM_LOGGER =
LogManager.getLogger("log4fexam.sql.Parameter");
private static final Logger RESULT_LOGGER =
LogManager.getLogger(클래스이름.class);
로그 쓰기
String sql = "insert into mymember"
+ " (MEM_ID,MEM_NAME,MEM_TEL,MEM_ADDR)\r\n" +
" values (?,?,?,?)";
//SQL 로깅
SQL_LOGGER.debug("sql : " + sql);
pstmt = conn.prepareStatement(sql);
pstmt.setNString(1, memId);
pstmt.setNString(2, memName);
pstmt.setNString(3, memTel);
pstmt.setNString(4, memAddr);
//PARAM 로깅
PARAM_LOGGER.debug("param : "+ "memId = "+ memId + ", memName = "+ memName
+ ", memTel = "+ memTel + ", memAddr = "+ memAddr);
int cnt = pstmt.executeUpdate();
//RESULT 로깅
RESULT_LOGGER.info("cnt : "+ cnt);
원본
T01MemberInfoTest
더보기
package kr.or.ddit.basic;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Scanner;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import kr.or.ddit.utill.JDBCUtil3;
public class T01MemberInfoTest {
//인터페이스 선언
private Connection conn;
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet rs;
private Scanner scan = new Scanner(System.in);
//
private static final Logger SQL_LOGGER =
LogManager.getLogger("log4fexam.sql.Query");
private static final Logger PARAM_LOGGER =
LogManager.getLogger("log4fexam.sql.Parameter");
private static final Logger RESULT_LOGGER =
LogManager.getLogger(T01MemberInfoTest.class);
/**
* 메뉴를 출력하는 메서드
*/
public void displayMenu(){
System.out.println();
System.out.println("----------------------");
System.out.println(" === 작 업 선 택 ===");
System.out.println(" 1. 자료 입력");
System.out.println(" 2. 자료 삭제");
System.out.println(" 3. 자료 수정");
System.out.println(" 4. 전체 자료 출력");
System.out.println(" 5. 작업 끝.");
System.out.println("----------------------");
System.out.print("원하는 작업 선택 >> ");
}
/**
* 프로그램 시작메서드
*/
public void start(){
int choice;
do{
displayMenu(); //메뉴 출력
choice = scan.nextInt(); // 메뉴번호 입력받기
switch(choice){
case 1 : // 자료 입력
insertMember();
break;
case 2 : // 자료 삭제
delectMember();
break;
case 3 : // 자료 수정
updateMember();
break;
case 4 : // 전체 자료 출력
displayMember();
break;
case 5 : // 작업 끝
System.out.println("작업을 마칩니다.");
break;
default :
System.out.println("번호를 잘못 입력했습니다. 다시입력하세요");
}
}while(choice!=5); //5 반복종료
}
/**
* 회원정보를 모두 출력하기 위한 메서드
*/
private void displayMember() {
System.out.println();
System.out.println("--------------------------");
System.out.println("ID\t생성일\t이 름\t전화번호 \t\t 주 소");
System.out.println("--------------------------");
try {
//conn 먼저 해야 createStatement() 만들수 있음
conn = JDBCUtil3.getConnection();
String sql = "select * from mymember";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
String memId = rs.getNString("mem_Id");
String memName = rs.getNString("mem_name");
String memTel = rs.getNString("mem_tel");
String memAddr = rs.getNString("mem_addr");
//LocalDateTim
LocalDate regDt = rs.getTimestamp("reg_dt")
.toLocalDateTime().toLocalDate();
System.out.println(" "+memId+"\t"+regDt+"\t"+memName+
"\t"+memTel+" \t"+memAddr);
}
}catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 회원정보를 삭제하기 위한 메서드
*/
private void delectMember() {
boolean isExist = false;
System.out.println();
System.out.println("삭제할 회원정보를 입력하세요.");
System.out.println("회원 ID>>");
String memId = scan.next();
try {
conn = JDBCUtil3.getConnection();
String sql = "delete from mymember where mem_id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setNString(1, memId);
int cnt = pstmt.executeUpdate();
if(cnt > 0 ) {
System.out.println(memId + "인 회원정보 삭제 성공");
}else {
System.out.println(memId + "인 회원정보 삭제 실패");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil3.close(conn, pstmt, pstmt, rs);
}
}
/**
* 회원정보를 수정하기 위한 메서드
*/
private void updateMember() {
//중복체크
boolean isExist = false;
System.out.println();
System.out.println("수정할 회원정보를 입력하세요.");
System.out.println("회원 ID>>");
String memId = scan.next();
//
isExist = checkMember(memId);
if(!isExist) { //false
System.out.println(memId + "인 회원이 존재하지 않습니다.");
System.out.println("다시 입력해 주세요.");
return;
}
System.out.println("회원 이름>>");
String memName = scan.next();
System.out.println("회원 전화번호>>");
String memTel = scan.next();
scan.nextLine(); // 버퍼에 남아있을 언터키 제거용
System.out.println("회원 주소>>");
String memAddr = scan.nextLine();
//JDBC 코딩
try {
//오라클 접속
conn = JDBCUtil3.getConnection();
String sql = "update mymember\r\n" +
" set\r\n" +
" mem_name = ?\r\n" +
" , mem_tel = ?\r\n" +
" , mem_addr = ?\r\n" +
" where\r\n" +
" mem_id = ?";
pstmt = conn.prepareStatement(sql);
// pstmt.setNString(?위치 번호, 값);
pstmt.setNString(1, memName);
pstmt.setNString(2, memTel);
pstmt.setNString(3, memAddr);
pstmt.setNString(4, memId);
//executeQuery() : select (조회)
//executeUpdate() : 리턴타입 : int 0이면 executeUpdate 안되있고 0 보다 크면 executeUpdate 됨
int cnt = pstmt.executeUpdate();
if(cnt >0 ) { //
System.out.println(memId + "회원 정보 수정 작업 성공!");
}else { // cnt <0
System.out.println(memId + "회원 정보 수정 작업 실패!");
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
//자원반납
JDBCUtil3.close(conn, pstmt, pstmt, rs);
}
}
/*
* 회원정보를 등록하기 위한 메서드
*/
private void insertMember() {
//중복체크
boolean isExist = false;
System.out.println();
System.out.println("추가할 회원정보를 입력하세요.");
System.out.println("회원 ID>>");
String memId = scan.next();
//
isExist = checkMember(memId);
if(isExist) { //true
System.out.println(memId + "인 회원이 이미 존재합니다..");
System.out.println("다시 입력해 주세요.");
return;
}
System.out.println("회원 이름>>");
String memName = scan.next();
System.out.println("회원 전화번호>>");
String memTel = scan.next();
scan.nextLine(); // 버퍼에 남아있을 언터키 제거용
System.out.println("회원 주소>>");
String memAddr = scan.nextLine();
//JDBC 코딩
try {
//오라클 접속
conn = JDBCUtil3.getConnection();
String sql = "insert into mymember"
+ " (MEM_ID,MEM_NAME,MEM_TEL,MEM_ADDR)\r\n" +
" values (?,?,?,?)";
//콘솔 출력하기
// System.out.println("sql : " + sql);
//로깅으로 남기는것
SQL_LOGGER.debug("sql : " + sql);
pstmt = conn.prepareStatement(sql);
// pstmt.setNString(?위치 번호, 값);
pstmt.setNString(1, memId);
pstmt.setNString(2, memName);
pstmt.setNString(3, memTel);
pstmt.setNString(4, memAddr);
PARAM_LOGGER.debug("param : "+ "memId = "+ memId + ", memName = "+ memName
+ ", memTel = "+ memTel + ", memAddr = "+ memAddr);
//executeQuery() : select (조회)
//executeUpdate() : 리턴타입 : int 0이면 executeUpdate 안되있고 0 보다 크면 executeUpdate 됨
int cnt = pstmt.executeUpdate();
RESULT_LOGGER.info("cnt : "+ cnt);
if(cnt >0 ) { //
System.out.println(memId + "회원 정보 등록 작업 성공!");
}else { // cnt <0
System.out.println(memId + "회원 정보 등록 작업 실패!");
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
//자원반납
JDBCUtil3.close(conn, pstmt, pstmt, rs);
}
}
/**
* 회원정보가 존재하는지 체크하기 위한 메서드
* @param memId 체크할 회원아이디
* @return
*/
private boolean checkMember(String memId) {
boolean isExist = false;
try {
conn = JDBCUtil3.getConnection();
String sql = "select count(*) cnt \r\n" +
" from mymember\r\n" +
" where\r\n" +
" mem_id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memId);
rs = pstmt.executeQuery();
while(rs.next()) {
int cnt = rs.getInt("cnt");
if(cnt > 0) {
isExist = true; // 이미존재함
}
}
}catch(SQLException ex) {
ex.printStackTrace();
}finally {
JDBCUtil3.close(conn, pstmt, pstmt, rs);
}
return isExist;
}
public static void main(String[] args) {
T01MemberInfoTest memObj = new T01MemberInfoTest();
memObj.start();
}
}
log4j2.xml
더보기
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name = "Myfile" fileName ="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<!-- 여기에 로거 추가 -->
<Logger name = "log4fexam.sql.Query" level = "trace" additivity = "false" >
<AppenderRef ref = "Console"/>
</Logger>
<Logger name = "log4fexam.sql.Parameter" level = "trace" additivity = "false">
<AppenderRef ref = "Console"/>
<!-- Myfile에도 등록 -->
<AppenderRef ref = "Myfile"/>
</Logger>
<Logger name = "kr.or.ddit.basic.T01MemberInfoTest" level = "trace" additivity = "false">
<AppenderRef ref = "Console"/>
</Logger>
<Root level="info">
<!-- 참조 : Console -->
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>