2016-07-01 77 views
1

今天我有一個要求以編程方式更改特定appender的日誌級別。用戶應該能夠通過休息界面或用戶輸入對話框來設置關卡。我在課堂上玩弄了appender和過濾器,但這不符合我的期望。過濾器列表已經是空的。下面是我配置的簡短片段:如何以編程方式更改ThresholdFilter的日誌級別?

<?xml version="1.0" encoding="UTF-8" ?> 
 
<Configuration status="warn" name="forum" monitorInterval="30"> 
 
    <properties> 
 
    <property name="logging.statement.pattern">%d{DATE} %-5p %-20.20t %m [|] %l [|] %x [|] %t%n</property> 
 
    </properties> 
 

 
    <Appenders> 
 
    <Console name="Console" target="SYSTEM_OUT"> 
 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 
 
    </Console> 
 
    <RollingFile name="FileLogAppender" fileName="${sys:logging.target.dir}/dicom.log" filePattern="${sys:logging.target.dir}/output-%i.log"> 
 
     <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" /> 
 
     <PatternLayout> 
 
     <Pattern>${logging.statement.pattern}</Pattern> 
 
     </PatternLayout> 
 
     <Policies> 
 
     <SizeBasedTriggeringPolicy size="10MB" /> 
 
     </Policies> 
 
     <DefaultRolloverStrategy max="10" /> 
 
    </RollingFile> 
 
    </Appenders> 
 

 
    <Loggers> 
 
    <Logger name="third.party.package" level="INFO" additivity="false"> 
 
     <AppenderRef ref="FileLogAppender" /> 
 
    </Logger> 
 
    <Logger name="my.custom.package.internal" level="TRACE" additivity="false"> 
 
     <AppenderRef ref="FileLogAppender" /> 
 
    </Logger> 
 
    <Logger name="my.standard.package" level="DEBUG" additivity="false"> 
 
     <AppenderRef ref="FileLogAppender" /> 
 
    </Logger> 
 

 
    <Root level="INFO"> 
 
     <AppenderRef ref="Console" /> 
 
    </Root> 
 
    </Loggers> 
 
</Configuration>

我用日誌管理類來獲取配置,然後首先我想獲得通過附加器的名稱指定的附加器。但appender不提供過濾器的列表,所以我不能遍歷它們以獲取ThresholdFilter並設置級別。另一個嘗試是直接從配置中獲取過濾器列表。但是這個清單似乎每次都是空的。任何人都可以給我一個提示,尋找正確的方法來設置關卡嗎?

在此先感謝,哈迪

回答

2

一個附加器只有一個過濾器。你可以通過調用Appender上的getFilter方法來獲得它。該過濾器可能是一個CompositeFilter,在這種情況下,它是其他過濾器的容器,並且您必須遍歷它們才能找到所需的過濾器。在上面的配置中,你只會有一個過濾器。

但是,ThresholdFilter中的級別是不可變的,所以沒有setLevel方法。您需要編寫過濾器的自定義版本才能做到這一點,或者創建一個Jira問題來修改Log4j。

1

如果你想寫一個自定義過濾器,你最好的選擇是延長AbstractFilter

相關問題