오케스트레이션 환경에서 Log4j 을 사용하여 Java 애플리케이션에 대한 사용자 지정 다중 줄 구문 분석을 지원하도록 1.6.x 로깅 에이전트 사용자 지정하기
이 자습서에서는 Java 애플리케이션에 대해 IBM® Cloud Logs 로깅 에이전트 멀티라인 로그 처리를 구성하는 방법을 보여줍니다 Log4j 로깅 프레임워크를 사용합니다. 이 구성은 오케스트레이션 환경(예: IBM Cloud Kubernetes Service 및 Red Hat OpenShift on IBM Cloud )을 위한 구성이며 Helm 을 사용합니다. 이 구성은 스택 추적 및 여러 줄 로그가 IBM Cloud Logs 에서 올바르게 그룹화되도록 합니다.
이 튜토리얼을 사용하려면 IBM Cloud Logs 로깅 에이전트 1.6.0 이상이 필요합니다.
시작하기 전에
이 튜토리얼을 사용하기 전에 다음 정보를 검토하여 로깅 에이전트 및 여러 줄 개념을 이해하세요.
이 튜토리얼에서는 이미 가지고 있다고 가정합니다:
-
프로비저닝 및 구성된 IBM Cloud Logs 인스턴스입니다.
-
오케스트레이션 환경에 배포된 로깅 에이전트.
-
Kubernetes Service IBM Cloud Kubernetes Service
-
Red Hat OpenShift on IBM Cloud Red Hat OpenShift on IBM Cloud
-
샘플 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) [?:?]
다음을 사용하여 여러 줄 구문 분석 구성 Helm
Helm 을 사용하여 로깅 에이전트 을 배포하는 경우 Helm values.yaml 파일에서 여러 줄 구문 분석을 구성할 수 있습니다.
여러 줄 구문 분석 사용
values.yaml 파일에서 enableMultiline 을 true 으로 설정하여 여러 줄 처리를 활성화합니다:
enableMultiline: true
여러 줄 구문 분석기 정의
values.yaml 파일의 additionalMultilineParsers 섹션 아래에 사용자 정의 여러 줄 구문 분석기를 추가합니다.
적절한 로그 그룹화를 위해서는 log4j.xml 파일에 정의된 패턴이 여러 줄 구문 분석기의 정규식과 일치하는 것이 중요합니다.
예:
additionalMultilineParsers:
- name: multiline-java-example
type: regex
flush_timeout: 500
rules:
- state: start_state
regex: '/^(\d+-\d+-\d+ \d+:\d+:\d+\.\d+)(.*)$/'
next_state: cont
- state: cont
regex: '/^(?!\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}).*$/'
next_state: cont
이 정규식은 각 새 로그 줄이 yyyy-MM-dd HH:mm:ss.SSS 형식의 타임스탬프로 시작한다고 가정합니다. 첫 번째 규칙은 타임스탬프가 있는 시작 라인을 캡처하고 연속 상태로 이동합니다. 두 번째 규칙은 타임스탬프로 시작하지 않는 모든 줄을 일치시킵니다.
이 접근 방식은 Java 스택 추적 및 예외와 같은 여러 줄의 로그 행을 IBM Cloud Logs 으로 전달하기 전에 단일 로그 항목으로 그룹화하는 방법을 보여주기 위한 예일 뿐입니다. 같은 목적을 달성하는 방법에는 여러 가지가 있습니다.
멀티라인 전처리기 정의하기
multilinePreprocessor 섹션에서 전처리기를 구성하여 구문 분석기를 로그에 적용하세요.
예를 들어, 다음과 같습니다.
multilinePreprocessor:
- name: multiline
multiline.parser: multiline-java-example
multiline.key_content: log
변경사항을 적용하십시오.
이전 버전의 로깅 에이전트 을 설치하고 클러스터에서 직접 구성 맵을 수정하여 상담원 구성을 업데이트한 경우에는 helm upgrade 명령을 실행하기 전에 클러스터에서 구성 맵의 복사본을 만드세요. 로깅 에이전트 이 업데이트되면 구성 맵의 모든 변경 사항을 덮어씁니다.
values.yaml 파일을 업데이트한 후 배포에서 다음을 실행하여 변경 사항을 적용합니다. 이렇게 하면 필요한 구성이 다시 생성됩니다.
helm upgrade
여러 줄 로그 확인
IBM Cloud Logs 인스턴스에 액세스하여 여러 줄의 항목(예: 스택 추적)이 올바르게 그룹화되었는지 확인합니다.
-
로그
보기를 사용하여 여러 줄의 항목이 올바르게 그룹화되었는지 확인합니다.