当前位置: 首页 > 知识库问答 >
问题:

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

史和泰
2023-03-14

好的,所以我试图使内存appender(简单的记录器,日志到ArrayList而不是控制台或文件),但现在我想禁用它从打印到控制台。

问题和网站,到目前为止我已经读过了(但我仍然不知道它是什么)。。

  • StackOverFlow问题log4j:将特定类的输出记录到特定附加器

它包含了我想要实现的所有部分,但我仍然有点困惑。

我也读了这段Logback或Log4j附加解释的状态...

但是,如果logger 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,并从内存\u APPENDER根记录器控制台中排除任何其他内容。

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;
}
}

但它不。。。

共有2个答案

宗沛
2023-03-14

我刚刚通过将其设置为log4j解决了这个问题。xml,将value=“TRACE”替换为value=“ERROR”。希望这能帮助一些人:)

    <root>
        <priority value="ERROR" />
        <appender-ref ref="STDOUT"/>
    </root>
边永贞
2023-03-14

这条线

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。反恐精英。sdc。log4jassignment。s06005586。内存出现,它应该映射到log4j中的记录器。属性或仅包装部分,如nz。ac.massey。反恐精英。sdc。log4jaSignment

看来你在这里混了很多。是Log4jMemoryAppender你的MEMORY_APPENDER或不是?

为什么要调用BasicConfigurator。configure()?您不想使用log4j吗。属性

通常在一个类中,你这样做是为了得到一个记录器:

package com.mycompany;

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

记录器名称将是完全限定的类名com。我的公司。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。属性

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

从这里,您可以尝试添加文件附件或您自己的内存附件。

 类似资料:
  • 我试图将命令提示符中打印出来的信息从JAVA控制台显示到C#。当在JAVA中发出System.out.println时,它可以很好地工作,但是它不能用于logger.info print out。 注意:当我通过windows命令提示符(CMD>java-jar testbed.jar)运行它时,记录器信息会在命令提示符中打印出来。 JAVA来做一个简单的增量和减量数字,当按下按钮进行增量或减量时

  • 我正在使用下面的jQuery JSONP请求按URL检查资源的状态。当资源不可用或服务器关闭时,我的函数更新显示。 我遇到的问题是,尽管为和声明了处理程序(它们不将任何内容记录到控制台),但jQuery总是将失败的请求记录在控制台中。如果资源长时间不可用,这将建立一个巨大的控制台日志,最终导致浏览器进程崩溃(在我的例子中是Chrome)。 有什么办法可以阻止它这样做吗?

  • 我是java新手,尝试使用logger而不是System。出来打印(); 让奶牛和公牛玩游戏,但不知道如何让记录器打印新行中的每个数字,而是将其打印为一个数字。 例子: 输出为: 我想把3647打印成一个数字。

  • 我试图使用TDD(测试驱动开发)与。当我使用时,不会到控制台。 我正在使用来运行它。 似乎说默认情况下它应该工作:http://pytest.org/latest/capture.html 但是: 没有任何东西被打印到我的标准输出控制台(只是正常的进度和多少测试通过/失败)。 我正在测试的脚本包含打印: 在模块中,默认情况下打印所有内容,这正是我所需要的。但是,出于其他原因,我希望使用。 有人知道

  • 我们可以dsable日志打印一些自定义创建记录器吗? 我想禁用文件记录器控制台中的打印消息

  • 我有一个Web应用程序,使用log4j。我在 /WEB-INF/classes/log4j.properties文件中配置了一个自定义记录器,如下所示: 日志消息按预期写入server.log,但我试图找到一种方法来控制自定义记录器日志级别通过glassfish服务器。 我尝试从命令中创建glassfish中的记录器: 但是,即使asadmin命令将记录器设置为警告,所有INFO消息仍然会被记录。