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


280

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

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

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

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


49
나와 같은 모든 maven 사람들을 위해 : log4j.properties를 src / main / resources에 넣으십시오!
Karussell


Log4j의 짧은 매뉴얼을 살펴 보는 것이 매우 도움이됩니다 : logging.apache.org/log4j/1.2/manual.html
Sa'ad

답변:


278

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

43
따라서 클래스 경로에없는 파일에서 구성 파일을로드하려면 다음과 같이해야합니다. -Dlog4j.configuration = file : / c : /my/folder/log4j.properties 실제로 URL입니다.
bbcooper

15
누군가에게 유용 할 수있는 하나의 작은 팁 : 코드에서 해당 속성을 활성화하여 log4j 디버거를 켤 수도 있습니다.- System.setProperty ( "log4j.debug", "");
XXL

당신은 어디에 넣 java -Dlog4j.configuration=customName습니까? 프로젝트 / 환경 설정 / 실행 / 디버그 설정을 시도하고 일부 구성을 선택하고 편집, 인수 탭, VM 인수를 클릭했습니다. customName에 .xml 확장자가 포함되어 있습니까?
누 메논

2
많은 변형을 시도한 후에는 다음과 같이 작동했습니다. -Dlog4j.configuration = file : /// C : /mydir/subdir/log4j.properties 위 예 : -Dlog4j.configuration = file : / c : /my/folder/log4j.properties 실패한.
user1062589

1
실제로 매뉴얼을 -Dlog4j.debug통해 구성 디버그에 도움 이 될 수있는 내용을 더 강조하기를 바랍니다 .
Sridhar Sarnobat가

239

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

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

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

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


안녕 a3. 14_ 무한대 어디서 사용해야합니까? 이해할 수 없습니다. 심지어이 문제에 대한 더 많은 답변을 참조했습니다. 도와주세요
Ravi Potnuru

5
기본적으로 디버그 수준 로깅으로 설정되므로 바람직하지 않을 수 있습니다. 다음과 같이 변경할 수 있습니다.Logger.getRootLogger().setLevel(Level.INFO);
forresthopkinsa

경고가 사라 졌을뿐만 아니라 콘솔 창에 편리한 디버그 정보 출력이 있습니다.
Baked Inhalf

2
그래서 우리는 그것을 생산 상태에서 사용합니다
aswzen

25

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

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

20

당으로 아파치의 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도 마찬가지입니다. ;)


또한보십시오:


12

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

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

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


1
흠, 수업을 찾을 수 없습니다. import코드 완성이 모두 신뢰할 수 없습니다로 문은 항상 도움이됩니다.
Martin

11

루트 어 펜더가있는 온라인 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로 늘려야합니다.

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


9

클래스 파일에 속성 파일을 넣지 않고 그것을 수행하는 또 다른 방법은 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.");
}

}


6

setLevel () 을 사용하여 로그 레벨을 설정할 수 있습니다 .

레벨은 프로그램이 표시 할 정보의 종류를 쉽게 설정하는 데 유용합니다.

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

Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages

가능한 레벨 세트는 다음과 같습니다.

자취,

디버그,

정보,

경고,

오류 및

치명적인

로깅 서비스 매뉴얼 에 따르면


6
import org.apache.log4j.BasicConfigurator;

이 방법을 호출

BasicConfigurator.configure();

구체적으로 이것은 씁니다 System.out. 인수없는 구성 방법에 대한 javadoc은 다음과 같이 말합니다.Add a ConsoleAppender that uses PatternLayout using the PatternLayout#TTCC_CONVERSION_PATTERN and prints to System.out to the root category.
sunil

3

사용하려면 -Dlog4j.debug, 나는로 이동 시스템, 고급 시스템 설정, 환경 변수 및 설정 시스템 변수 _JAVA_OPTIONS-Dlog4j.debug.


1

무엇을 개발하고 있습니까? Apache Tomcat을 사용하고 있습니까?

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss.SSS} [[%5p] %c{1} [%t]] %m%n

내 Java 앱에 이와 같은 속성이 있습니다.


1

내 log4j는 아래 속성 파일로 수정되었습니다.

## 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=./logs/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

안녕하세요, 콘솔에 디버그하고 파일에 오류가 발생하도록 구성을 어떻게 추가 할 수 있습니까?
JhonArias

1

나는 파일을 생성 한 log4j.properties를자원 옆에 폴더 의 hibernate.cfg.xml 파일 아래 텍스트를 작성 :

log4j.rootLogger=INFO, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n

이제 경고와 오류를 제거했습니다.


1

간단히 src / main / assembly 폴더에 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

