2017-11-07 15 views
0

log4j 2.5を使用しています。私の質問はConferenceLogですので、以下の設定は無視してください。log4j設定によるオープンファイルが多すぎます

log4j2.xmlファイル:

<?xml version="1.0" encoding="UTF-8"?> 
    <Configuration monitorInterval="180"> 
     <Properties> 
      <!-- change the path to conference logs below to fit your system --> 
      <Property name="LOG_DIR">C:\CodeRepos\logs</Property> 
      <Property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level 
       %logger{36} - %msg%n</Property> 
     </Properties> 
     <Appenders> 
      <Console name="Console" target="SYSTEM_OUT"> 
       <PatternLayout pattern="${PATTERN}" /> 
      </Console> 
      <Routing name="DailyLog"> 
       <Routes pattern="${ctx:logFileName}"> 
        <Route> 
         <RollingFile name="Rolling-${ctx:logFileName}" 
          fileName="${LOG_DIR}/symproxy.log" 
          filePattern="${LOG_DIR}/symproxy-%i.log"> 
          <PatternLayout pattern="${PATTERN}" /> 
          <SizeBasedTriggeringPolicy size="20971520" /> 
          <DefaultRolloverStrategy max="100" /> 
         </RollingFile> 
        </Route> 
       </Routes> 
      </Routing> 
      <Routing name="ConferenceLog"> 
       <Routes pattern="${ctx:logFileName}"> 
        <Route> 
         <RollingFile name="Rolling-${ctx:logFileName}" 
          fileName="${LOG_DIR}/conferences/${ctx:logFileName}.log" 
          filePattern="${LOG_DIR}/conferences/${ctx:logFileName}.%i.log.gz"> 
          <PatternLayout pattern="${PATTERN}" /> 
          <SizeBasedTriggeringPolicy size="20971520" /> 
         </RollingFile> 
        </Route> 
       </Routes> 
      </Routing> 
      <Routing name="DeviceLog"> 
       <Routes pattern="${ctx:logFileName}"> 
        <Route> 
         <RollingFile name="Rolling-${ctx:logFileName}" 
          fileName="${LOG_DIR}/devices/${ctx:logFileName}.log" 
          filePattern="${LOG_DIR}/devices/${ctx:logFileName}.%i.log.gz"> 
          <PatternLayout pattern="${PATTERN}" /> 
          <SizeBasedTriggeringPolicy size="5kb" /> 
          <DefaultRolloverStrategy max="3" /> 
         </RollingFile> 
        </Route> 
       </Routes> 
      </Routing> 
     </Appenders> 
     <Loggers> 
      <Root level="info"> 
       <AppenderRef ref="Console" /> 
       <AppenderRef ref="DailyLog" /> 
      </Root> 
      <Logger name="conference.logger" level="debug" additivity="false"> 
       <AppenderRef ref="ConferenceLog" /> 
       <AppenderRef ref="Console" /> 
      </Logger> 
      <Logger name="device.logger" level="info" additivity="false"> 
      </Logger> 
     </Loggers> 
    </Configuration> 

それはそう

private void logger(Long meetingId, Log log, String className, Level level, String message, Throwable error) { 
     ThreadContext.put(LOG_FILE_NAME, String.valueOf(meetingId)); 
     logger(conferenceLogger, level, className + "." + message, error); 
     ThreadContext.remove(LOG_FILE_NAME); 
    } 

    private static void logger(Log log, Level level, String message, Throwable error) { 
     if (level == Level.DEBUG) { 
      log.debug(message); 
     } else if (level == Level.ERROR) { 
      if (error == null) { 
       log.error(message); 
      } else { 
       log.error(message, error); 
      } 
     } else if (level == Level.FATAL) { 
      log.fatal(message); 
     } else if (level == Level.TRACE) { 
      log.trace(message); 
     } else if (level == Level.INFO) { 
      log.info(message); 
     } else if (level == Level.WARN) { 
      log.warn(message); 
     } 
    } 

のように使用された後、私は小さなラッパを持っており、そこに私はこの会議ロガー

private final Log conferenceLogger = LogFactory.getLog("conference.logger"); 

をインスタンス化これにより、「会議ID」という名前のファイルが作成されます。しかし、私の問題は、これらのファイルが開かれた後で決して閉じられないということです。

similar SO post私はFileAppenderへの参照はありません。また、Loggerオブジェクトを持っているわけでもありません。そのため、修正プログラムの実装方法がわかりません。これらのファイルのクローズをプログラムでトリガーするにはどうすればよいですか? このため、私たちのサーバーの1つに「オープンファイルが多すぎます」というエラーが発生しています。

documentationを読んだあと、IdlePurgePolicyが必要なはずですが、開いているファイルの数に影響していないようです。 私はlog4j2ファイルのいくつかの差な場所であれば、以下の行を試みたが、私が述べたように、ラッパー自体は、ロガーインスタンスがそれぞれのために作成され、静的にインスタンス化されていない場合、それは何の効果

<IdlePurgePolicy timeToLive="1" timeUnit="minutes"/>

答えて

0

IdlePurgePolicyは終了しましたこれを修正する

<Routing name="ConferenceLog"> 
    <Routes pattern="${ctx:logFileName}"> 
     <Route> 
      <RollingFile name="Rolling-${ctx:logFileName}" 
       fileName="${LOG_DIR}/conferences/${ctx:logFileName}.log" 
       filePattern="${LOG_DIR}/conferences/${ctx:logFileName}.%i.log.gz"> 
       <PatternLayout pattern="${PATTERN}" /> 
       <SizeBasedTriggeringPolicy size="20971520" /> 
      </RollingFile> 
     </Route> 
    </Routes> 
    <IdlePurgePolicy timeToLive="30" timeUnit="seconds"/> 
</Routing> 
0

がありませんでしたそれを呼び出すオブジェクトこれにより、毎回コンクリートロガーインスタンスへの新しいソケット接続が発生する可能性があります。しかし、1つのロギングファイルしか持たない場合、オープンソケットが多すぎるとこの例外が発生することもあります。

可能な解決策

  1. 静的
  2. ロガーの参照をインスタンス化
  3. 静的ラッパーをインスタンス化し、ロギング方式の静的呼び出しとラッパーシングルトンを作る
+0

私は#2を試してみましたので、private static final Log conferenceLoggerですが、ファイルは閉じていません。私の問題であることは確かではありません。これは、さまざまな会議、2343.log、3123.logなどのための複数のログファイルを作成します。私は全体の会議ロガーを停止するだけで1つのファイルが閉じられないようにするために、私はlog4j2がファイルを閉じる方法を知っているだろう。しかし、ラッパーは、特定のファイルが閉じられる準備ができていることを知らせることができます。 –

関連する問題