log4j:ERROR Failed to rename

5008 단어 log4j
log4j:ERROR Failed to rename
로그 파일의 이름을 바꾸는 중 오류가 발생했습니다.
log4j.properties 구성은 다음과 같습니다.
log4j.rootLogger=INFO

log4j.logger.access= INFO,reg
log4j.appender.reg=org.apache.log4j.DailyRollingFileAppender
log4j.appender.reg.layout=org.apache.log4j.PatternLayout
log4j.appender.reg.File=D:\\secureCRT\\sync.log
log4j.appender.reg.DatePattern='.'yyyy-MM-dd
log4j.appender.reg.layout.ConversionPattern=%d - [%p] - [%F\:%L] %m%n

log4j.logger.access2= INFO,A3
log4j.appender.A3=org.apache.log4j.RollingFileAppender
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.File=D:\\secureCRT\\sync.log
log4j.appender.A3.MaxFileSize=500KB
log4j.appender.A3.layout.ConversionPattern=%d - [%p] - [%F\:%L] %m%n

실행 중 reg만 사용했고 A3는 사용하지 않았습니다.
원인:reg 로그 기록기는 DailyRollingFile Appender로 구성되어 있으며, 매일 새로운 파일이 생성되고, 새로운 파일이 생성되는 것은 File입니다.renameTo(),
여기서 실수했어.구글은 윈도우즈에서 다른 프로세스가 이 로그 파일을 점용하고 있다는 것을 발견했습니다. 검사에 의하면 이 파일을 수첩으로 열었습니다. (D:\\보안 CRT\sync.log) 그래서 수첩을 끄고 다시 실행했습니다. 이 오류를 보고했습니다.좀 이상한데,reg 외에 어떤 프로세스가 이 파일을 점용하고 있습니까?
그리고 또 로그4j를 검사합니다.properties,reg와 A3의 로그 파일을 발견했을 때 설정된 것과 동일합니다. (위 프로필 참조) 이로 인해 발생하는 것은 아닐까요?
그래서 A3를 잠시 주석하고 운행을 통과하여 새로운 파일이 생겼습니다!
즉, A3를 사용하지 않았지만log4j는 이 설정을 불러와 실례화했다.
검증을 위해 소스 코드 보기(버전 1.2.16):
log4j의 사용은 다음과 같습니다.
Logger logger = Logger.getLogger(Test.class);

들어가다
Logger.getLogger(Test.class
):
static public  Logger getLogger(Class clazz) {
    return LogManager.getLogger(clazz.getName());
}

들어가다
LogManager 클래스, 이 클래스를 처음 불러올 때 log4j를 초기화하는 static 코드 영역이 있음을 주의하십시오.
static {
    // By default we use a DefaultRepositorySelector which always returns 'h'.
    //  DEBUG RootLogger
    Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));
    repositorySelector = new DefaultRepositorySelector(h);
    ......
    // "log4j.configuration", 
    String configurationOptionStr = OptionConverter.getSystemProperty(DEFAULT_CONFIGURATION_KEY,  null);

      String configuratorClassName = OptionConverter.getSystemProperty( CONFIGURATOR_CLASS_KEY,  null);

      URL url = null;

      //  log4j.xml, , log4j.properties( xml)
      // if the user has not specified the log4j.configuration
      // property, we search first for the file "log4j.xml" and then
      // "log4j.properties"
      if(configurationOptionStr == null) { 
         url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
         if(url == null) {
           url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
         }
      } else {
 try {
   url = new URL(configurationOptionStr);
 } catch (MalformedURLException ex) {
   // so, resource is not a URL:
   // attempt to get the resource from the class path
   url = Loader.getResource(configurationOptionStr); 
 } 
      }
      
        ......
         //  
            OptionConverter.selectAndConfigure(url, configuratorClassName,
    LogManager.getLoggerRepository());
      ......
  } 

들어가다
OptionConverter.selectAndConfigure():
void selectAndConfigure(URL url, String clazz, LoggerRepository hierarchy) {
   Configurator configurator = null;
   String filename = url.getFile();

   if(clazz == null && filename != null && filename.endsWith(".xml")) {
     clazz = "org.apache.log4j.xml.DOMConfigurator";
   }


   if(clazz != null) {
     LogLog.debug("Preferred configurator class: " + clazz);
     configurator = (Configurator) instantiateByClassName(clazz,
   Configurator.class,
   null);
     if(configurator == null) {
      LogLog.error("Could not instantiate configurator ["+clazz+"].");
      return;
     }
   } else {
     configurator = new PropertyConfigurator();
   }

   configurator.doConfigure(url, hierarchy);
  }

프로필 형식에 따라 다른 불러오는 클래스를 선택하면 xml은 DOMConfigurator,properties는 PropertyConfigurator,
그런 다음 doConfigure()를 호출하여 로드합니다.
PropertyConfigurator를 보면 PropertyConfigurator에 들어갑니다.doConfigure():
public void doConfigure(String configFileName, LoggerRepository hierarchy) {
    Properties props = new Properties();
    FileInputStream istream = null;
    try {
      istream = new FileInputStream(configFileName);
      props.load(istream);
      istream.close();
    }
   
   ......
    //  propertie 
    // If we reach here, then the config file is alright.
    doConfigure(props, hierarchy);
  }

굵게 하는 방법에 들어가면 마지막으로 세 줄 코드가 보입니다.
configureRootCategory(properties, hierarchy);// RootLogger
configureLoggerFactory(properties);//  LoggerFactory( Logger)
parseCatsAndRenderers(properties, hierarchy);// ( )

위의 원본 코드를 보면 알 수 있듯이log4j는 첫 번째 호출에서 전체 프로필을 불러오고 초기화하면 위의 문제를 이해할 수 있습니다. 비록 A3는 사용하지 않았지만,
그러나 초기화되고 로그 파일을 점유하여 reg가 이름을 바꿀 수 없습니다.

좋은 웹페이지 즐겨찾기