1

앞에서 설명한 것처럼 두 가지 접근 방식이 있습니다

첫 번째는이 메소드를 기본 메소드에 추가하는 것입니다.

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");

로그 파일을 저장하는 데 필요한 폴더를 작성하십시오.


1

log4j : configuration 노드의 디버그 속성을 true로 설정하십시오.

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">

구성 파일을 읽고 log4j 환경을 구성하는 데 사용되는 정보를 인쇄합니다. 문제를 해결하기 위해 더 자세한 정보를 얻을 수 있습니다.


아는 사람 있나요? 런타임 시작시 -Dlog4j.debug = true 설정으로 돌아 가지 않고 속성 구성에서도 동일한 옵션을 사용할 수 있습니까?
JFK

1

로깅 API - Java Logging API는 최종 사용자, 시스템 관리자, 현장 서비스 엔지니어 및 소프트웨어 개발 팀의 분석에 적합한 로그 보고서를 생성하여 고객 사이트에서 소프트웨어 서비스 및 유지 관리를 용이하게합니다. 로깅 API는 보안 실패, 구성 오류, 성능 병목 현상 및 / 또는 응용 프로그램 또는 플랫폼의 버그와 같은 정보를 캡처합니다. 핵심 패키지에는 일반 텍스트 또는 XML 형식의 로그 레코드를 메모리, 출력 스트림, 콘솔, 파일 및 소켓에 전달하기위한 지원이 포함됩니다. 또한 로깅 API는 호스트 운영 체제에 이미 존재하는 로깅 서비스와 상호 작용할 수 있습니다.

패키지 java.util.logging «Java 플랫폼 코어 로깅 기능의 클래스와 인터페이스를 제공합니다.


Log4j 1.x «log4j는 널리 사용되는 Java 기반 로깅 유틸리티입니다. Log4j는 많은 저자의 작업을 기반으로하는 오픈 소스 프로젝트입니다. 개발자는 Appender (콘솔, 파일, DB 및 전자 메일)를 사용하여 다양한 위치에 출력되는 로그 문을 제어 할 수 있습니다. 외부 구성 파일을 사용하여 런타임시 완전히 구성 할 수 있습니다.

Log4j에는 세 가지 주요 구성 요소가 있습니다.

  • 로거 -[OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE]
  • 어 펜더

  • 레이아웃-[PatternLayout, EnhancedPatternLayout]

구성 파일은 XML 또는 Java 특성 (key = value) 형식으로 작성할 수 있습니다.

  1. log4j_External.properties«Java 특성 (키 = 값) 형식

여는 " $ { "와 닫는 " } " 사이의 문자열은 키로 해석됩니다. 대체 된 변수의 값은 시스템 특성 또는 구성 파일 자체로 정의 될 수 있습니다. 어 펜더 특정 옵션을 설정하십시오. «log4j.appender.appenderName.option = value, 각 명명 된 appender에 대해 레이아웃을 구성 할 수 있습니다.

log4j.rootLogger=INFO, FILE, FILE_PER_SIZE, FILE_PER_DAY, CONSOLE, MySql

#log.path=./
log.path=E:/Logs

# https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
# {%-5p - [WARN ,INFO ,ERROR], %5p 0- [ WARN, INFO,ERROR]}
log.patternLayout=org.apache.log4j.PatternLayout
log.pattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n

# System.out | System.err
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.err
log4j.appender.CONSOLE.layout=${log.patternLayout}
log4j.appender.CONSOLE.layout.ConversionPattern=${log.pattern}

# File Appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log.path}/logFile.log
#log4j:ERROR setFile(null,false) call failed. - Defaults setFile(null,true)
#log4j.appender.FILE.Append = false
log4j.appender.FILE.layout=${log.patternLayout}
log4j.appender.FILE.layout.ConversionPattern=${log.pattern}

# BackUP files for every Day.
log4j.appender.FILE_PER_DAY=org.apache.log4j.DailyRollingFileAppender
# [[ Current File ] - logRollingDayFile.log ], { [BackUPs] logRollingDayFile.log_2017-12-10, ... }
log4j.appender.FILE_PER_DAY.File=${log.path}/logRollingDayFile.log
log4j.appender.FILE_PER_DAY.DatePattern='_'yyyy-MM-dd
log4j.appender.FILE_PER_DAY.layout=${log.patternLayout}
log4j.appender.FILE_PER_DAY.layout.ConversionPattern=${log.pattern}

