10.3. 로깅 하위 시스템 구성 개요
JBoss EAP 로깅 하위 시스템은 구성에 로그 카테고리 및 로그 처리기를 사용합니다. 로그 카테고리는 캡처할 메시지를 지정하는 반면 로그 처리기는 디스크에 작성하거나 콘솔에 전송하는 등 이러한 메시지를 처리하는 방법을 정의합니다.
애플리케이션 로깅 프로필을 사용하면 기본 로깅 설정과 별도로 배포 또는 여러 배포에 할당할 수 있는 고유하게 이름이 지정된 로깅 구성을 만들 수 있습니다. 로깅 프로파일 구성은 기본 로깅 하위 시스템의 구성과 거의 동일합니다.
10.3.1. 루트 로거 구성 링크 복사링크가 클립보드에 복사되었습니다!
JBoss EAP 루트 로거는 로거에서 캡처하지 않는 지정된 로그 수준 이상에서 모든 로그 메시지를 캡처합니다. 그러나 정의된 로거에 use-parent-handlers 가 true로 설정되어 있고 처리기도 정의된 경우 정의된 로거와 루트 로거를 사용하여 메시지를 처리합니다.
기본적으로 루트 로거는 콘솔과 server.log 파일에 쓰는 주기적인 로그 처리기를 사용합니다. 이 파일은 일반적으로 서버 로그라고 합니다.
10.3.2. JBoss EAP의 로그 카테고리 링크 복사링크가 클립보드에 복사되었습니다!
로그 카테고리는 캡처할 로그 메시지 세트와 해당 메시지를 처리할 하나 이상의 로그 처리기를 정의합니다.
로그 메시지는 지정된 원본 및 로그 수준에 따라 결정됩니다. 모든 문자열 값을 지정할 수 있습니다. 그러나 패키지 이름 또는 클래스 이름을 사용하는 것이 좋습니다. 로거 이름은 점 표기법을 사용하여 지정됩니다(예: Logger.getLogger("example.logger.name"). 로그 관리자는 이름의 각 섹션을 처리하고 일치하는 구성을 확인합니다. find 및 use-parent-handlers 가 false로 설정되면 프로세스가 중지됩니다. 구성이 정의되지 않았거나 use-parent-handlers 가 true로 설정된 경우 기본적으로 로그 관리자는 "example.logger"와 같은 상위 이름을 계속 확인합니다. 로거 구성은 패키지 또는 클래스 이름이 아닌 로거 생성 방법에 따라 다릅니다.
로그 카테고리는 일반적으로 Java 패키지 및 클래스 이름을 기반으로 하지만 Logger.getLogger(LOGGER_NAME) 메서드에서 지정하는 모든 이름일 수 있습니다.
로거에 처리기가 할당될 수 있습니다. use-parent-handlers 가 false 로 설정된 경우 로거에서 loggable로 결정하더라도 더 높은 수준의 로거가 메시지를 처리하지 않습니다. 예를 들어 로거 이름이 org.jboss.as.logging 이고 use-parent-handlers=false 로 구성된 경우 org.jboss.as 로거를 확인하지 않습니다.
10.3.3. JBoss EAP의 로그 처리기 링크 복사링크가 클립보드에 복사되었습니다!
로그 처리기는 캡처된 로그 메시지가 기록되는 방식을 정의하고 항목의 대상 및 형식을 지정합니다. 각 유형이 다양한 요구 사항에 맞는 고유한 용도로 제공되므로 다양한 유형의 로그 처리기를 이해하는 것이 중요합니다.
활성화하려면 로그 처리기를 하나 이상의 로거에 추가해야 합니다.
10.3.3.1. 로그 처리기 유형 링크 복사링크가 클립보드에 복사되었습니다!
로그 처리기는 로그 항목이 처리 및 저장되는 방법을 결정하는 여러 유형으로 분류됩니다. 각 유형에는 다양한 로깅 요구 사항을 충족하는 고유한 기능이 있습니다.
-
콘솔: 호스트 운영 체제의 표준 아웃,
stdout또는 표준 오류,stderr, stream에 로그 메시지를 작성합니다. 이러한 메시지는 JBoss EAP가 명령줄 프롬프트에서 실행되면 표시됩니다. 콘솔 로그 처리기의 메시지는 표준 출력 또는 표준 오류 스트림을 캡처하도록 운영 체제를 구성하지 않는 한 저장되지 않습니다. - 파일: 지정된 파일에 로그 메시지를 작성합니다.
- periodic: 지정된 기간이 경과할 때까지 이름이 지정된 파일에 로그 메시지를 작성합니다. 그 후 파일의 이름이 타임스탬프로 변경되고 처리기는 원래 이름으로 새로 생성된 로그 파일에 계속 씁니다.
- size: 파일이 지정된 크기에 도달할 때까지 이름이 지정된 파일에 로그 메시지를 씁니다. 파일이 해당 크기에 도달하면 숫자 접미사로 이름이 변경되고 처리기는 원래 이름을 사용하여 새로 생성된 로그 파일에 계속 씁니다. 각 크기 로그 처리기는 이러한 방식으로 유지할 최대 파일 수를 지정해야 합니다.
- periodic Size: 파일이 지정된 크기에 도달하거나 지정된 기간이 만료될 때까지 이름이 지정된 파일에 로그 메시지를 작성합니다. 그러면 처리기에서 파일의 이름을 바꾸고 새로 생성된 로그 파일에 원래 이름으로 계속 씁니다. 이 처리기는 periodic 및 size 로그 처리기의 기능을 결합합니다.
- syslog: 원격 로깅 서버로 메시지를 보냅니다. 이를 통해 여러 애플리케이션에서 구문 분석을 위해 로그 메시지를 동일한 서버로 보낼 수 있습니다.
- 소켓: 소켓 을 통해 로그 메시지를 원격 로깅 서버로 보냅니다. TCP 또는 UDP 소켓을 사용할 수 있습니다.
-
Custom: 새로운 유형의 로그 처리기를 구성할 수 있습니다. 사용자 지정 처리기는
java.util.logging.Handler를 확장하고 모듈에 포함하는 Java 클래스로 구현해야 합니다. Log4J appender를 사용자 지정 로그 처리기로 사용할 수도 있습니다. - 하나 이상의 다른 로그 처리기에 대한 비동기 동작을 제공합니다. 이 기능은 네트워크 파일 시스템에 로그 파일 쓰기와 같이 대기 시간이 길거나 성능 문제가 발생할 수 있는 로그 처리기에 유용합니다.
10.3.4. JBoss EAP에서 지원되는 로그 수준 링크 복사링크가 클립보드에 복사되었습니다!
로그 수준은 로그 메시지의 특성 및 심각도를 나타내는 열거된 값입니다. 개발자는 선택한 로깅 프레임워크의 적절한 방법을 사용하여 메시지를 전송하여 로그 메시지의 수준을 지정할 수 있습니다.
JBoss EAP는 지원되는 애플리케이션 로깅 프레임워크에서 사용하는 모든 로그 수준을 지원합니다. 가장 일반적으로 사용되는 로그 수준은 TRACE,DEBUG,INFO,WARN,ERROR 및 FATAL 입니다.
로그 수준은 로그 카테고리 및 핸들러에서 처리하는 메시지를 제한하는 데 도움이 됩니다. 각 로그 수준에는 다른 로그 수준을 기준으로 순서를 나타내는 숫자 값이 할당됩니다. 로그 카테고리 및 핸들러에는 로그 수준이 할당되고 해당 수준 이상의 로그 메시지만 처리합니다. 예를 들어 WARN 수준이 있는 로그 처리기는 ,WARN ERROR 및 FATAL 에 메시지를 기록합니다.
| 로그 수준 | 현재의 | 설명 |
|---|---|---|
| ALL | Integer.MIN_VALUE | 모든 로그 메시지를 제공합니다. |
| FINEST | 300 | - |
| FINER | 400 | - |
| TRACE | 400 |
|
| DEBUG | 500 |
|
| OK | 500 | - |
| CONFIG | 700 | - |
| INFO | 800 |
|
| WARN | 900 |
|
| 경고 | 900 | - |
| 오류 | 1000 |
|
| 심각 | 1000 | - |
| 치명적 | 1100 |
|
| OFF | Integer.MAX_VALUE | 로그 메시지를 표시하지 않습니다. |
ALL 은 가장 낮은 로그 수준이며 모든 로그 수준의 메시지를 포함합니다. 이는 가장 많은 로깅을 제공합니다.
FATAL 은 가장 높은 로그 수준이며 해당 수준의 메시지만 포함합니다. 이는 최소 로깅 양을 제공합니다.
10.3.5. JBoss EAP의 로그 형식 생성 링크 복사링크가 클립보드에 복사되었습니다!
로그 형식 LimitRange는 로그 메시지를 포맷하는 데 사용됩니다. named-formatter 특성을 사용하여 로깅 처리기에 포맷터를 할당할 수 있습니다.
10.3.5.1. 로그 포맷의 유형 링크 복사링크가 클립보드에 복사되었습니다!
로그 포맷터는 로그 항목의 포맷 방법을 결정하는 여러 유형으로 분류됩니다.
로깅 하위 시스템에는 다음 네 가지 유형의 포맷이 포함됩니다.
-
pattern formatter: 일반 텍스트로 로그 메시지를 포맷합니다.
formatter를 로그 처리기의named-formatter속성으로 사용하는 것 외에도 먼저 포맷터 리소스를 생성할 필요 없이 포맷터 속성으로 사용할 수도 있습니다. - JSON formatter: JSON으로 로그 메시지를 포맷합니다.
- XML formatter: XML로 로그 메시지를 포맷합니다.
-
사용자 지정 포맷터: 처리기와 함께 사용됩니다. 대부분의 로그 레코드는 Cryostat 형식으로 포맷됩니다. 포맷터는 적절한 포맷을 위해
org.jboss.logmanager.ExtLogRecord#getFormattedMessage()를 호출해야 할 수 있습니다.
10.3.6. JBoss EAP에서 로깅을 위한 필터 표현식 링크 복사링크가 클립보드에 복사되었습니다!
filter-spec 특성을 사용하여 구성된 필터 표현식은 다양한 기준에 따라 로그 메시지를 기록합니다. 필터는 포맷되지 않은 원시 메시지에 적용됩니다. 로거 또는 처리기에 필터를 추가할 수 있지만 로거 필터는 처리기에 배치된 필터보다 우선합니다.
루트 로거에 대해 지정된 필터 사양 은 다른 로거에 상속되지 않습니다. 대신 처리기당 필터 사양 을 지정해야 합니다.
다음 표에서는 로깅에 사용 가능한 필터 표현식을 설명합니다.
| 필터 표현식 | 설명 |
|---|---|
| accept | 모든 로그 메시지를 수락합니다. |
| deny | 모든 로그 메시지를 거부합니다. |
| not[filter expression] | 단일 필터 표현식의 반전된 값을 반환합니다. 예를 들면 다음과 같습니다.
|
| all[filter expression] | 쉼표로 구분된 필터 표현식 목록에서 연결된 값을 반환합니다. 예를 들면 다음과 같습니다.
|
| any[filter expression] | 쉼표로 구분된 필터 표현식 목록에서 하나의 값을 반환합니다. 예를 들면 다음과 같습니다.
|
| levelChange[level] | 지정된 수준으로 로그 레코드를 업데이트합니다. 예를 들면 다음과 같습니다.
|
| levels[levels] | 쉼표로 구분된 수준 목록에 나열된 수준으로 로그 메시지를 필터링합니다. 예를 들면 다음과 같습니다.
|
| levelRange[minLevel,maxLevel] |
지정된 수준 범위 내에서 로그 메시지를 필터링합니다.
|
| match["pattern"] | 제공된 정규식을 사용하여 로그 메시지를 필터링합니다. 예를 들면 다음과 같습니다.
|
| substitute["pattern","replacement value"] | 패턴(first argument)에 대한 첫 번째 일치 항목을 대체 텍스트(두 번째 인수)로 바꿉니다. 예를 들면 다음과 같습니다.
|
| substituteAll["pattern","replacement value"] | 패턴(first argument)의 모든 일치 항목을 대체 텍스트(두 번째 인수)로 바꿉니다. 예를 들면 다음과 같습니다.
|
관리 CLI를 사용하여 필터 표현식을 구성할 때 필터 텍스트에서 쉼표와 인용 표시를 이스케이프하여 값이 문자열로 올바르게 처리되도록 합니다. 쉼표와 따옴표 앞에 백슬래시(\)를 사용하고 전체 표현식을 따옴표로 래핑해야 합니다. 다음은 적절하게 이스케이프하는 예제입니다 All("WFLY","YLFW").
/subsystem=logging/console-handler=CONSOLE:write-attribute(name=filter-spec, value="substituteAll(\"WFLY\"\,\"YLFW\")")
10.3.7. JBoss EAP의 암시적 로깅 종속성 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 JBoss EAP 로깅 하위 시스템은 암시적 로깅 API 종속 항목을 배포에 추가합니다. 기본적으로 true 로 설정된 add-logging-api-dependencies 특성을 사용하여 이러한 암시적 종속성이 배포에 추가되는지 여부를 관리할 수 있습니다.
이러한 종속성이 추가되지 않도록 하려면 관리 CLI를 사용하여 add-logging-api-dependencies 특성을 false 로 설정합니다.
/subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)