
어떤 프로젝트 생성이 맞는건지를 모르겠다
간단하게 DB접속해서 CRU만 하는 프로그램이 필요했다.
일단 일반 자바프로젝트로 생성함...
일반 자바 프로젝트 생성
프로젝트 하위에 lib 폴더 새로 만들어서 jar넣고 오른쪽 클릭 - Build Path - Add to Build Path 클릭
출처: https://hamait.tistory.com/351 [HAMA 블로그:티스토리]
(내가 사용할 DB에 맞는 jar넣기)
//출력문을 로그로 떨어뜨리게
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 모양새
Export-Java-Runnable JAR file

출처 https://zincod.tistory.com/137
cmd > cd jar파일있는 폴더 > java -jar jar파일명.jar
java -jar [파일명].jar
일단 자바가 있는곳에서 실행시킬거라 jre는 따로 안함
.
.
.
자바프로젝트에서 로그찍기
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?

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());