Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions apps/user-service/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -47,21 +47,17 @@ dependencies {
// batch
implementation 'org.springframework.boot:spring-boot-starter-batch'

// Log4j2 - λͺ¨λ“  λͺ¨λ“ˆμ„ 2.22.1둜 톡일
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
implementation 'org.apache.logging.log4j:log4j-core:2.22.1'
implementation 'org.apache.logging.log4j:log4j-api:2.22.1'
implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.22.1'
implementation 'org.apache.logging.log4j:log4j-jul:2.22.1'
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml'
implementation 'org.apache.logging.log4j:log4j-layout-template-json:2.22.1'

implementation 'org.apache.logging.log4j:log4j-layout-template-json'
implementation 'pl.tkowalcz.tjahzi:log4j2-appender-nodep:0.9.17'
implementation 'org.apache.httpcomponents:httpclient:4.5.14'
implementation 'org.apache.httpcomponents:httpcore:4.4.16'
implementation 'pl.tkowalcz.tjahzi:log4j2-appender-nodep:0.9.17'

// 비동기 λ‘œκΉ…
implementation 'com.lmax:disruptor:3.4.4'
// implementation 'com.lmax:disruptor:3.4.4'
// implementation 'org.apache.commons:commons-dbcp2'
// implementation 'org.apache.commons:commons-pool2'

implementation "io.micrometer:micrometer-tracing-bridge-brave"
implementation "io.micrometer:micrometer-tracing"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package site.icebang.domain;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

import site.icebang.common.dto.ApiResponse;

@RestController
@RequestMapping("/v0/check-execution-log-insert")
@Slf4j
public class WorkflowLogInsertExampleController {
private static final Logger workflowLogger = LoggerFactory.getLogger("WORKFLOW_HISTORY");

@GetMapping("")
public ApiResponse<String> test() {
log.info("@@");
// MDC.put("traceId", UUID.randomUUID().toString());
MDC.put("sourceId", "o1");
MDC.put("executionType", "WORKFLOW");
// MDC.put("sourceId", "test-controller");

// 이 λ‘œκ·ΈλŠ” DB에 μ €μž₯됨
workflowLogger.info("SLF4J둜 찍은 μ›Œν¬ν”Œλ‘œμš° 둜그");

MDC.clear();
return ApiResponse.success("hi");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package site.icebang.global.aop.logging;

public class WorkflowLoggingAspect {}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ public enum SecurityEndpoints {
"/js/**",
"/images/**",
"/v0/organizations/**",
"/v0/auth/register"),
"/v0/auth/register",
"/v0/check-execution-log-insert"),

// 데이터 관리 κ΄€λ ¨ μ—”λ“œν¬μΈνŠΈ
DATA_ADMIN("/admin/**", "/api/admin/**", "/management/**", "/actuator/**"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ public ApiResponse<String> handleValidation(MethodArgumentNotValidException ex)
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ApiResponse<String> handleGeneric(Exception ex) {
return ApiResponse.error(
"Internal error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
return ApiResponse.error("Internal error: ", HttpStatus.INTERNAL_SERVER_ERROR);
}

@ExceptionHandler(NoResourceFoundException.class)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
package site.icebang.schedule.service;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;
Expand All @@ -30,29 +26,30 @@ public class DynamicSchedulerService {

public void register(Schedule schedule) {
// TODO: schedule.getWorkflowId()λ₯Ό 기반으둜 μ‹€ν–‰ν•  Job의 이름을 DBμ—μ„œ 쑰회
String jobName = "blogContentJob"; // μ˜ˆμ‹œ
Job jobToRun = applicationContext.getBean(jobName, Job.class);

Runnable runnable =
() -> {
try {
JobParametersBuilder paramsBuilder = new JobParametersBuilder();
paramsBuilder.addString("runAt", LocalDateTime.now().toString());
paramsBuilder.addLong("scheduleId", schedule.getScheduleId());
jobLauncher.run(jobToRun, paramsBuilder.toJobParameters());
} catch (Exception e) {
log.error(
"Failed to run scheduled job for scheduleId: {}", schedule.getScheduleId(), e);
}
};

CronTrigger trigger = new CronTrigger(schedule.getCronExpression());
ScheduledFuture<?> future = taskScheduler.schedule(runnable, trigger);
scheduledTasks.put(schedule.getScheduleId(), future);
log.info(
">>>> Schedule registered: id={}, cron={}",
schedule.getScheduleId(),
schedule.getCronExpression());
// String jobName = "blogContentJob"; // μ˜ˆμ‹œ
// Job jobToRun = applicationContext.getBean(jobName, Job.class);
//
// Runnable runnable =
// () -> {
// try {
// JobParametersBuilder paramsBuilder = new JobParametersBuilder();
// paramsBuilder.addString("runAt", LocalDateTime.now().toString());
// paramsBuilder.addLong("scheduleId", schedule.getScheduleId());
// jobLauncher.run(jobToRun, paramsBuilder.toJobParameters());
// } catch (Exception e) {
// log.error(
// "Failed to run scheduled job for scheduleId: {}", schedule.getScheduleId(),
// e);
// }
// };
//
// CronTrigger trigger = new CronTrigger(schedule.getCronExpression());
// ScheduledFuture<?> future = taskScheduler.schedule(runnable, trigger);
// scheduledTasks.put(schedule.getScheduleId(), future);
// log.info(
// ">>>> Schedule registered: id={}, cron={}",
// schedule.getScheduleId(),
// schedule.getCronExpression());
}

public void remove(Long scheduleId) {
Expand Down
78 changes: 46 additions & 32 deletions apps/user-service/src/main/resources/log4j2-develop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Configuration:
target: SYSTEM_OUT
PatternLayout:
pattern: ${console-layout-pattern}
disableAnsi: false
# disableAnsi: false

# Loki Appender - κ°œλ°œν™˜κ²½ λͺ¨λ‹ˆν„°λ§μš©
Loki:
Expand Down Expand Up @@ -60,31 +60,35 @@ Configuration:
value: "${ctx:sourceId}"
- name: "runId"
value: "${ctx:runId}"
JDBC:
name: workflow-appender
tableName: "execution_log"
bufferSize: 0
ignoreExceptions: false

# ExecutionDB:
# name: ExecutionDB
# class: org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender
# tableName: execution_log
# columnMappings:
# - name: log_level
# pattern: "%level"
# - name: log_message
# pattern: "%message"
# - name: trace_id
# pattern: "%X{traceId}"
# - name: execution_type
# pattern: "%X{executionType}"
# - name: source_id
# pattern: "%X{sourceId}"
# - name: run_id
# pattern: "%X{runId}"
# - name: executed_at
# pattern: "%d{yyyy-MM-dd HH:mm:ss}"
# connectionSource:
# class: org.apache.logging.log4j.core.appender.db.jdbc.DataSourceConnectionSource
# dataSource: "#dataSource
DriverManager:
connectionString: "jdbc:mariadb://localhost:3306/pre_process"
driverClassName: "org.mariadb.jdbc.Driver"
userName: "mariadb"
password: "qwer1234"

# 개발용 일반 둜그 파일
ColumnMapping:
- name: "execution_type"
pattern: "%X{executionType}"
- name: "source_id"
pattern: "%X{sourceId}"
- name: "log_level"
pattern: "%level"
- name: "executed_at"
pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS}" # νŒ¨ν„΄μœΌλ‘œ μ‹œκ°„ 직접 μ§€μ •
- name: "log_message"
pattern: "%message"
- name: "trace_id"
pattern: "%X{traceId}"
- name: "reserved1"
pattern: "%X{spanId}"
# - name: "config_snapshot"
# pattern: "%X{configSnapshot}"
File:
- name: file-dev-appender
fileName: ${dev-log}
Expand All @@ -107,17 +111,27 @@ Configuration:
Logger:
# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그 - 개발 μ‹œ λͺ¨λ“  레벨 + Loki 전솑
- name: site.icebang
additivity: false
additivity: "false"
level: DEBUG
AppenderRef:
- ref: console-appender
- ref: loki-appender
- ref: file-dev-appender
- ref: file-error-appender

- name: "WORKFLOW_HISTORY"
level: DEBUG
additivity: "false"
AppenderRef:
- ref: workflow-appender
- ref: loki-appender
- ref: console-appender
- ref: file-dev-appender
- ref: file-error-appender

# Spring Framework - 개발 μ‹œ ν•„μš”ν•œ μ •λ³΄λ§Œ
- name: org.springframework
additivity: false
additivity: "false"
level: INFO
AppenderRef:
- ref: console-appender
Expand All @@ -126,7 +140,7 @@ Configuration:
# Spring Security - 인증 λ””λ²„κΉ…μš©
- name: org.springframework.security
level: DEBUG
additivity: false
additivity: "false"
AppenderRef:
- ref: console-appender
- ref: file-dev-appender
Expand All @@ -135,7 +149,7 @@ Configuration:
# μ›Ή μš”μ²­ 둜그 - API 개발 μ‹œ 유용
- name: org.springframework.web
level: DEBUG
additivity: false
additivity: "false"
AppenderRef:
- ref: console-appender
- ref: file-dev-appender
Expand All @@ -144,26 +158,26 @@ Configuration:
# νŠΈλžœμž­μ…˜ 둜그 - DB μž‘μ—… 디버깅
- name: org.springframework.transaction
level: DEBUG
additivity: false
additivity: "false"
AppenderRef:
- ref: console-appender
- ref: file-dev-appender
- ref: loki-appender

# HikariCP 둜그 λΉ„ν™œμ„±ν™”
- name: com.zaxxer.hikari
level: OFF
level: "OFF"

# SQL 둜그 - 개발 μ‹œ 쿼리 ν™•μΈμš© (ν•„μš”μ‹œ ν™œμ„±ν™”)
- name: org.hibernate.SQL
level: DEBUG
additivity: false
additivity: "false"
AppenderRef:
- ref: console-appender

# νŒŒλΌλ―Έν„° 바인딩 둜그 (ν•„μš”μ‹œ ν™œμ„±ν™”)
- name: org.hibernate.type.descriptor.sql.BasicBinder
level: TRACE
additivity: false
additivity: "false"
AppenderRef:
- ref: console-appender
Loading
Loading