【问题标题】:Turn off java.util.logging for a specific package programmatically以编程方式关闭特定包的 java.util.logging
【发布时间】:2017-03-20 13:38:24
【问题描述】:

我正在使用在内部使用 Apache CXF 的 SDK。 Apache CXF 默认使用java.util.logging 包进行日志记录。

我想将日志记录级别从 INFO 更改为 WARNING 或完全关闭它。我可以在我的应用程序的 main 方法中以编程方式执行此操作吗?

【问题讨论】:

  • 你试过这个example 吗?
  • @eparvan 我试过: Logger.getLogger("org.apache.cxf").setLevel(Level.OFF) 并没有帮助。 INFO 级别的日志仍在显示中。
  • 这个链接应该有帮助:nailedtothex.org/roller/kyle/entry/…
  • @PrahaladDeshpande 抱歉,没有。
  • 我已经尝试过 eparvan 提供的示例,它可以在 CXF3.1.6 和 java1.8 上正常工作。我用 log4j 写了一个替代方案

标签: java logging cxf


【解决方案1】:

有一种方法可以以编程方式执行此操作,但它并不直观。如果您最终需要在更精细的级别或多个类上进行控制,则更改为 SLF4J 或 Log4J 可能会更好

问题是 Logger 是使用 Wea​​kReferences 缓存的。从您调用Logger.setLevel() 直到实际使用 Logger,它可能会被 GC 处理。因此,记录日志的 Logger 不是您设置级别的 Logger!在启动时有大量 GC 的框架中尤其如此。

解决方案是以编程方式设置配置,而不是实际的记录器。

String logConfig = ".level=" + java.util.logging.Level.INFO + '\n';
logConfig += "handlers=java.util.logging.ConsoleHandler\n";
// ensure ConsoleHandler does not filter
logConfig += "java.util.logging.ConsoleHandler" + ".level=" + java.util.logging.Level.FINEST + '\n';

//set your custom levels
logConfig += "org.apache.cxf" + ".level=" + java.util.logging.Level.WARNING + "\n";

try {
  java.util.logging.LogManager.getLogManager().readConfiguration(new java.io.ByteArrayInputStream(logConfig.getBytes("UTF-8")));
  // no need to close ByteArrayInputStream -- it is a no-op
}
catch (IOException ioe) {
  System.err.println("cannot fully configure logging");
  ioe.printStackTrace();
}

请注意,这种方法存在一些问题:

  1. 您正在覆盖内置配置,因此您必须设置根处理程序。如果设置-Djava.util.logging.config.file,也会被覆盖。
  2. 完全破解 - 以后可能无法维护或理解。
  3. 您的配置字符串必须有效。请注意,所有行都必须以 \n 结尾。
  4. 必须尽早调用,最好是main() 的第一行。如果这不可行,您可能还需要迭代所有现有 Logger 并使用 setLevel() 更新其配置。

【讨论】:

  • From the time you call Logger.setLevel() until the Logger is actually used, it may be GC'ed 如果你持有对记录器的引用,那不是问题
  • 有没有办法让 CXF 在没有命令行参数的情况下以编程方式使用 log4j?
  • @SvetlinZarev 我认为保留对 Logger 的引用应该可以,但是如果您尝试为不同的类/包保留不同的设置,则可能需要大量引用。
【解决方案2】:

以下来自 Apache CXF 的链接有一个很好理解的文档,无论是 java.util.logginglog4j 还是 sl4j

http://cxf.apache.org/docs/general-cxf-logging.html

如果你使用 log4j 会很容易。

您可以为 Apache CXF 配置 log4j,然后在 log4j.properties 文件中附加如下内容,这将关闭 apache cxf 日志记录。

log4j.apache.cxf = WARN

【讨论】:

  • 有没有办法让 CXF 在没有命令行参数的情况下以编程方式使用 log4j?
  • 正如@pedrofb 向您建议的答案之一。已经有一个 SO 帖子可用于以编程方式设置它 - stackoverflow.com/questions/8965946/…
【解决方案3】:

配置日志记录级别

在 CXF 发行版的 /etc 文件夹中,有一个示例 Java SE logging.properties 文件可用于配置日志记录。例如,如果要将控制台日志记录级别从 WARNING 更改为 FINE,则需要更新此 logging.properties 文件中的两个属性,如下所示:

.level= FINE
java.util.logging.ConsoleHandler.level = FINE

注意:如果您想将FINE 更改为其他级别,只需将FINE 更改为其他级别

完成后,您需要将 -Djava.util.logging.config.file 属性设置为logging.properties 文件的位置。例如,下面的 Ant 目标设置了以下属性:

<target name="runClient">
   <java classname="client.WSClient" fork="true">         
      <classpath>
         <pathelement location="${build.classes.dir}"/>
         <fileset dir="${env.CXF_HOME}/lib">
            <include name="*.jar"/>
         </fileset>
      </classpath>
      <jvmarg value="-Djava.util.logging.config.file=/usr/myclientapp/logging.properties"/>
   </java>
</target>

或者,对于 SOAP 客户端,您可以修改 JDK_HOME/jre/lib 文件夹中的 Java 范围的 logging.properties 文件,或者对于 servlet 托管的 Web 服务提供者,将 logging.properties 文件放在 WEB-INF/classes 文件夹中(请参阅here 了解更多详情。)

资源链接:

  1. http://cxf.apache.org/docs/general-cxf-logging.html

Enables/Disable CXF Logging (payload)

要删除 cxf 日志,只需注释掉或删除以下代码 来自您的 cxf 配置 xml 文件的代码。

<cxf:bus>
      <cxf:features>
          <cxf:logging></cxf:logging>
      </cxf:features>
</cxf:bus>

关闭额外的日志记录:

要关闭额外的日志记录,请将 org.apache.cxf Logger 级别更改为 ERROR。将此行添加到log4j.properties

log4j.logger.org.apache.cxf=ERROR

资源链接:

How can I turn off extra logging?

【讨论】:

  • 我对您在此处发布的所有内容都很熟悉。请阅读我的问题。
【解决方案4】:

您可以像 documented 那样使用 Log4j 代替 java.util.logging。这是基于 answer 为 apache CXF 配置 Log4j appender 的 100% 编程方式

//equivalent to -Dorg.apache.cxf.Logger=org.apache.cxf.common.logging.Log4jLogger     
System.setProperty("org.apache.cxf.Logger","org.apache.cxf.common.logging.Log4jLogger");

//Creates the file appender
FileAppender fa = new FileAppender();
fa.setName("FileLogger");
fa.setFile("mylog.log");
fa.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
fa.setThreshold(Level.WARN);
fa.setAppend(true);
fa.activateOptions();

//Add the appender to CXF logger
Logger.getLogger("org.apache.cxf").addAppender(fa);

您需要在类路径中使用 log4j.jar 并在 任何 CXF 初始化之前执行代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 2015-03-17
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多