2017-11-07 3 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 개체가 없으므로 수정 방법을 잘 모르겠습니다. 이러한 파일을 프로그래밍 방식으로 닫는 방아쇠를 어떻게 트리거합니까? 우리 서버 중 하나에서 "너무 많은 파일 열기"오류가 발생하고 있습니다.

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. 정적
    2. 로깅 방법
    +0

    # 2를 시도 했으므로 private static final Log conferenceLogger하지만 파일은 닫히지 않았습니다. 확실하지 않은 Im는 위의 것이 나의 이슈 다. 그것은 여러 컨퍼런스, 2343.log, 3123.log, 등등에 대한 여러 로그 파일을 만듭니다. 전체 회의 로거가 단 하나의 파일이 닫히지 않도록하고 싶지 않습니다. log4j2가 파일을 닫는 방법을 알지 못합니다. 하지만 래퍼를 사용하면 특정 파일을 닫을 준비가되었음을 알릴 수 있습니다. –

    관련 문제