2012-08-22 69 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