2016-07-01 18 views
1

今日私は、プログラム上の特定のアペンダーのログレベルを変更する必要があります。ユーザーは、休憩インターフェースまたはユーザー入力ダイアログを介してレベルを設定できる必要があります。私はアペンダーとフィルターを取得するためにクラスで遊んだが、これは私の期待に合わない。フィルタリストは既に空です。以下は私の設定の短い抜粋です:プログラムで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>

私はコンフィギュレーションを取得するためにLogManagerのクラスを使用して、まず、私はアペンダの名前で指定されたアペンダを取得すると思いました。しかし、アペンダーはフィルタのリストを提供していないので、それらを反復してThresholdFilterを取得し、レベルを設定することはできません。別の試みは、構成から直接フィルタリストを取得することでした。しかし、このリストは毎回空であるようです。レベルを設定する正しい方法を探すためのヒントを教えてもらえますか?

前もってありがとう、Hardie

答えて

2

アペンダーには1つのフィルターしかありません。あなたはAppender上でgetFilterメソッドを呼び出すことによってそれを取得します。そのフィルタはCompositeFilterであるかもしれません。その場合、それは他のフィルタのコンテナであり、必要なものを見つけるために反復処理する必要があります。上記の設定では、1つのフィルタしか使用できません。

ただし、ThresholdFilterのレベルは不変であるため、setLevelメソッドはありません。これを行うにはカスタムバージョンのフィルタを作成するか、Log4jを修正するためにJiraの問題を作成する必要があります。

1

カスタムフィルタを作成する場合は、AbstractFilterを拡張することをお勧めします。

関連する問題