
์ง๊ธ ์งํ์ค์ธ Dataracy ํ๋ก์ ํธ์์ ๊ธฐ์กด์๋ @Slf4j ์ ๋ ธํ ์ด์ ์ ํด๋์ค์ ๋ถ์ด๊ณ ์ง์ log.info, log.warn๊ณผ ๊ฐ์ด ์๋ฌ ๋ก๊ทธ๋ฅผ ์ง์ ๋จ๊ฒผ์๋๋ฐ ๋ก๊ทธ ์์คํ ์ ์ค๊ณํ๊ณ ๊ณตํต ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
์๋น์ค๋ฅผ ์ด์ํ๋ค ๋ณด๋ฉด ๋จ์ํ โ์๋ฌ๊ฐ ๋ฌ๋คโ๋ฅผ ์๋ ๊ฒ๋ง์ผ๋ก๋ ๋ถ์กฑํ๋ค. ์ด๋์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง, ์๊ฐ์ด ์ผ๋ง๋ ๊ฑธ๋ ธ๋์ง, ์ด๋ค ํ๋ฆ์์ ์คํจํ๋์ง๋ฅผ ๋น ๋ฅด๊ฒ ํ์ ํด์ผ ํ๋ค.
๐ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ด์ ๋ก๊ทธ๋ฅผ ๊ณ์ธต๋ณ๋ก ๋๋๊ณ , ํฌ๋งท์ ํต์ผํด์ ๊ธฐ๋กํด์ผ ํ๋ค.
๋ชจ๋ ์ ์ฉ Logger๋ BaseLogger๋ฅผ ์์๋ฐ์ ๊ตฌํํ๋ค.
@Slf4j
public abstract class BaseLogger {
protected void info(String format, Object... args) {
log.info(format, args);
}
protected void debug(String format, Object... args) {
log.debug(format, args);
}
protected void warn(String format, Object... args) {
log.warn(format, args);
}
protected void error(String format, Object... args) {
log.error(format, args);
}
protected void error(Throwable t, String format, Object... args) {
log.error(format, args, t);
}
}
๐ ํจ๊ณผ
public class LoggerFactory {
private static final ApiLogger API_LOGGER = new ApiLogger();
private static final ServiceLogger SERVICE_LOGGER = new ServiceLogger();
private static final DomainLogger DOMAIN_LOGGER = new DomainLogger();
private static final PersistenceLogger PERSISTENCE_LOGGER = new PersistenceLogger();
private static final QueryDslLogger QUERY_DSL_LOGGER = new QueryDslLogger();
private static final KafkaLogger KAFKA_LOGGER = new KafkaLogger();
private static final ElasticLogger ELASTIC_LOGGER = new ElasticLogger();
private static final RedisLogger REDIS_LOGGER = new RedisLogger();
private static final SchedulerLogger SCHEDULER_LOGGER = new SchedulerLogger();
private static final DistributedLockLogger DISTRIBUTED_LOCK_LOGGER = new DistributedLockLogger();
private static final CommonLogger COMMON_LOGGER = new CommonLogger();
public static ApiLogger api() { return API_LOGGER; }
public static ServiceLogger service() { return SERVICE_LOGGER; }
public static DomainLogger domain() { return DOMAIN_LOGGER; }
public static PersistenceLogger db() { return PERSISTENCE_LOGGER; }
public static QueryDslLogger query() { return QUERY_DSL_LOGGER; }
public static KafkaLogger kafka() { return KAFKA_LOGGER; }
public static ElasticLogger elastic() { return ELASTIC_LOGGER; }
public static RedisLogger redis() { return REDIS_LOGGER; }
public static SchedulerLogger scheduler() { return SCHEDULER_LOGGER; }
public static DistributedLockLogger lock() { return DISTRIBUTED_LOCK_LOGGER; }
public static CommonLogger common() { return COMMON_LOGGER; }
}
LoggerFactory.db().logSave(...) ์ ๊ฐ์ ํํ๋ก ๊ฐ ๊ณ์ธต๋ง๋ค ์ค์ ํ ๋ก๊ทธ๋ฅผ ์ด๋์๋ ๋ฐ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋ค. ๊ฐ Logger๋ ๊ณ์ธต ํน์ฑ์ ๋ง๊ฒ ํญ๋ชฉ๊ณผ Duration ์ธก์ ์ ์ง์ํ๋ค.
๐ Duration(Instant.now())์ ํ์ฉํด ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ๊น์ง ํ์
ํ ์ ์๋ค.
๋ํ ๊ฐ์์ ๊ณ์ธต์ ๋ง๋ ๋ก๊น
๋ฉ์๋๋ฅผ ์ค์ ํ์ฌ ๊ตฌํ์ฒด์์ ์ฌ์ฉํ๋ค.
@Override
public User saveUser(User user) {
UserEntity savedUser = userJpaRepository.save(UserEntityMapper.toEntity(user));
LoggerFactory.db().logSave("UserEntity", String.valueOf(savedUser.getId()), "DB์ ์ ์ ๋ฅผ ์ ์ฅํ์์ต๋๋ค.");
return UserEntityMapper.toDomain(savedUser);
}
@Override
public void changePassword(Long userId, String encodePassword) {
UserEntity userEntity = userJpaRepository.findById(userId)
.orElseThrow(() -> {
LoggerFactory.db().logWarning("UserEntity", "[๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ] ์ฌ์ฉ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. userId=" + userId);
return new UserException(UserErrorStatus.NOT_FOUND_USER);
});
userEntity.changePassword(encodePassword);
LoggerFactory.db().logUpdate("UserEntity", String.valueOf(userEntity.getId()), "์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ์์ต๋๋ค.");
}
logWarning) kafkaTemplate.send(TOPIC_PROJECT_LIKE_INCREASE, String.valueOf(targetId), targetId)
.whenComplete((result, ex) -> {
if (ex == null) {
LoggerFactory.kafka().logProduce(TOPIC_PROJECT_LIKE_INCREASE,
"ํ๋ก์ ํธ ์ข์์ ์ด๋ฒคํธ ๋ฐ์ก๋จ: projectId=" + targetId);
} else {
LoggerFactory.kafka().logError(TOPIC_PROJECT_LIKE_INCREASE,
"ํ๋ก์ ํธ ์ข์์ ์ด๋ฒคํธ ๋ฐ์ก ์ฒ๋ฆฌ ์คํจ: projectId=" + targetId, ex);
}
});
๐ ํจ๊ณผ:
์ด๋ ๊ฒ ๊ฐ์์ ๊ณ์ธต๋ง๋ค์ ์ปค์คํ ์ด์ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
BaseLogger โ ๊ณตํต ๊ธฐ๋ฐ LoggerFactory โ ์ฑ๊ธํค ์ ์ญ ์ ๊ทผ [DB ์ ์ฅ] ..., [Kafka ์ ์ก] ... โ ํ ์ค๋ง ๋ด๋ ์ถ์ฒ ์๋ณ ํ๋ ๋ก๊ทธ(MDC ๊ธฐ๋ฐ)๋ ์ฌ์ฉ์์ โ๋ฌด์์ ํ๋๊ฐ(์ด๋ค ๊ธฐ๋ฅ)โ๋ฅผ ์ถ์ ํ๋ค๋ฉด,
์ด์ ๋ก๊ทธ๋ ์์คํ
์ โ์ด๋ป๊ฒ ๋์ํ๋๊ฐโ๋ฅผ ์ถ์ ํ๋ค.
์ด์ ๋ก๊ทธ๋ฅผ ๊ณ์ธต๋ณ Logger + ์ฑ๊ธํค Factory ๊ตฌ์กฐ๋ก ๊ตฌํํจ์ผ๋ก์จ,
์ฆ, ์ด์ ๋ก๊ทธ๋ ๋จ์ํ ๋ก๊ทธ ์ถ๋ ฅ์ด ์๋๋ผ, ์๋น์ค ์์ ์ฑ๊ณผ ์ด์ ํจ์จ์ฑ์ ๋ท๋ฐ์นจํ๋ ํต์ฌ ์ธํ๋ผ๋ค.