2014-09-15 1 views
2

Log4j 2를 사용하여 로그 파일과 콘솔에 로그인 할 때 문제가 발생했습니다.Log4j 2에서 JSON 구성으로 루트 로거 만 작동하는 이유는 무엇입니까?

JSON 구성을 사용하고 있습니다. 정상적으로로드되었습니다.

{ 
    "configuration": { 
     "appenders": { 
      "Console": { 
       "name": "consoleAppender", 
       "PatternLayout": { 
        "pattern": "%d{DEFAULT} %-5p [%t]: %m%n" 
       } 
      }, 
      "File": { 
       "name": "fileAppender", 
       "fileName": "log.txt", 
       "PatternLayout": { 
        "pattern": "%d{DEFAULT} %-5p [%t]: %m%n" 
       } 
      } 
     }, 
     "loggers": { 
      "logger": 
      { 
       "name": "fileLogger", 
       "level": "info", 
       "appender-ref": { "ref": "fileAppender" } 
      }, 
      "root": { 
       "level": "info", 
       "appender-ref": { "ref": "consoleAppender" } 
      } 
     } 
    } 
} 

내가 테스트 한 다음 클래스로 로그인 : 다음과 같이 전체에서 내 구성 (log4j2.json)입니다

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

public class LoggingTest { 
    static final Logger log = LogManager.getLogger(LoggingTest.class.getName()); 

    public static void main(String[] args) { 
     log.trace("A trace log from " + LoggingTest.class.getName() + ".main(String[])"); 
     log.debug("A debug log from " + LoggingTest.class.getName() + ".main(String[])"); 
     log.info("An info log from " + LoggingTest.class.getName() + ".main(String[])"); 
     log.warn("A warn log from " + LoggingTest.class.getName() + ".main(String[])"); 
     log.error("An error log from " + LoggingTest.class.getName() + ".main(String[])"); 
     log.fatal("A fatal error log from " + LoggingTest.class.getName() + ".main(String[])"); 
    } 
} 

콘솔이 예상대로, 다음과 같은 메시지가 포함되어 실행

:

2014-09-15 14:40:42,411 INFO [main]: An info log from LoggingTest.main(String[]) 
2014-09-15 14:40:42,412 WARN [main]: A warn log from LoggingTest.main(String[]) 
2014-09-15 14:40:42,412 ERROR [main]: An error log from LoggingTest.main(String[]) 
2014-09-15 14:40:42,412 FATAL [main]: A fatal error log from LoggingTest.main(String[]) 

log.txt 로그 파일이 만들어 지지만 비어 있습니다. 나는 또한 정확한 결과와 함께 RollingFileAppender를 사용해 보았습니다. 이 경우 아무것도에서

{ 
    "name": "fileLogger", 
    "level": "info", 
    "appender-ref": { "ref": "consoleAppender" } 
}, 
"root": { 
    "level": "info", 
    "appender-ref": { "ref": "fileAppender" } 
} 

콘솔에 로그인되지만 로그 파일에 로그 메시지가 나타납니다 : 나는 로거 '펜더-심판을 변경했습니다.

구성에 문제가 있습니까? 아니면 무엇입니까?

+0

. 'LogManager.getLogger ("fileLogger")'를 실행하지 않으면,이 로그 작성기를 작성하지 않았기 때문에, 파일에 로그 작성 프로그램이 없습니다. –

+0

아, 알겠습니다. 로그 항목이 두 appender 모두에서 끝나기 위해 config를 어떻게 변경해야합니까? – Kallja

답변

2

귀하의 문제는 여기에 있습니다 :

"loggers": { 
     "logger": 
     { 
      "name": "fileLogger", 
      "level": "info", 
      "appender-ref": { "ref": "fileAppender" } 
     }, 
     "root": { 
      "level": "info", 
      "appender-ref": { "ref": "consoleAppender" } 
     } 
    } 

당신은 consoleAppender에 부착 된 root 로거가 - 모든 (첨가제) 기록 콘솔로 이동 즉. 로깅은 fileLogger이고 로깅은 fileAppender입니다.

LogManager.getLogger("fileLogger") 

라는 이름의 로거를 얻으려면 fileLogger 당신은 결코 파일에서 출력을 볼 것 없다 : 이것은 당신이하지 않는 것을 의미한다. fileLogger이 무엇을 달성해야하는지 잘 모르겠다.하지만 에 대한 설명서를 읽어야한다고 생각하는데, logger 구성 요소가 오해 한 것 같다. 루트 로거에이 어 펜더를 할당하기 위해

단순히 때문에 같은 appender-ref 선언에 펜더의 배열을 사용 : 당신은 fileLogger``라는 이름의`Logger`에`fileAppender`을 할당 한

"loggers": { 
    "root": { 
     "level":"info", 
     "appender-ref": [{ "ref":"fileAppender" }, { "ref":"consoleAppender" }] 
    } 
    } 
+0

제공되는 설정은 콘솔에만 기록되며, 논리적이라고 생각할 때; 동일한 키와 연관된 두 개의 값이 있습니다. 그러나 나는 해결책을 찾았습니다 : 하나의 appender-ref는 ref 객체 모두를 포함하는 배열을 포함합니다 : "appender-ref": [{ "ref": "consoleAppender"}, { "ref": " fileAppender "}]}. 대답을 변경하면 받아 들일 것입니다. :) – Kallja

+0

죄송합니다. XML 설정을 JSON으로 변환하려고했는데 확실한 테스트를 실행해야합니다. –