본문 바로가기
Cloud

로그 모니터링 시스템 개발기

by VENUSIM 2025. 2. 13.



예외 및 오류에 대한 Error 레벨 로그를 stderr 와 stdout 으로 출력하면, Promtail이 이를 수집하여 Loki로 전달하고 로그를 관리합니다. 이후, 에러 로그 모니터링 기능을 통해 해당 에러를 관리하며, 알림을 발송하는 시스템이 구축하였습니다.

 


로그 구성

이와 같은 프로세스를 수행하기 위해서는 일정한 포맷과 규칙에 맞춰 로그를 출력해야 합니다. 화면 구성을 위한 값에 해당하는 키는 아래와 같습니다.

 


 

포맷

위 화면을 구성하기 위해 로그 출력 데이터 포맷은 다음 같습니다. (순서 무관)

[apm_check_error]:%s;[apm_stack_trace]:%s;[apm_key]:%s;[apm_error_point]:%s;
%s 는 원본 값에서 “\n” → “\t” , “\r” → ““ 으로 치환된 값이 들어가며, 키:값을 Semicolons로 구분 지어 줍니다.

    // JAVA 예시
    public static String logTemplate(String apmCheckError, String apmStackTrace, final String apmKey, String apmErrorPoint) {
        return String.format("[apm_check_error]:%s;[apm_stack_trace]:%s;[apm_key]:%s;[apm_error_point]:%s;", replaceLineBreak(apmCheckError), replaceLineBreak(apmStackTrace), apmKey, replaceLineBreak(apmErrorPoint));
    }

    private static String replaceLineBreak(String str) {
        if(StringUtils.isNotEmpty(str)) {
            str = str.replaceAll("\n", "\t");
            str = str.replaceAll("\r", "");
        }
        return str;
    }

 

[apm_key]의 경우 [apm_stack_trace]의 값을 SHA-224 알고리즘(csap 권장사항)을 사용하여 값을 생성하고, 이를 UTF_8 charset으로 인코딩된 16진수 문자열로 반환해야 합니다.

    // Java 예시
    protected static String hash(String input) {

        try {
            MessageDigest sha224 = MessageDigest.getInstance("SHA-224");
            sha224.update(input.getBytes(StandardCharsets.UTF_8));
            return toHex(sha224.digest());

        } catch (NoSuchAlgorithmException e) {
            return null;
        }
    }

    private static String toHex(final byte[] hashBytes) {
        StringBuilder hexString = new StringBuilder();
        for (final byte hashByte : hashBytes) {
            hexString.append(Integer.toString((hashByte & 0xff) + 0x100, 16).substring(1));
        }
        return hexString.toString();
    }

 


 

인코딩
CSAP 항목으로 주요 로그는 인코딩이 되어야 합니다.
[apm_check_error]:%s;[apm_stack_trace]:%s;[apm_key]:%s;[apm_error_point]:%s; 데이터 전체를 UTF_16 charset으로 Base64 인코딩이 필요합니다.

    // Java 예시
    public static String encode(String format) {
        byte[] bytes = format.getBytes(StandardCharsets.UTF_16);
        return String.format("[LOG_FOR_APM]:%s",  Base64.encodeBase64String(bytes));
    }

 

최종적으로 [LOG_FOR_APM]:%s로 포맷으로 위에서 작업한 인코딩 된 문자열을 값으로 로그로 출력하면 Promtail을 통해 수집하여 Loki에 적재됩니다.

댓글