# BackUP files for size rotation with log cleanup.
log4j.appender.FILE_PER_SIZE=org.apache.log4j.RollingFileAppender
# [[ Current File ] - logRollingFile.log ], { [BackUPs] logRollingFile.log.1, logRollingFile.log.2}
log4j.appender.FILE_PER_SIZE.File=${log.path}/logRollingFile.log
log4j.appender.FILE_PER_SIZE.MaxFileSize=100KB
log4j.appender.FILE_PER_SIZE.MaxBackupIndex=2
log4j.appender.FILE_PER_SIZE.layout=${log.patternLayout}
log4j.appender.FILE_PER_SIZE.layout.ConversionPattern=${log.pattern}

# MySql Database - JDBCAppender
log4j.appender.MySql=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.MySql.driver=com.mysql.jdbc.Driver
log4j.appender.MySql.URL=jdbc:mysql://localhost:3306/automationlab
log4j.appender.MySql.user=root
log4j.appender.MySql.password=
log4j.appender.MySql.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.MySql.layout.ConversionPattern=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m');
#log4j.appender.MySql.sql=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m');

# Direct log events[Messages] to MongoDB Collection - MongoDbAppender
log.mongoDB.hostname=loalhost
log.mongoDB.userName=Yash777
log.mongoDB.password=Yash@123
log.mongoDB.DB=MyLogDB
log.mongoDB.Collection=Logs

log4j.appender.MongoDB=org.log4mongo.MongoDbAppender
log4j.appender.MongoDB.hostname=${log.mongoDB.hostname}
log4j.appender.MongoDB.userName=${log.mongoDB.userName}
log4j.appender.MongoDB.password=${log.mongoDB.password}
log4j.appender.MongoDB.port=27017
log4j.appender.MongoDB.databaseName=${log.mongoDB.DB}
log4j.appender.MongoDB.collectionName=${log.mongoDB.Collection}
log4j.appender.MongoDB.writeConcern=FSYNCED

테이블의 MySQL 테이블 구조 logdata

CREATE TABLE IF NOT EXISTS `logdata` (
  `Logger_Level` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
  `DataTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `ClassName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `MethodName` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `LineNumber` int(10) NOT NULL,
  `Message` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  1. log4j_External.xml«XML log4j : 공개 DTD 파일을 사용한 구성
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration PUBLIC
  "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="false">

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <param name="target" value="System.out" />
        <param name="threshold" value="debug" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE" class="org.apache.log4j.FileAppender">
        <param name="file" value="E:/Logs/logFile.log" />
        <param name="append" value="false" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE_PER_SIZE" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="E:/Logs/logRollingFile.log" />
        <param name="immediateFlush" value="true"/>
        <param name="maxFileSize" value="100KB" />
        <param name="maxBackupIndex" value="2"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE_PER_DAY" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="E:/Logs/logRollingDayFile.log" />
        <param name="datePattern" value="'_'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n"/>
        </layout>
    </appender>

    <root>
        <priority value="info" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="FILE_PER_SIZE" />
        <appender-ref ref="FILE_PER_DAY" />
    </root>
</log4j:configuration>

  1. Java 프로그램의 URL에서 Log4j 구성 :

외부 파일로 사용자 정의 구성을 지정하려면 사용 된 클래스가 구성자 인터페이스를 구현해야합니다 .

기본 구성 파일 "log4j.properties", "log4j.xml"을 사용할 수없는 경우

  • "log4j.properties"의 경우 PropertyConfigurator .configure (java.net.URL) 메소드에 피드 할 수 있습니다 .
  • "log4j.xml"의 경우 DOMConfigurator 가 사용됩니다.
public class LogFiles {
    // Define a static logger variable so that it references the Logger instance named "LogFiles".
    static final Logger log = Logger.getLogger( LogFiles.class );

    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        System.out.println("CONFIGURATION_FILE « "+LogManager.DEFAULT_CONFIGURATION_FILE);
        System.out.println("DEFAULT_XML_CONFIGURATION_FILE = 'log4j.xml' « Default access modifier");

        String fileName = //"";
                //"log4j_External.xml";
                "log4j_External.properties";
        String configurationFile = System.getProperty("user.dir")+"/src/" + fileName;

        if( fileName.contains(".xml") ) {
            DOMConfigurator.configure( configurationFile );
            log.info("Extension *.xml");
        } else if ( fileName.contains(".properties") ) {
            PropertyConfigurator.configure( configurationFile );
            log.info("Extension *.properties");
        } else {
            DailyRollingFileAppender dailyRollingAppender = new DailyRollingFileAppender();
            dailyRollingAppender.setFile("E:/Logs/logRollingDayFile.log");
            dailyRollingAppender.setDatePattern("'_'yyyy-MM-dd");

            PatternLayout layout = new PatternLayout();
            layout.setConversionPattern( "%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" );
            dailyRollingAppender.setLayout(layout);

            dailyRollingAppender.activateOptions();

            Logger rootLogger = Logger.getRootLogger();
            rootLogger.setLevel(Level.DEBUG);
            rootLogger.addAppender(dailyRollingAppender);

            log.info("Configuring from Java Class.");
        }

        log.info("Console.Message.");
        method2();
        methodException(0);
    }

    static void method2() {
        log.info("method2 - Console.Message.");
    }
    static void methodException(int b) {
        try {
            int a = 10/b;
            System.out.println("Result : "+ a);
            log.info("Result : "+ a);
        } catch (Exception ex) { // ArithmeticException: / by zero
            log.error(String.format("\n\tException occurred: %s", stackTraceToString(ex)));
        }
    }
    public static String stackTraceToString(Exception ex) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        ex.printStackTrace(pw);
        return sw.toString();
    }
}

