[configuration] log4j를 올바르게 초기화하는 방법?

내 응용 프로그램에 log4j를 추가 한 후 응용 프로그램을 실행할 때마다 다음과 같은 결과가 나타납니다.

log4j : WARN 로거 (slideselector.facedata.FaceDataParser)에 대한 어 펜더를 찾을 수 없습니다.
log4j : WARN log4j 시스템을 올바르게 초기화하십시오.

구성 파일이 누락 된 것 같습니다. 이 구성 파일은 어디에 위치하고 좋은 시작 내용은 무엇입니까?

데스크톱 응용 프로그램을 개발하기 위해 일반 Java를 사용하고 있습니다. 따라서 웹 서버 등이 없습니다 …



답변

Log4j기본적으로 log4j.properties또는 log4j.xmlclasspath에서 파일을 찾습니다 .

여기에 설명 된대로 시스템 특성을 설정하여 자체 초기화에 사용하는 파일을 제어 할 수 있습니다 ( “기본 초기화 절차”섹션 참조).

예를 들면 다음과 같습니다.

java -Dlog4j.configuration=customName ....

원인이됩니다 log4j클래스 패스에 customName라는 파일을 찾을 수 있습니다.

문제가있는 경우 log4j.debug를 켜는 것이 도움이됩니다.

-Dlog4j.debug

초기화에 사용 된 파일, 구성한 로거 / 어 펜더 및 방법 등에 대한 유용한 정보를 System.out에 인쇄합니다.

구성 파일은 Java 특성 파일 또는 xml 파일 일 수 있습니다. 다음은 log4j 소개 문서 페이지 에서 가져온 특성 파일 형식의 샘플입니다 .

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n


답변

log4j를 올바르게 설정하는 것은 “실제”프로젝트에 적합하지만 새 라이브러리를 테스트하는 경우와 같이 빠르고 더러운 솔루션이 필요할 수 있습니다.

그렇다면 정적 메소드에 대한 호출

org.apache.log4j.BasicConfigurator.configure();

콘솔에 기본 로깅을 설정하면 오류 메시지가 사라집니다.


답변

모든 것을 제거하는 경우 (예 : 테스트중인 경우)

org.apache.log4j.BasicConfigurator.configure(new NullAppender());


답변

당으로 아파치의 log4j FAQ 페이지 :

“로거에 대한 어 펜더를 찾을 수 없음”및 “log4j를 올바르게 구성하십시오”에 대한 경고가 표시되는 이유는 무엇입니까?

이 때 기본 구성 발생하지 않는 파일을 log4j.properties하고 log4j.xml찾을 수없는 응용 프로그램이 수행하는 명시 적으로 구성. 기본 구성 파일을 찾는 log4j데 사용 Thread.getContextClassLoader().getResource()하며 파일 시스템을 직접 확인하지 않습니다. log4j.properties를 배치 할 적절한 위치를 알고 있거나 log4j.xml사용중인 클래스 로더의 검색 전략을 이해해야합니다. log4j일부 환경에서는 콘솔 또는 파일 시스템으로의 출력이 금지 될 수 있으므로 기본 구성을 제공하지 않습니다.

기본적으로 경고 로거에 대한 어 펜더를 찾을 수 없음log4j로깅 시스템을 사용하고 있지만 구성 파일에 구성 파일 또는 구성 파일에 AppApp (예 : FileAppender, ConsoleAppender, SocketAppender, SyslogAppender 등)을 추가하지 않았 음을 의미합니다. 잃어버린.

log4j를 구성하는 세 가지 방법이 있습니다 : 특성 파일 ( log4j.properties), XML 파일 및 Java 코드 ( rootLogger.addAppender(new NullAppender());).

log4j.properties

속성 파일이있는 경우 (예 : Solr 설치시)이 파일을 클래스 경로 디렉토리 에 배치해야합니다 .

학급

다음은 Linux에서 클래스 경로 값을 결정하는 방법에 대한 몇 가지 명령 제안입니다.

