2017-03-07 3 views
1

Log4j2를 필터 또는 다른 구성 요소가 로그에서 특정 값을 걸러 낼 수 있도록 구성 할 수 있습니까?Log4j2에서 키를 기반으로 로거에서 특정 키 값 쌍을 필터링 할 수 있습니까?

는 다음 줄 지금

[operation=DONE, userName=junitUser, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca, 393ae7a0]], device=Device [id=12345, type=Pompom, info=Dot's Device]]], channel=null 
[operation=DONE, userName=junitUser224, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca,393ae7a0]], device=Device [id=123456, type=Mamamia, info=tom's Device]]], channel=null 

내가 로그가있는 방법으로 '사용자 이름 "필드를 필터링 할 수 있습니다 로그에 나타나는 말 (하지만 같은 라인의 다른 필드가 통과 할 수 있도록해야한다) 라인은 이제 아래와 같이 그것을 포함하지 않습니다?

[operation=DONE, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca, 393ae7a0]], device=Device [id=12345, type=Pompom, info=Dot's Device]]], channel=null 
[operation=DONE, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca,393ae7a0]], device=Device [id=123456, type=Mamamia, info=tom's Device]]], channel=null 

여기 이것은 RewriteAppender으로 수행 할 수 있습니다 내 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
    <RollingFile name="RollingFile" fileName="/Users/dunston/logs/app.log" 
       filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"> 
     <RegexFilter regex=".* zinger_log .*" onMatch="ACCEPT" onMismatch="DENY"/> 

     <PatternLayout> 
     <pattern>%d %p %c{1.} [%t] %m%n</pattern> 
     </PatternLayout> 
     <TimeBasedTriggeringPolicy /> 
    </RollingFile> 
    </Appenders> 
    <Loggers> 
    <Root level="debug"> 
     <AppenderRef ref="Console"/> 
     <AppenderRef ref="RollingFile"/>   
    </Root> 
    </Loggers> 
</Configuration> 
+0

고유 확장자를 사용하지 않고 이것이 가능한지 확실하지 않습니다. 그러나 데이터 구조를 로깅하는 것처럼 보입니다. 그렇습니까? 그렇다면, 호출하기 전에 대신 데이터 구조에서 사용자 이름을 제거하는 메소드를 작성하십시오. – Jeremy

+0

@ 제레미 응답에 감사드립니다. 달성하고자하는 한 가지는 '구성 가능성'의 용이성이었습니다. 마찬가지로 최종 사용자가 log4j2 구성을 변경하여 특정 필드를 허용/금지하도록 허용 할 수있는 것처럼, 그러한 기능이 이미 패키지의 일부로 사용 가능하다면. 또한이 유형의 로그를 생성하기위한 데이터 구조의 복사본을 필터링하기 시작했습니다. 아마도 log4j2에서 ThreadContext를 통해 필드 이름을 가져 와서 롤링 파일 로그에 쓰기 전에 필드의 키와 값을 필터링하십시오. 다른 우아한 접근 방식을 사용할 수 있는지 확실하지 않은가요? – user46743

답변

1

입니다.

LogEvent의 메시지를 검사하는 사용자 정의 RewritePolicy을 작성해야하며, 형식화 된 메시지에 필터링하려는 정규 표현식이 포함되어 있으면 다른 인스턴스로 대체하십시오.

사용자 정의 RewitePolicy를 다른 표준 Log4j2 plugin과 같은 구성으로 구성 할 수 있습니다.

+0

대단히 감사합니다! 그것을 체크하고 스레드를 업데이트 할 것입니다. – user46743

+0

작동하는 것처럼 보입니다. 비슷한 메모에, 내가 패턴 대신에 패턴을 기록하기위한 문자열 csv 패턴이있는 경우, PatternLayout 접근법을 사용하여 regex replace로 대체해야 할 수도 있다고 생각합니까? – user46743