Log Agent
에이전트 설치/실행
Q1 : 쿠버네티스 환경에서 에이전트를 특정 노드에만 배포하고 싶은 경우 어떻게 설정하나요?
쿠버네티스 환경 로그 에이전트는 데몬셋(Daemonset) 으로 설치됩니다. 로그 에이전트 daemonset.yml 파일에 Node Selector 또는 Node Affinity 설정을 추가하여 특정 노드에만 배포할 수 있습니다.
배포하고 싶은 노드에 특정 라벨이 설정되어 있는 경우 Node Selector를 사용하여 다음과 같은 방법으로 설정할 수 있습니다.
// dsk-log-agent daemonset.yml 파일
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: dsk-log-agent
namespace: datasaker
spec:
template:
spec:
nodeSelector:
datasakerAgent: true
...
또는 Node Affinity 를 사용하여 다음과 같은 방법으로 설정할 수 있습니다.
// dsk-log-agent daemonset.yml 파일
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: dsk-log-agent
namespace: datasaker
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: datasakerAgent
operator: In
values:
- "dsk-log-agent"
...
참고자료: 노드 어피니티를 사용해 노드에 파드 할당 | Kubernetes
Q2 : 로그 에이전트가 정상적으로 실행되지 않습니다.
로그 에이전트가 정상적으로 동작하지 않는다면, 다음 항목들을 순차적으로 확인해보세요.
[1] 에이전트 구성 파일 설정에이전트가 정상적으로 동작하기 위해서는 올바른 global, agent 구성 YAML 파일 설정이 요구됩니다.
[2] (도커 환경인 경우) 에이전트 설정 파일 및 로그 수집 파일 볼륨 마운트 설정로그 에이전트 컨테이너에 설정 파일과 수집하려는 로그 파일이 정상적으로 마운트되었는지 확인하세요.
[3] (도커 환경인 경우) 로그 에이전트 실행 Flag 설정도커 환경 로그 에이전트 실행 시 -mount.volume=true
flag 옵션을 포함하여 실행하였는지 확인하세요.로그 에이전트가 정상적으로 실행되지만 로그 수집이 안되는 경우는 다음 항목을 확인해보세요.
[1] 라이센스 유효 기간
[2] 네트워크 상태
그 이외의 경우, 로그 에이전트에 문제가 있다면 데이터세이커의 문의하기를 이용 부탁드립니다.
Q3 : Ubuntu 18.04 환경이 아닌 다른 환경에서 로그 에이전트를 설치해서 사용할 수 없나요?
현재 로그 에이전트는 Ubuntu 18.04 환경을 제외한 환경은 지원하지 않고 있습니다. 다른 환경에서 로그를 수집하고 싶은 경우, 해당 환경에 Host용 로그 에이전트를 설치할 수 없지만 도커를 사용하여 Container용 로그 에이전트를 사용하면 로그를 수집할 수 있습니다.
에이전트 구성 파일 설정
Q1 : 에이전트 구성 YAML 파일 설정에서 service 항목은 무엇인가요?
에이전트 구성 YAML 파일에서 서비스 항목은 사용자가 수집한 로그에 대해 라벨을 설정하는 것과 유사합니다. 해당 정보를 통해 사용자에게 로그를 분류하여 보기 쉽게 보여줍니다. 다음은 서비스 설정 항목에 대한 설명이 포함된 표입니다.
service 설정 | 설정 항목 | 기본 값 | 설명 |
name | 사용자 지정 | default | 서비스 이름을 설정하여 사용자는 로그를 분류해서 확인할 수 있습니다. |
category | app , database , syslog , etc 중 하나의 항목 | etc | 수집 로그에 대한 서비스 종류를 설정합니다. 서비스 종류에 따라 로그를 분류하여 확인할 수 있습니다. |
type | postgres , mysql , java , etc 중 하나의 항목 | etc | 다중 라인 로그 수집을 위한 로그 서비스 타입입니다. (* 다중 라인 로그 수집은 에이전트 로그 설정 파트를 참고하세요.) |
address | 사용자 지정 | - | 데이터베이스 메트릭 정보와 함께 보여주기 위한 설정입니다. 미설정 시 해당 기능 사용이 불가능합니다. (서비스 category가 database인 경우만 작성해주세요.) |
Q2 : 쿠버네티스 환경 로그 에이전트 구성 파일 설정에서 워크로드는 무엇인가요?
워크로드는 쿠버네티스에서 구동되는 애플리케이션을 의미합니다. (워크로드가 단일 컴포넌트이거나 함께 작동하는 여러 컴포넌트이든 관계없이, 쿠버네티스에서는 워크로드를 일련의 Pod 집합 내에서 실행됩니다.) 쿠버네티스에는 다음과 같이 여러 가지 빌트인(built-in) 워크로드 리소스를 제공합니다. (Deployment, Replicaset, StatefulSet, DaemonSet)collect.workloads
에는 수집하고자 하는 워크로드의 이름을 작성하면 해당 로그 파일을 수집합니다. (/var/log/containers/WORKLOAD_NAME.log)예를 들어, 'app-server' 라는 워크로드 이름으로 Pod가 배포되었을 때 해당 Pod의 Container로그는 Workload 이름과 함께 해쉬값이 더해진 파일명으로 생성됩니다. (app-server-5f4b7f7b4f-2q9qz.log) 해당 로그를 수집하기 위해서는 collect.workloads
에 'app-server' 를 작성하면 자동으로 해당 로그를 수집합니다.
에이전트 로그 설정
Q1 : 다중 라인으로 구성되어 있는 로그가 여러 라인으로 잘려서 수집됩니다. 한 줄에 로그 메시지를 수집하고 싶은 경우 어떻게 할 수 있나요?
이상적인 환경에서는 로그가 한 줄에 메시지를 기록할 수 있지만 실제로 여러 응용 프로그램은 동일한 컨텍스트에 속하는 여러 로그 메시지를 생성합니다.
Feb 12 12:42:08 Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
at com.myproject.module.MyProject.badMethod(MyProject.java:22)
at com.myproject.module.MyProject.oneMoreMethod(MyProject.java:18)
at com.myproject.module.MyProject.anotherMethod(MyProject.java:14)
at com.myproject.module.MyProject.someMethod(MyProject.java:10)
at com.myproject.module.MyProject.main(MyProject.java:6)
위와 같이 동일 컨텍스트에 속하는 여러 로그 메시지를 하나의 메시지로 수집하고 싶은 경우, 로그 에이전트에서 제시하는 형식에 맞추어 로그 포맷을 설정해야 합니다.
모든 로그에는 시간 정보를 포함하여 메시지가 구성됩니다. 이러한 특성을 이용하여 다중 라인 로그 메시지를 하나의 메시지로 인식할 수 있습니다.
각각의 로그 메시지 시작 지점의 Time Format에 형식을 지정하여 일치할 경우, 하나의 컨텍스트를 갖는 로그 메시지로 인식하여 함께 수집할 수 있도록 지원합니다.
로그 에이전트는 다음과 같은 로그 포맷을 지원합니다.
Database 종류 또는 애플리케이션 언어 | Log Time Format (예시) | Time Format Regular Expression | service.category | service.type |
PostgreSQL | 2023-06-21 13:24:26.899 | \d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}.\d{1,3} | database | postgres |
MySQL | 2023-06-21T13:24:26.329573Z | \d{4}-\d{1,2}-\d{1,2}\D\d{1,2}:\d{1,2}:\d{1,2}.\d{1,10}\D | database | mysql |
Java | 2023-06-21T13:24:26.899 | \d{4}-\d{1,2}-\d{1,2}\D\d{1,2}:\d{1,2}:\d{1,2}.\d{1,3} | app | java |
각각의 데이터베이스 및 애플리케이션 개발 언어 종류에 따라 로그 시간 포맷을 위와 같이 설정할 경우, 하나의 로그 메시지로 수집할 수 있습니다.
- PostgreSQL 로그 설정 방법
PostgreSQL 로그 포맷은 etc/postgresql/<VERSION>/main/postgresql.conf
파일을 수정하여 변경할 수 있습니다. 해당 파일에서 log_line_prefix 설정을 통해 로그 시간 포맷을 변경할 수 있습니다.해당 설정에 %m
또는 %n
설정을 가장 앞에 설정하여 다중 라인 로그를 수집할 수 있습니다. 다음은 로그 설정 예시입니다.log_line_prefix = '%m [%p] %q%u@%d [%c] [%x] '
참고자료: PostgreSQL: Documentation: 15: 20.8. Error Reporting and Logging
- MySQL 로그 설정 방법
MySQL 의 로그 시간 포맷의 기본 값은 ISO 8601 포맷입니다. (YYYY-MM-DDThh:mm:ss.uuuuuuZ
)해당 로그 시간 포맷(UTC)을 사용 시 다중 라인 로그를 수집할 수 있습니다.
참고자료: MySQL :: MySQL 8.0 Reference Manual :: 5.1.8 Server System Variables
- Java 로그 설정 방법
Java 로그는 Log4j 로그 패턴을 ISO 8601 형식으로 지정하여 다중 라인 로그를 수집할 수 있습니다<PatternLayout pattern="%d{ISO8601} ...
참고자료: Log4j – Log4j 2 Layouts (apache.org)
Q2 : 커스텀 로그 포맷으로 다중 라인 로그 수집을 할 수 없나요?
로그 에이전트는 현재 지정된 로그 포맷에서만 다중 라인 로그 수집을 지원하고 있습니다. 추후 다양한 로그 포맷으로도 다중 라인 로그 수집 기능을 지원할 예정입니다.
Q3 : 로그 메시지 속 민감 정보가 포함되어 있습니다. 해당 부분을 마스킹할 수 있는 방법이 있나요?
로그 에이전트에서 현재 민감 정보 마스킹 기능은 지원하지 않고 있습니다.
에이전트 구성 파일(agent YAML file)에서 collect.keyword
를 통해 제한적으로 수집하거나 collect.exclude_paths
설정을 통해 민감 정보가 포함된 로그를 제외하십시오.