오케스트레이션되지 않은 환경에서 Log4j 을 사용하여 Java 애플리케이션에 대한 사용자 지정 다중 줄 구문 분석을 지원하도록 1.6.x 로깅 에이전트 사용자 지정하기
이 자습서에서는 Java 애플리케이션에 대해 IBM® Cloud Logs 로깅 에이전트 멀티라인 로그 처리를 구성하는 방법을 보여줍니다 Log4j 로깅 프레임워크를 사용합니다. 이 구성은 오케스트레이션되지 않은 환경(예: Linux 및 Windows)을 위한 구성으로, 구성 파일을 수정합니다. 이 구성은 스택 추적 및 여러 줄 로그가 IBM Cloud Logs 에서 올바르게 그룹화되도록 합니다.
이 튜토리얼을 사용하려면 IBM Cloud Logs 로깅 에이전트 1.6.2 이상이 필요합니다.
시작하기 전에
이 튜토리얼을 사용하기 전에 다음 정보를 검토하여 로깅 에이전트 및 여러 줄 개념을 이해하세요.
-
오케스트레이션되지 않은 환경에서의 멀티라인 지원에 대해 알아보세요.
이 튜토리얼에서는 이미 가지고 있다고 가정합니다:
이 튜토리얼의 구성 파일은 로깅 에이전트 을 설치할 때 패키지 파일을 다운로드한 위치에서 찾을 수 있습니다.
샘플 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 인스턴스에 액세스하여 여러 줄 항목(예: 스택 추적)이 올바르게 그룹화되었는지 확인합니다.
-
로그
보기를 사용하여 여러 줄의 항목이 올바르게 그룹화되었는지 확인합니다.
그룹화된 로그 데이터는
log필드에 포함되어 있습니다.