1

나를위한 해결책은 "log4j.properties"를 "src"폴더에 넣는 것이었다.


0

우리가 log4j 위에 아파치 커먼즈 로깅 래퍼를 사용한다면, 클래스 패스에서 두 jar 파일을 모두 사용할 수 있어야합니다. 또한, commons-logging.propertieslog4j.properties/xml클래스 경로에 사용할 수 있습니다.

또한를 사용하여 구현 클래스와 log4j.properties이름을 전달할 수도 있습니다 . 앱 / 웹 서버의 경우 설정 을 통해 동일하게 수행 할 수 있습니다 .JAVA_OPTS-Dorg.apache.commons.logging.Log=<logging implementation class name> -Dlog4j.configuration=<file:location of log4j.properties/xml file>JAVA_OPTS

배포시 변경 될 수있는 속성을 외부화하는 데 도움이됩니다.


0

.yaml을 사용하는 다른 방법입니다.

논리 구조 :

Configuration:
    Properties:
    Appenders:
    Loggers:

견본:

Configutation:
    name: Default

    Properties:
        Property:
            name: log-path
            value: "logs"

    Appenders:

        Console:
        name: Console_Appender
        target: SYSTEM_OUT
        PatternLayout:
            pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

       File:
          name: File_Appender
          fileName: ${log-path}/logfile.log
          PatternLayout:
            pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

    Loggers:

        Root:
            level: debug
            AppenderRef:
              - ref: Console_Appender

        Logger:
            - name: <package>.<subpackage>.<subsubpackage>.<...>
              level: debug
              AppenderRef:
                 - ref: File_Appender
                 level: error             

참조 : LOG4J 2 구성 : YAML 사용


0

테스트를 위해 로그 레벨 설정을 포함한 더 빠른 방법 :

org.apache.log4j.BasicConfigurator.configure();
org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.WARN);

// set to Level.DEBUG for full, or Level.OFF..

0

메이븐 솔루션 :

위와 동일한 문제가 발생했으며 maven 솔루션에는 2 가지 종속성이 사용되었습니다. 이 구성은 간단한 프로젝트에서 표준 구성으로 로거를 사용하려는 경우 빠른 테스트를위한 것입니다. 추가 정보가 필요하거나 자체 로깅 수준을 미세 조정하면 나중에 구성 파일을 만들고 싶다고 상상할 수 있습니다.

    <properties>
        <slf4jVersion>1.7.28</slf4jVersion>
    </properties>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4jVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>${slf4jVersion}</version>
        </dependency>

0

방금이 작업을 수행했으며 문제가 해결되었습니다.

아래 블로그를 따라

https://intellij-support.jetbrains.com/hc/en-us/community/posts/206875685-How-to-fix-log4j-WARN-console-messages-when-running-an-Application-inside-IntelliJ- 생각

그러나 여기 그는 아래와 같이 말합니다

이 문제를 해결하려면 프로젝트의 main / resources 폴더에 다음 log4j.resources 파일을 입력하십시오.

log4j.resources를 작성하는 대신 log4j.properties를 작성하십시오. IntelliJ에서 리소스를 마우스 오른쪽 버튼으로 클릭-> 새로 만들기-> 리소스 번들-그냥 이름을 log4j로 지정하십시오.


0

리소스 테스트 폴더에 log4j.properties또는 log4j.xml파일을 추가 한 후에도 Intellij IDEA에서이 오류가 발생 하면 Intellij IDEA가 파일의 존재를 아직 인식하지 못했을 수 있습니다.

따라서 파일을 추가 한 후 파일을 마우스 오른쪽 버튼으로 클릭하고 Recompile log4j.xml을 선택하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.