logger (log4j)에 대한 어 펜더를 찾을 수 없습니까?
log4j를 빌드 경로에 넣었지만 응용 프로그램을 실행할 때 다음 메시지가 나타납니다.
log4j:WARN No appenders could be found for logger (dao.hsqlmanager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
이 경고는 무엇을 의미합니까? 어 펜더는 무엇입니까?
log4j 안내서에 대한 이 짧은 소개 는 약간 오래되었지만 여전히 유효합니다.
이 안내서는 로거 및 어 펜더 사용 방법에 대한 정보를 제공합니다.
당신이 갈 수 있도록 두 가지 간단한 접근 방식이 있습니다.
첫 번째는이 메소드를 기본 메소드에 추가하는 것입니다.
BasicConfigurator.configure();
두 번째 방법은 log4j.properties
위에서 언급 한 가이드에서 가져온 이 표준 파일을 클래스 경로에 추가하는 것입니다.
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
log4j.properties
Eclipse의 클래스 경로에 파일 위치를 추가 해야하는 것처럼 보입니다 .
프로젝트가 Eclipse에서 열려 있는지 확인한 다음 Eclipse 맨 위에있는 "실행"메뉴를 클릭하고 다음을 클릭하십시오.
- 운영
- 구성 실행
- 클래스 패스 (탭)
- 사용자 항목
- 고급 (오른쪽 버튼)
- 폴더 추가
- 그런 다음 log4j.properties 파일이 포함 된 폴더로 이동하십시오.
- 대다
- 운영
오류 메시지가 더 이상 나타나지 않아야합니다.
빠른 솔루션 :
주요 기능 에 코드 추가 :
String log4jConfPath = "/path/to/log4j.properties"; PropertyConfigurator.configure(log4jConfPath);
/ path / to에 log4j.properties라는 파일을 작성하십시오.
log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
이것은 단지 경고 일뿐입니다.
고정
이 때 기본 구성 파일을 발생 log4j.properties
하고 log4j.xml
찾을 수없는 응용 프로그램이 수행하는 명시 적으로 구성.
이 문제를 해결하려면 클래스 경로 의 위치 (일반적으로 jar 파일과 동일)를 작성 / 복사 log4j.properties
하거나 작성 log4j.xml
하십시오 .
선택적으로 java 옵션을 설정하십시오 -Dlog4j.configuration=file:///path/to/log4j.properties
.
log4j
Thread.getContextClassLoader().getResource()
기본 구성 파일을 찾는 데 사용 하며 파일 시스템을 직접 확인하지 않습니다. 배치 할 적절한 위치를 알고log4j.properties
있거나log4j.xml
사용중인 클래스 로더의 검색 전략을 이해해야합니다.log4j
일부 환경에서는 콘솔 또는 파일 시스템으로의 출력이 금지 될 수 있으므로 기본 구성을 제공하지 않습니다.
디버깅
디버깅을 위해 -Dlog4j.debug=true
매개 변수 를 사용하려고 할 수 있습니다 .
구성 log4j.properties
의 샘플 구성 log4j.properties
:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN
다중 어 펜더를 사용하는 다른 구성 파일은 다음과 같습니다.
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
아파치 솔러
Solr을 사용 <solr>/example/resources/log4j.properties
하는 경우 클래스 경로 의 위치로 복사 하십시오 .
log4j.properties
Solr 의 샘플 구성 은 다음과 같습니다.
# 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
또한보십시오:
Logger
코드에서를 사용하여 메시지를 기록합니다. 는 Appender
A와 추가 된 객체입니다 Logger
특정 대상에 메시지를 작성 할 수 있습니다. 있습니다 FileAppender
텍스트 파일이나 쓸 ConsoleAppender
콘솔에 기록 할 수 있습니다. 도움이 필요하면 Logger 및 Appender 설정 코드를 표시해야합니다.
Logger와 Appender의 상호 작용에 대한 이해를 돕기 위해 학습서 를 읽으십시오 .
앞에서 설명한 것처럼 두 가지 접근 방식이 있습니다
첫 번째는이 메소드를 기본 메소드에 추가하는 것입니다.
BasicConfigurator.configure();
두 번째 방법은이 표준 log4j.properties 파일을 클래스 경로 에 추가 하는 것입니다.
두 번째 방법을 사용하는 동안 파일을 올바르게 초기화해야합니다 (예 :
Properties props = new Properties();
props.load(new FileInputStream("log4j property file path"));
props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");
로그 파일을 저장하는 데 필요한 폴더를 작성하십시오.
여기에있는 대부분의 답변은 log4j.properties
파일을 올바른 위치에 배치 할 것을 제안 했습니다 (maven 프로젝트의 경우 src/main/resources
)
그러나 나에게 문제는 내가 log4j.properties
올바르게 구성되지 않았다는 것입니다. 다음은 나를 위해 작동하는 샘플입니다. 먼저 사용해 볼 수 있습니다.
# Root logger option
log4j.rootLogger=INFO, stdout
# 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.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
같은 오류가 발생합니다. 이 오류 메시지가 나타나는 문제는 다음과 같습니다.
log4j를 구성하기 전에 로거를 사용하는 일부 객체를 만듭니다.
Logger.getLogger(Lang.class.getName()).debug("Loading language: " + filename);
솔루션 : 기본 방법의 시작 부분에 log4j를 구성하십시오.
PropertyConfigurator.configure(xmlLog4JConfigFile);
// or BasicConfigurator.configure(); if you dont have a config file
특성 파일이 올바르게 설정되었는지 확인하십시오. 그리고 다시 컴파일러가 속성 파일을 찾을 수없는 것처럼 보이며 pom에서 다음과 같이 설정할 수 있습니다 (maven 프로젝트를 사용할 때만).
<build>
<sourceDirectory> src/main/java</sourceDirectory>
<testSourceDirectory> src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>resources</directory>
</resource>
</resources>
</build >
log4j jar 파일 또는 Java 코드가 log4j 구성 파일을 찾는 위치를 이해해야한다고 생각합니다.
src/main/resources/log4j.properties
Eclipse 경로입니다. 코드의 절대 경로를 하드 코딩 할 필요가 없도록 적절한 위치에 배치하십시오.
http://askyourquestions.info/2016/03/27/how-to-see-where-the-log-is-logger-in-slf4j/에 대한 내 기사와 샘플 솔루션을 읽으십시오.
첫 번째 코드로 다음을 추가하십시오.
Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "WARN");
PropertyConfigurator.configure(prop);
제 경우에는 오류가 " additivity " 플래그였습니다 . 루트 프로젝트 패키지가 "거짓"이면 하위 패키지에 어 펜더가없고 " 어 펜더를 찾을 수 없음 "오류가 표시됩니다.
RCP4에서 발생할 수있는 또 다른 이유는 대상 파일에서 여러 로깅 프레임 워크를 사용하기 때문입니다. 예를 들어, 대상 파일 컨텐츠 탭에서 slf4j, log4j 및 ch.qos.logback.slf4j의 조합을 사용하는 경우이 문제가 발생합니다.
intellij 12에서 maven으로 실행 가능한 jar를 빌드하려고 할 때이 문제가 발생했습니다 .java 매니페스트 파일에 클래스 경로가 포함되어 있지 않기 때문에 루트 수준에서 log4j 속성 파일을 찾을 수 없습니다 ( jar 파일이 실행되었습니다.)
참고로 다음과 같이 로거를 얻었습니다.
Logger log = LogManager.getLogger(MyClassIWantedToLogFrom.class);
그리고 이것을 포함하는 pom 파일로 작업 할 수있었습니다.
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mycompany.mainPackage.mainClass</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path> <!-- need to add current directory to classpath properties files can be found -->
</manifestEntries>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
프로젝트가 Eclipse에서 열려 있는지 확인한 다음 Eclipse 맨 위에있는 "실행"메뉴를 클릭하고 다음을 클릭하십시오.
운영
구성 실행
클래스 패스 (탭)
사용자 항목
오른쪽에 항아리를 추가
log4j jar 파일 추가
대다
운영
오류 메시지가 더 이상 나타나지 않아야합니다.
그 이유는 static
일부 단어가 부족할 수 있습니다 .
final static Logger logging = Logger.getLogger(ProcessorTest.class);
로거를 인스턴스 필드로 만들면 정확히 경고 메시지가 나타납니다.
No appenders could be found for logger (org.apache.kafka.producer.Sender)
더 나쁜 것은, 경고 ProcessorTest
는 실수가있는 곳이 아니라 문제의 원인이되는 완전히 다른 계급 (발신자)을 가리 킵니다 . 해당 클래스에는 올바른 로거가 있으며 변경할 필요가 없습니다! 우리는 나이에 대한 문제를 찾을 수있었습니다!
log4j2를 사용할 때도 같은 문제가 발생했습니다. 내 문제는 잘못된 종속 라이브러리를 사용하여 발생합니다.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>runtime</scope>
</dependency>
대신 다음을 사용해야합니다.
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<scope>runtime</scope>
</dependency>
제 경우에는 "resources"디렉토리에 log4j2.xml이 정의되어 있으며 다음을 사용하여 지정했습니다.
System.setProperty("log4j.configurationFile", "log4j2.xml");
Log4j Java 코드가 프로그램에서 첫 번째 로그 라인을 작성하려고 검색 할 때 Log4J가이 경고 메시지를 표시합니다.
현재 Log4j는 두 가지를 만듭니다.
log4j.properties
파일 을 찾기 위해 검색- appender를 정의하기 위해 검색합니다.
log4j.properties
경우 log4J
찾을 수없는 log4j.properties
파일이나 경우를 펜더에 선언 log4j.rootlogger
의 다른 곳에서 정의되지 않은 log4j.properties
파일 경고 메시지가 표시됩니다.
주의 : 속성 파일의 내용이 정확해야합니다.
다음 내용이 올바르지 않습니다
log4j.rootLogger=file
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false
file
어 펜더는 log4j.rootlogger
명령문의 LOWER-CASE에 선언되고 UPPER-CASE를 사용하여 log4j.appender 문에 정의 되기 때문에 !
올바른 파일은
log4j.rootLogger=FILE
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false
MAVEN을 사용하는 경우 log4j.properties 파일을 넣고 src/main/resources
MAVEN 빌드를 시작 해야합니다 .
그런 다음 Log4j.properties 파일이 target/classes
폴더에 복사됩니다 .
Log4J는 log4j.properties
찾은 파일을 사용합니다 target/classes
!
파일이에 있지만 Eclipse에서 JUnit 테스트를 log4j.properties
실행할 때 Eclipse 설치를 찾을 수 없습니다 .src/test/resources
그 이유는 Eclipse (또는 m2e 커넥터)가 src/test/resources
예상 출력 폴더로 컨텐츠를 복사하지 않았기 때문입니다 target/test-classes
. 근본 원인은 프로젝트 빌드의 Java 빌드 경로 -> 소스 탭-> 빌드 경로의 소스 폴더 -> src / test / resources , 어떻게 든 Excluded: **
항목 이있었습니다 . 제외 된 항목을 제거했습니다 .
또한, 나는 수동으로 복사 한 수 src/test/resources/log4j.properties
에 target/test-classes/log4j.properties
.
log4j.properties
실제로 클래스 경로에있는 경우 Spring Boot를 사용하여 응용 프로그램 서버에 배포 할 WAR 파일을 만들고 web.xml
Spring Boot의 자동 구성을 선호 하는 파일을 생략하고 로그 메시지가 표시되지 않으면 명시 적으로해야합니다 Log4j를 구성하십시오. Log4j 1.2.x를 사용한다고 가정합니다.
public class AppConfig extends SpringBootServletInitializer {
public static void main( String[] args ) {
// Launch the application
ConfigurableApplicationContext context = SpringApplication.run( AppConfig.class, args );
}
@Override
protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
InputStream log4j = this.getClass().getClassLoader().getResourceAsStream("log4j.properties");
PropertyConfigurator.configure(log4j);
return application;
}
// Other beans as required...
}
어쩌면 관련 프로젝트에 java 빌드 경로에 log4j가 들어있는 것을 추가하고, Eclipse를 사용하는 mahout 프로젝트 에서이 문제를 만났을 때 mahout_h2o를 추가하면 작동합니다!
많은 프로젝트와 함께 작업하면 스타일 문제가 발생할 수 있습니다.
* 하나의 lof4j.properties 파일이 있어야하며이 파일에는 다른 프로젝트의 로그 특성이 포함됩니다.
* 프로젝트가 Linux OS에서 작동 할 때 log4j 특성 파일을 src 경로에 넣으려고 시도하는 것 외에, 다른 프로젝트의 libs 및 log4.properties 파일은 하나의 폴더 아래에 클래스 경로의 위치에있을 수 있습니다.
첫 수입품 :
import org.apache.log4j.PropertyConfigurator;
그런 다음 기본 메소드에 아래 코드를 추가하십시오.
String log4jConfPath ="path to/log4j.properties";
PropertyConfigurator.configure(log4jConfPath);
경로에 파일을 작성하고 해당 파일에 아래 코드를 추가하십시오.
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
이 사이트의 솔루션은 https://crunchify.com/java-how-to-configure-log4j-logger-property-correctly/에서 작동했습니다 . log4j에서 경고가 전혀 표시되지 않습니다.
나는 이것을 src / main / resources에 넣은 log4j.properties 파일에 넣었다.
# This sets the global logging level and specifies the appenders
log4j.rootLogger=INFO, theConsoleAppender
# settings for the console appender
log4j.appender.theConsoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.theConsoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.theConsoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
나도이 문제가 있었다. 방금 IntelliJ IDEA에서 resources 디렉토리를 표시하는 것을 잊었습니다.
- 디렉토리를 마우스 오른쪽 버튼으로 클릭하십시오
- 디렉토리를로 표시
- 자원 루트
JUnit 테스트 클래스를 실행하려고 할 때도 같은 문제가 발생했습니다.
src / test / resources 폴더에 log4j.properties 파일을 수동으로 추가하면 문제가 해결됩니다.
log4j.properties 파일에 아래 코드를 추가하면 문제가 해결되었습니다.
# Root logger option
log4j.rootLogger=INFO, file, stdout
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# 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.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Java Eclipse에서 conf_ref를 conf 폴더에 복사하십시오.
참고 URL : https://stackoverflow.com/questions/12532339/no-appenders-could-be-found-for-loggerlog4j
'Programming' 카테고리의 다른 글
SelectedItem, SelectedValue 및 SelectedValuePath의 차이점 (0) | 2020.03.05 |
---|---|
"구성 : iPhone 구성에는 armv6 아키텍처가 포함되어야합니다." (0) | 2020.03.05 |
파이썬에서 최대 재귀 깊이는 얼마이며 어떻게 증가합니까? (0) | 2020.03.05 |
두 div를 서로 옆에 배치하는 방법은 무엇입니까? (0) | 2020.03.05 |
파이썬 / 팬더가 저장된 CSV에서 인덱스를 생성하지 않도록하는 방법은 무엇입니까? (0) | 2020.03.05 |