$ echo $CLASSPATH
$ ps wuax | grep -i classpath
$ grep -Ri classpath /etc/tomcat? /var/lib/tomcat?/conf /usr/share/tomcat?

또는 Java : System.getProperty("java.class.path").

Log4j XML

다음은 XML 형식의 log4j에 대한 기본 XML 구성 파일입니다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
    </layout>
  </appender>

  <root>
    <priority value ="debug" />
    <appender-ref ref="console" />
  </root>

</log4j:configuration>

수코양이

Tomcat을 사용하는 경우 log4j.properties: /usr/share/tomcat?/lib/또는 /var/lib/tomcat?/webapps/*/WEB-INF/lib/폴더에 넣을 수 있습니다 .

솔러

참고로 Solr 기본 log4j.properties파일은 다음과 같습니다.

#  Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n

#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9

#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n

log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN

# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF

J2EE 또는 WAR 애플리케이션에서 log4j가 특성 파일을 찾을 수없는 이유는 무엇입니까?

짧은 대답 : log4j 클래스와 속성 파일이 동일한 클래스 로더의 범위 내에 있지 않습니다.

Log4j는 Class.forName()클래스로드에 기본 메커니즘 만 사용합니다 . 리소스도 비슷하게 처리됩니다. 자세한 내용은 설명서를 java.lang.ClassLoader참조하십시오.

따라서 문제가 발생하면 클래스 또는 리소스를 직접로드하십시오. 찾을 수 없으면 log4j도 마찬가지입니다. 😉


또한보십시오:


답변

다음을 사용하여 Java 앱 내부에서 log4j.properties의 위치를 ​​설정할 수 있습니다.

org.apache.log4j.PropertyConfigurator.configure(file/location/log4j.properties)

자세한 내용은 여기 ( https://logging.apache.org/log4j/1.2/manual.html )에서 확인할 수 있습니다.


답변

루트 어 펜더가있는 온라인 log4j.properties 또는 log4j.xml을 찾아 클래스 경로에 놓으십시오.

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout

콘솔에 기록합니다. 나중에 조사 할 수 있도록 파일에 로깅하는 것을 선호합니다.

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file

자세한 로깅 응용 프로그램의 경우 특히 디버그의 경우 100KB를 1MB 또는 10MB로 늘려야합니다.

개인적으로 여러 로거를 설정하고 루트 로거를 디버그 대신 경고 또는 오류 수준으로 설정했습니다.


답변

클래스 파일에 속성 파일을 넣지 않고 그것을 수행하는 또 다른 방법은 Java 코드에서 속성을 직접 설정하는 것입니다. 다음은 샘플 코드입니다.

public class Log4JSample {

public static void main(String[] args) {
    Properties properties=new Properties();
    properties.setProperty("log4j.rootLogger","TRACE,stdout,MyFile");
    properties.setProperty("log4j.rootCategory","TRACE");

    properties.setProperty("log4j.appender.stdout",     "org.apache.log4j.ConsoleAppender");
    properties.setProperty("log4j.appender.stdout.layout",  "org.apache.log4j.PatternLayout");
    properties.setProperty("log4j.appender.stdout.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");

    properties.setProperty("log4j.appender.MyFile", "org.apache.log4j.RollingFileAppender");
    properties.setProperty("log4j.appender.MyFile.File", "my_example.log");
    properties.setProperty("log4j.appender.MyFile.MaxFileSize", "100KB");
    properties.setProperty("log4j.appender.MyFile.MaxBackupIndex", "1");
    properties.setProperty("log4j.appender.MyFile.layout",  "org.apache.log4j.PatternLayout");
    properties.setProperty("log4j.appender.MyFile.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");

    PropertyConfigurator.configure(properties);

    Logger logger = Logger.getLogger("MyFile");

    logger.fatal("This is a FATAL message.");
    logger.error("This is an ERROR message.");
    logger.warn("This is a WARN message.");
    logger.info("This is an INFO message.");
    logger.debug("This is a DEBUG message.");
    logger.trace("This is a TRACE message.");
}

}