Log4j的如何从打印到控制台停止我的记录?(Log4j How do I stop my logg

2019-06-27 06:28发布

好了,所以我想一个内存附加器(一个简单的记录,它记录到一个ArrayList,而不是控制台或文件),但现在我想从打印到控制台禁用它。

这些问题和网站,我至今读(但我仍然无法弄清楚是)..

  • StackOverflow的问题log4j的:登录特定类的输出到一个特定的appender
  • StackOverflow的问题log4j的:禁用log4j的控制台记录,并且启用文件日志
  • 编码器启动:log4j的:停止记录到控制台

它有什么,我努力实现所有的片段,但我仍然有种困惑。

我也看过此分部的logback或Log4j的加和解释哪些状态..

如果记录仪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;
}
}

但事实并非如此......

附加器http://iforce.co.nz/i/2jypxucr.ilb.png

Answer 1:

该生产线

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


好像你在这里混了很多。 是Log4jMemoryAppenderMEMORY_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,从起点开始。 一个非常简单的例子。

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。



文章来源: Log4j How do I stop my logger from printing to the console?