log4j:ERROR Failed to rename
5008 단어 log4j
로그 파일의 이름을 바꾸는 중 오류가 발생했습니다.
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가 이름을 바꿀 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring Boot에서 log4j 로깅 방법Spring Boot은 모든 내부 로그에 Commons Logging을 사용하지만, 기본 설정은 Java Util Logging, Log4J, Log4J2, Logback과 같은 일반적인 로그를 지원합니다.각 Log...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.