서비스나 사용자 애플리케이션 기동 시 Cloudera 의 로그 마스킹 appender 클래스를 찾지 못한다는 오류가 난다.
log4j:ERROR Could not instantiate class [com.cloudera.log4j.redactor.RedactorAppender]
java.lang.ClassNotFoundException: com.cloudera.log4j.redactor.RedactorAppender
Cloudera 의 로그 리댁션 기능은 log4j-redactor 라이브러리가 제공하는 appender 로 구현된다. log4j.properties 가 이 appender 를 참조하는데 해당 JAR 이 클래스패스에 없으면 위 오류가 난다.
발생하는 경우는 대체로 셋 중 하나다.
첫째, 서비스 설정을 복사해 사용자 애플리케이션에 붙인 경우다. Cloudera 가 관리하는 서비스는 파셀의 JAR 이 자동으로 클래스패스에 들어가지만, 별도로 실행하는 애플리케이션은 그렇지 않다.
둘째, 업그레이드나 파셀 교체 후 클래스패스가 옛 경로를 가리키는 경우다.
셋째, 셰이딩된 fat JAR 로 패키징하면서 이 라이브러리가 빠진 경우다.
가장 간단한 방법이다. 복사해 온 log4j.properties 에서 redactor appender 참조를 제거하고 일반 appender 로 바꾼다. 리댁션은 로그에 찍히는 민감 값을 가리는 기능이므로, 그 요건이 없는 애플리케이션이라면 설정을 지우는 것이 맞다.
파셀 안에 들어 있는 JAR 을 찾아 쓴다.
find /opt/cloudera/parcels/CDH/jars -name 'logredactor*.jar' -o -name 'log4j-redactor*.jar'
찾은 JAR 을 실행 클래스패스에 추가한다. 클래스가 실제로 들어 있는지는 다음으로 확인한다.
unzip -l <찾은-jar> | grep -i redactor
버전과 아티팩트 이름은 CDP 버전마다 다르므로 빌드 도구에 좌표를 고정해 쓰기보다 파셀에 포함된 JAR 을 그대로 쓰는 편이 안전하다 — 확인 필요.
애플리케이션 기동 로그에 해당 오류가 사라지고, 리댁션을 의도한 경우라면 마스킹 규칙이 적용된 형태로 로그가 남는지 확인한다.