오케스트레이션되지 않은 환경에서 Log4j 을 사용하여 Java 애플리케이션에 대한 사용자 지정 다중 줄 구문 분석을 지원하도록 1.6.x 로깅 에이전트 사용자 지정하기

이 자습서에서는 Java 애플리케이션에 대해 IBM® Cloud Logs 로깅 에이전트 멀티라인 로그 처리를 구성하는 방법을 보여줍니다 Log4j 로깅 프레임워크를 사용합니다. 이 구성은 오케스트레이션되지 않은 환경(예: Linux 및 Windows)을 위한 구성으로, 구성 파일을 수정합니다. 이 구성은 스택 추적 및 여러 줄 로그가 IBM Cloud Logs 에서 올바르게 그룹화되도록 합니다.

이 튜토리얼을 사용하려면 IBM Cloud Logs 로깅 에이전트 1.6.2 이상이 필요합니다.

시작하기 전에

이 튜토리얼을 사용하기 전에 다음 정보를 검토하여 로깅 에이전트 및 여러 줄 개념을 이해하세요.

이 튜토리얼에서는 이미 가지고 있다고 가정합니다:

  • 프로비저닝 및 구성된 IBM Cloud Logs 인스턴스입니다.

  • 오케스트레이션되지 않은 환경에 배포된 로깅 에이전트.

이 튜토리얼의 구성 파일은 로깅 에이전트 을 설치할 때 패키지 파일을 다운로드한 위치에서 찾을 수 있습니다.

샘플 Log4j 구성

Java 애플리케이션의 Log4j 콘솔 로그온(stdout)이 다음과 비슷하다고 가정해 보겠습니다:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

이 구성은 로그를 다음과 같은 형식으로 출력합니다: yyyy-MM-dd HH:mm:ss.SSS [thread] LEVEL logger - message 뒤에 개행이옵니다. 스택 추적과 같은 여러 줄의 메시지는 타임스탬프 접두사 없이 후속 줄에 표시됩니다. 예를 들어, 다음과 같습니다.

2025-07-28 10:32:15.423 [main] INFO com.example.logging.Main - Application starting up
2025-07-28 10:32:16.191 [main] INFO com.example.logging.Main - This is an info message
2025-07-18 10:32:18.801 [main] ERROR com.example.logging.Main - This is an error message
java.lang.NullPointerException: null
at com.example.logging.Main.lambda$main$3(Main.java:30) ~[java-log4j-1.0.0.jar:?]
at spark.RouteImpl$1.handle(RouteImpl.java:72) ~[java-log4j-1.0.0.jar:?]
at spark.http.matching.Routes.execute(Routes.java:61) ~[java-log4j-1.0.0.jar:?]
at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:134) ~[java-log4j-1.0.0.jar:?]
at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1584) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.Server.handle(Server.java:501) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:556) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:273) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) [java-log4j-1.0.0.jar:?]
at java.lang.Thread.run(Unknown Source) [?:?]

구성 파일을 사용하여 수동으로 여러 줄 구문 분석 구성하기

구성 파일을 사용하여 로깅 에이전트 을 수동으로 구성하는 경우 적절한 로깅 에이전트 구성 파일을 편집하여 여러 줄 구문 분석을 구성할 수 있습니다.

적절한 로그 그룹화를 보장하려면 log4j.xml 파일에 정의된 패턴이 여러 줄 구문 분석기의 정규식과 일치하는 것이 중요합니다.

여러 줄 구문 분석기 정의

Log4j 출력 패턴과 일치하는 사용자 지정 여러 줄 구문 분석기를 정의하세요. 이 정규식은 타임스탬프로 시작하는 줄을 새 항목으로 식별하고 타임스탬프가 없는 후속 줄은 이전 항목의 연속으로 취급합니다. 로깅 에이전트 parsers.conf 파일에 추가합니다.

예:

[MULTILINE_PARSER]
    Name            multiline-java-example
    Type            regex
    Flush_timeout   500
    Rule            "start_state"     "/^(\d+-\d+-\d+ \d+:\d+:\d+\.\d+)(.*)$/"     "cont"
    Rule            "cont"            "/^(?!\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}).*$/"     "cont"

이 정규식은 각 새 로그 줄이 yyyy-MM-dd HH:mm:ss.SSS 형식의 타임스탬프로 시작한다고 가정합니다. 첫 번째 규칙은 타임스탬프가 있는 시작 라인을 캡처하고 연속 상태로 이동합니다. 두 번째 규칙은 타임스탬프로 시작하지 않는 모든 줄을 일치시킵니다.

이 접근 방식은 Java 스택 추적 및 예외와 같은 여러 줄의 로그 행을 IBM Cloud Logs 으로 전달하기 전에 단일 로그 항목으로 그룹화하는 방법을 보여주기 위한 예일 뿐입니다. 같은 목적을 달성하는 방법에는 여러 가지가 있습니다.

다중 줄 필터로 구문 분석기를 적용합니다

로깅 에이전트 filters.conf 파일에 필터를 추가하여 애플리케이션의 태그와 일치하는 로그에 사용자 정의 구문 분석기를 적용하세요.

예를 들어, 다음과 같습니다.

[FILTER]
    Name              multiline
    Match             kube.*
    Multiline.key_content log
    Multiline.parser  multiline-java-example
    Emitter_Name      multiline-java

에이전트를 다시 시작하십시오.

구성 맵을 업데이트한 후 상담원을 다시 시작합니다.

  • Linux Linux 환경의 경우 실행합니다:

    systemctl daemon-reload && systemctl restart fluent-bit
    
  • Windows Windows 환경의 경우 실행합니다:

    sc.exe stop fluent-bit && sc.exe start fluent-bit
    

여러 줄 로그 확인

IBM Cloud Logs 인스턴스에 액세스하여 여러 줄 항목(예: 스택 추적)이 올바르게 그룹화되었는지 확인합니다.

  1. IBM Cloud Logs 인스턴스에 액세스합니다.

  2. 로그 탐색 로그 아이콘 보기를 사용하여 여러 줄의 항목이 올바르게 그룹화되었는지 확인합니다.

    그룹화된 로그 데이터는 log 필드에 포함되어 있습니다.