본문 바로가기

Programming/Tip&Informaion

[log4j2] log4j2 설정법 및 spark operator 연동 (feat. datahub 로깅)

데이터허브를 spark에 연동하면 데이터허브 로그가 추가로 발생하게 되는데 이 로그의 양이 spark로그 보다 많게 느껴지는 경우가 많다.

로깅 레벨에 대해서 데이터허브를 찾아보면

 

log4j.properties 파일에

 

log4j.logger.datahub.spark=DEBUG

log4j.logger.datahub.client.rest=DEBUG

 

를 추가해서 디버깅하는 법이 나와있다.

 

근데 현재 사용하는 스파크 버전에서는 log4j 가 아니고 log4j2를 사용하고 있어서 뭔가 애매한 상황이었다.

 

여러가지 시도를 하다가 위 구문을 log4j2 형식에 맞게 변형하면 사용이 가능하고, 그 외에도 원하는 패키지의 로그 레벨을 자유롭게 지정이 가능하다는 걸 알게 됐다.

 

* log4j2.properties 생성

    #Root logger 설정

    rootLogger.level = INFO
    rootLogger.appenderRefs = Console
    rootLogger.appenderRef.console.ref = Console

 

    # Console Appender 설정
    appender.console.name = Console
    appender.console.type = Console
    appender.console.layout.type = PatternLayout
    appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

 

    # DataHub Spark 로깅 설정
    logger.datahubSpark.name = datahub.spark
    logger.datahubSpark.level = OFF

 

Root logger는 기본적인 로그 형식에 대한 내용인 것 같고, Console Appender는 로그 패턴을 지정하기 위한 걸로 추정된다.

가장 중요한 건 맨 아래 DataHub Spark 로깅 설정 부분인데

logger.<적당한 변수명>.name = <설정할 패키지명>

logger.<적당한 변수명>.level = OFF/WARNING/INFO/DEBUG 등으로 설정하면 된다.

 

따라서 위의 방식으로 하면 datahub.spark 패키지 내의 로그가 OFF가 된다.

이런 식으로 제외하거나 조정하고 싶은 패키지 명을 찾아서 지정하면 된다.

 

k8s 상에서 돌리는 경우 해당 부분은 ConfigMap에 저장하고, mount하면 된다.

 

1. ConfigMap 생성 (log4j2.yaml)

apiVersion: v1
kind: ConfigMap
metadata:
  name: log4j2-config
  namespace: de-emr
data:
  log4j2.properties: |
    # 위 내용 추가

 

2. kubectl apply -f log4j2.yaml -n namespace

 

3. spark operator 에서 driver에 configmap mount를 한다.

driver:

  configMaps:

     name: log4j2-config

     path: /opt/spark/conf #적당한 경로

 

4.  extraJavaOptions에 추가한다.

spark.driver.extraJavaOptions: (기존값) -Dlog4j2.configurationFile=file:/opt/spark/conf/log4j2.properties

 

excutor도 동일하게 하면 되는데 굳이 필요는 없는 듯