2012-08-22 71 views
4

好吧,所以我試圖做一個內存appender(簡單地說是一個記錄器,記錄到ArrayList而不是控制檯或文件),但現在我想禁用它打印到控制檯。Log4j如何阻止我的記錄器打印到控制檯?

的問題和網站,我至今讀(但我仍然無法數字出來是)..

它所有關於我想要實現的細分,但我仍然有點困惑。

我也是從Logback or Log4j Additivity Explained其中規定閱讀本段..

如果記錄儀X的aditivity但是標誌被設置爲false,或禁用,則調用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_APPENDERrootLoggerconsole

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 

將無法​​正常工作,你不能設置一個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> 

OK,從頭開始。 A 非常簡單的例子

src/main/java/Log4JTest.java

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/resources/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=%-4r [%t] %-5p %c %x - %m%n 

現在編譯並確保log4j.properties是在類路徑連同log4j.jar和你自己的類運行時。

您將看到:

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

從這裏你可以嘗試添加文件附加目的地或您自己的內存的appender。

+0

不,您將'log4j.properties'放入類路徑中,然後Log4J框架將找到並使用它。 – maba

+0

從最簡單的設置開始,並從那裏開始。我會添加一個例子。它不可能出錯。 – maba

+0

你的'log4j.properties'在類路徑中嗎?我猜不會。 – maba