【问题标题】:How to configure log4j to log only info messages and higher?如何将 log4j 配置为仅记录信息消息及更高版本?
【发布时间】:2013-06-30 20:11:21
【问题描述】:

我不使用 config 或 xml 文件来配置 log4j,因为不需要深入配置它。我只需要将消息打印到控制台。所以我这样做:

BasicConfigurator.configure();

为了只打印信息和更高级别的消息,我这样做:

Logger LOG = Logger.getLogger(MyClass.class)
LOG.setLevel(Level.INFO);

但我还是在控制台中看到了调试消息。但我只需要打印信息和实际的错误消息。

如何做到这一点?

UPD: 我创建了一个配置文件,其中包含,如教程中所述: manual以下:

  log4j.rootLogger=INFO, stdout

  # Direct log messages to stdout
  log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  log4j.appender.stdout.Target=System.out
  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L        %m%n

log4j.logger.com.messagedna.facade=INFO
log4j.logger.com.messagedna.receiver=INFO
log4j.logger.com.messagedna.util=INFO
log4j.logger.com.messagedna.parser=INFO

我把它发给com.messagedna

在我需要记录器的每个课程中,我都写了以下内容:

Properties props = new Properties();
try {
    props.load(new FileInputStream("/log4j.properties"));
    } catch (Exception e){
      LOG.error(e);
      }
PropertyConfigurator.configure(props);

但是当我运行我的应用程序时,我得到以下信息:

log4j:WARN No appenders could be found for logger (com.messagedna.server.util.Config).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

【问题讨论】:

  • 您的 log4j 位于文件系统的根目录?!
  • 我无法使用这些概念。你的意思是配置文件在哪里还是什么?

标签: java log4j


【解决方案1】:

配置 log4j.properties:

log4j.rootLogger=DEBUG, A1

log4j.logger.com.MYPACKAGE=INFO, A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender

【讨论】:

  • 我明白了。我应该把这个文件放在哪个地方?到我使用记录器的包?
  • 好吧看:stackoverflow.com/questions/8965946/… 但我不推荐它,为什么在不需要它的时候把一切都复杂化
  • @NikitinMikhail 在代码中使用它可能看起来更简单,但是您会发现将配置移动到文件中更加强大和灵活(随着应用程序的增长,这将变得越来越有用) 并且转移到使用配置文件实际上并不费力。
  • 根据您的项目需要!! @robjohncox 为您提供了另一种选择
【解决方案2】:

您仅为使用 MyClass.class 的记录器记录的消息设置级别,但其他记录器上的调试级别的任何消息仍将被打印。

您真正需要做的是在控制台日志处理程序(负责将所有日志消息打印到控制台)上设置日志级别。但是,在使用 BasicConfigurator 时这样做会非常棘手,您最好在属性文件中指定日志配置(这样更灵活)。

我建议您通过log4j logging configuration tutorial 工作 - 这将帮助您准确地组合您想要的配置,并且应该证明您的时间投资是值得的。但是,如果您想快速完成此操作,请尝试将以下内容添加到文件 log4j.properties (example taken from here):

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

然后更改您的代码以执行以下操作:

Properties props = new Properties();
props.load(new FileInputStream("/my/path/to/log4j.properties"));
PropertyConfigurator.configure(props);

【讨论】:

  • 我应该从哪里获得属性?
  • 这是在 java.util.Properties 找到的 - 抱歉应该说清楚
  • 如果我使用您的变体,我会得到以下信息:log4j:WARN No appenders could be found for logger (com.messagedna.server.util.Config)。 log4j:WARN 请正确初始化 log4j 系统。 log4j:WARN 请参阅logging.apache.org/log4j/1.2/faq.html#noconfig 了解更多信息。
  • 根据错误中的链接,当找不到配置文件时会发生“找不到记录器的附加程序”-您是否正确设置了文件的路径?配置正在设置根记录器,因此如果读取配置,则应该有记录器com.messagedna.server.util.Config 的附加程序。
  • 好的,我为每个班级配置了设置,仍然有相同的输出
【解决方案3】:

既然你只想用代码来做

这是另一种选择。

一开始就这样做,静态代码初始化将起作用

logger = Logger.getLogger(Class.getName(), factory);
logger.setLevel(Level.INFO);

话虽如此,没有理由不使用 log4j.xml。它非常易于使用。

【讨论】:

  • 你指的是哪家工厂?
  • 任何实现 LoggerFactory 的类
猜你喜欢
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多