Log4j如何阻止我的记录器打印到控制台?

时间:2012-08-22 06:24:39

标签: java console log4j

好吧所以我正在尝试创建一个内存appender(只是一个记录器,记录到ArrayList而不是控制台或文件)但是现在我想禁用它从打印到控制台。

我到目前为止所阅读的问题和网站(但我仍然无法弄明白)..

它有我想要实现的所有细分,但我仍然有点困惑。

我还从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

2 个答案:

答案 0 :(得分: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>

好的,从头开始。 非常简单示例。

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

从这里你可以尝试添加文件追加器或你自己的内存追加器。

答案 1 :(得分:0)

我已经通过在log4j.xml中设置此问题来解决此问题,将value =“ TRACE”替换为value =“ ERROR”。希望这可以帮助一些人:)

    <root>
        <priority value="ERROR" />
        <appender-ref ref="STDOUT"/>
    </root>