提问者:小点点

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


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

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


共3个答案

匿名用户

有一种方法可以通过编程来做到这一点,但它并不直观。如果您最终需要在更精细的级别或多个类上进行控制,那么更改为SLF4J或Log4J可能会更好

问题是记录器是使用Weak引用缓存的。从你调用Logger. setLevel()到记录器被实际使用,它可能是GC'ed。所以,记录日志的记录器不是你设置级别的记录器!在启动时有很多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.log.config.file,它也会被覆盖。
  2. 完全破解-以后可能无法维护或理解。
  3. 您的配置字符串必须有效。请注意,所有行都必须以\n结尾。
  4. 必须很早调用,最好是main()中的第一行。如果这不可能,您可能还需要迭代所有现有的记录器并使用setLevel()更新它们的配置。

匿名用户

下面来自Apache CXF的链接有一个很好理解的留档,无论是java. util.log还是log4j或sl4j:

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

如果您使用的是log4j,这将非常容易。

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

log4j.apache.cxf = WARN

匿名用户

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

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

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

完成此操作后,您将需要将-Djava. util.log.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/class文件夹中(有关更多详细信息,请参阅此处)。

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

要删除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

如何关闭额外的日志记录?