以编程方式关闭特定包的java.util.logging

时间:2016-11-07 09:03:08

标签: java logging cxf

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

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

4 个答案:

答案 0 :(得分:3)

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

问题是Logger是使用WeakReferences缓存的。从您拨打Logger.setLevel()到实际使用记录器的时间,它可能是GC编辑的。因此,记录的记录器不是您设置级别的记录器!在启动时有大量GC的框架中尤其如此。

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

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()更新其配置。

答案 1 :(得分:2)

您可以使用 Log4j 代替 java.util.logging documented。这是基于此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初始化之前执行代码

答案 2 :(得分:1)

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

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

如果您使用log4j,那将非常容易。

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

log4j.apache.cxf = WARN

答案 3 :(得分:1)

配置日志记录级别

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

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

N.B:如果您想将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客户端,您可以修改logging.properties文件夹中的Java范围JDK_HOME/jre/lib文件,或者修改servlet托管的Web服务提供程序,将logging.properties文件放入WEB-INF/classes文件夹(有关详细信息,请参阅here。)

资源链接:

  1. http://cxf.apache.org/docs/general-cxf-logging.html
  2. Enables/Disable CXF Logging (payload)

      

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

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

    关闭额外的日志记录:

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

    log4j.logger.org.apache.cxf=ERROR
    

    资源链接:

    How can I turn off extra logging?