2012-08-22 5 views
4

좋아, 이제는 콘솔이나 파일 대신 ArrayList에 기록하는 로거 (logger)라는 메모리 어 펜더를 만들려고했지만 지금은 콘솔로 인쇄하지 못하게하려고합니다.Log4j 로거에서 콘솔로 인쇄하는 것을 어떻게 중지합니까?

질문과 웹 사이트, 지금까지 읽었습니다 (하지만 난 여전히 문이 안 열려도 그것을 밖으로입니다) ..

그것은이 내가 성취하려고하는 모든 부분이 있지만 여전히 혼란 스럽습니다. 나는 또한 상태 Logback or Log4j Additivity Explained에서이 부분을 읽어

.. 로거 X의 aditivity 플래그 그러나 거짓, 또는 비활성화로 설정되어있는 경우

, 다음 호출 x.debug는()는 파일에 기록합니다 . 이론 내 log4j.properties 파일에 따라서

log4j.rootLogger=ERROR, console 
log4j.appender.console=org.apache.log4j.ConsoleAppender 
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
log4j.appender.console.layout.ConversionPattern=%d %5p %c (%F:%L) - %m%n 
#hide the Log4jMemoryAppender from console 
log4j.logger.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender= ERROR, MEMORY_APPENDER 
log4j.appender.MEMORY_APPENDER=nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender.Log4jMemoryAppender 
log4j.additivity.rootLogger = false 
log4j.additivity.console = false 
log4j.additivity.MEMORY_APPENDER=false 

***Hello World를 인쇄 MEMORY_APPENDER, rootLoggerconsole로부터 아무것도를 제외해야합니다.

package nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender; 

import java.util.ArrayList; 
import org.apache.log4j.AppenderSkeleton; 
import org.apache.log4j.spi.LoggingEvent; 

import org.apache.log4j.BasicConfigurator; 
import org.apache.log4j.Level; 
import org.apache.log4j.Logger; 
import org.apache.log4j.PropertyConfigurator; 

public class Log4jMemoryAppender extends AppenderSkeleton { 

ArrayList<LoggingEvent> eventsList = new ArrayList(); 

public static void main (String [] args) { 

    PropertyConfigurator.configure("Lib/log4j.properties"); 
    Log4jMemoryAppender app = new Log4jMemoryAppender(); 
    Logger logger = Logger.getLogger(Log4jMemoryAppender.class); 
    logger.setLevel(Level.INFO); 

    logger.addAppender(app); 
    logger.info("Hello World"); 
    logger.debug("Level DEBUG Is SET"); 

    for (LoggingEvent le: app.eventsList) { 
     System.out.println("***" + le.getMessage()); 
    } 
} 

@Override 
protected void append(LoggingEvent event) { 
    eventsList.add(event); 
} 

public void close() { 
} 

public boolean requiresLayout() { 
    return false; 
} 
} 

하지만 그렇지 ...

appender http://iforce.co.nz/i/2jypxucr.ilb.png

+0

'nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender'에 대한 로거 나 appender를 정의하지 않았습니다. – maba

+0

Logger logger = Logger.getLogger ("nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender"); '동일한 결과, 로거 정의 란 무엇입니까? – Killrawr

+2

당신의'log4j.properties'에. 'log4j.logger.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender = ERROR, MEMORY_APPENDER' 및'log4j.appender.MEMORY_APPENDER = ' – maba

답변

4

는 라인

MEMORY_APPENDER=false 

당신은 거짓 값을하는 펜더를 설정할 수 없습니다, 작동하지 않습니다.

log4j.rootLogger=ERROR, console 
log4j.appender.console=org.apache.log4j.ConsoleAppender 

log4j.logger.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender = ERROR, MEMORY_APPENDER 
log4j.additivity.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender = false 

귀하의 예제 중 하나에서 사용되는 로거는 nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender이며, 즉 log4j.properties에서 로거 또는 nz.ac.massey.cs.sdc.log4jassignment 같은 단지 패키지 부분에 매핑해야합니다 :

이 같은 일을 더 나은 경우

.


여기에 많이 섞여있는 것처럼 보입니다. Log4jMemoryAppender은 (는) MEMORY_APPENDER입니까? 아닙니다.

그리고 왜 BasicConfigurator.configure()으로 전화를 걸고 계십니까? log4j.properties을 사용하고 싶지 않으십니까?


은 일반적으로 수업 시간에 당신은 로거를 얻기 위해이 작업을 수행 :

package com.mycompany; 

public class MyClass { 
    private static final Logger log = Logger.getLogger(MyClass.class); 
    ... 
} 

로거 이름은 정규화 된 클래스 이름 com.mycompany.MyClass 될 것입니다.

그럼 당신은 이런 log4j.properties을 가질 수

log4j.rootLogger=ERROR, console 
log4j.appender.console=org.apache.log4j.ConsoleAppender 

log4j.logger.com.mycompany=INFO, file 
log4j.additivity.com.mycompany=false 

logfj.appender.file = <some file appender> 

확인을, 처음부터 시작. A 매우 간단한 예입니다.

src/main/resources/log4j.properties

package org.stackoverflow; 

import org.apache.log4j.Logger; 

/** 
* @author maba, 2012-08-22 
*/ 
public class Log4JTest { 

    public static final Logger log = Logger.getLogger(Log4JTest.class); 

    public static void main(String[] args) { 
     log.error("Error in main"); 
    } 
} 

src/main/java/Log4JTest.java

log4j.rootLogger = ERROR, 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 - %m%n 

이제 컴파일하고 실행하는 경우 log4j.propertieslog4j.jar하고 자신의 클래스와 함께 클래스 경로에 있는지 확인하십시오.

이 표시됩니다 여기에서

0 [main] ERROR org.stackoverflow.Log4JTest - Error in main 

당신이 파일 펜더 또는 자신의 메모리 어 펜더를 추가 할 수 있습니다.

+0

클래스 패스에'log4j.properties'를 넣지 않으면 Log4J 프레임 워크가 찾아서 사용하게됩니다. – maba

+0

가능한 가장 간단한 설정부터 시작하여 거기서 가십시오. 나는 예제를 추가 할 것이다. 아마도 잘못 될 수는 없습니다. – maba

+0

classpath에'log4j.properties'가 있습니까? 나는 그렇지 않다. – maba

관련 문제