자바 jar 실행파일 만들기 / Java Project log4j2

(。◠ ◠。)·2024년 11월 28일
post-thumbnail

어떤 프로젝트 생성이 맞는건지를 모르겠다
간단하게 DB접속해서 CRU만 하는 프로그램이 필요했다.
일단 일반 자바프로젝트로 생성함...

순서

  1. 일반 자바 프로젝트 생성

  2. 프로젝트 하위에 lib 폴더 새로 만들어서 jar넣고 오른쪽 클릭 -  Build Path - Add to Build Path 클릭
    출처: https://hamait.tistory.com/351 [HAMA 블로그:티스토리]
    (내가 사용할 DB에 맞는 jar넣기)

  3. BD연결
    https://cobook.tistory.com/6

//출력문을 로그로 떨어뜨리게
FileOutputStream fileStream = new FileOutputStream(logFileName, true);

//DB연결
Class.forName("com.mysql.cj.jdbc.Driver");
String db_url = "jdbc:mysql://~~~?allowMultiQueries=true";
String db_id = "";
String db_pw = "";

try(
	Connection conn = DriverManager.getConnection(db_url, db_id, db_pw);
	){}
//괄호 try하면 알아서 close한다길래..

이후에는 PreparedStatement랑 ResultSet으로 처리

그냥 함수 하나에 코드 주르륵 있고 메인에서는 그 함수를 부르는 형태긴 한데
다음엔 좀 더 똑똑한 방법을 찾아보는것으로..


Java Project 모양새

jar Export

Export-Java-Runnable JAR file


출처 https://zincod.tistory.com/137

cmd에서 jar 실행하기

cmd > cd jar파일있는 폴더 > java -jar jar파일명.jar
java -jar [파일명].jar

일단 자바가 있는곳에서 실행시킬거라 jre는 따로 안함

.
.
.

자바프로젝트에서 로그찍기

log4j2 로그 설정

main 하위 resources에 log4j2.xml 위치

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR">
    <Appenders>
        <!-- Define a Rolling File Appender -->
        <RollingFile name="RollingFileAppender"
                     filePattern="D:/폴더/로그파일명-%d{yyyy-MM-dd_HH-mm-ss}.log">
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
            <Policies>
				<!-- 프로그램 실행 시마다 새로운 파일 생성 -->
            	<OnStartupTriggeringPolicy />
            </Policies>
        </RollingFile>

        <!-- Async Appender that references the Rolling File Appender -->
        <Async name="AsyncFile">
            <AppenderRef ref="RollingFileAppender" />
        </Async>
    </Appenders>

    <Loggers>
        <Root level="error">
            <AppenderRef ref="AsyncFile" />
        </Root>
    </Loggers>
</Configuration>

MAIN

public class Main {
	
	private static final Logger logger = LogManager.getLogger(Main.class);
	
	public static void main(String[] args) {
		
		//에러 로그
		PrintStream originalErr = System.err;
		System.setErr(new PrintStream(new Log4jOutputStream(logger, true, originalErr), true));

콘솔에도 출력되도록 하는 함수
->콘솔에는 기본 로그와 error로그가 찍히고 log파일에는 error로그만 찍힌다.

public class Log4jOutputStream extends OutputStream {
    private final Logger logger;
    private final boolean isError;
    private final StringBuilder buffer = new StringBuilder();
    private final PrintStream originalErr; // 원래 System.err 저장

    public Log4jOutputStream(Logger logger, boolean isError, PrintStream originalErr) {
        this.logger = logger;
        this.isError = isError;
        this.originalErr = originalErr; // 원래 System.err 초기화
    }

    @Override
    public void write(int b) {
        if (b == '\n') {
            flush(); // 줄바꿈 시 flush 호출
        } else {
            buffer.append((char) b);
        }
    }

    @Override
    public void flush() {
        if (buffer.length() > 0) {
            String message = buffer.toString().trim(); // 공백 제거
            if (!message.isEmpty()) { // 메시지가 있을 때만 처리
                if (isError) {
                    logger.error(message); // 로그 파일로 기록
                    originalErr.println(message); // 콘솔 출력
                }
            }
            buffer.setLength(0); // 버퍼 초기화
        }
    }
}

로컬 이클립스에서 테스트 시 log파일 생성이 잘 되었는데 jar로 실행 시 잘 되지 않았음
Log4j2.xml -> log4j2.xml 로 바꾸니까 잘 떨어뜨림....really?

log4j2확인하기


build path에 log4j2.xml이 있는 resources폴더가 있는지 확인

main에서 해당 코드 찍어서 log4j2.xml 관련 내용이 잘 찍히는지 확인

		LoggerContext context = (LoggerContext) LogManager.getContext(false);
        Configuration config = context.getConfiguration();
        System.out.println("Loaded configuration: " + config.getName());
profile
화이탱!

0개의 댓글