以编程方式关闭特定包的 java.util.logging
Turn off java.util.logging for a specific package programmatically
我正在使用内部使用 Apache CXF 的 SDK。 Apache CXF 默认使用 java.util.logging
包进行日志记录。
我想将日志记录级别从 INFO
更改为 WARNING
或将其完全关闭。我可以在我的应用程序的主要方法中以编程方式执行此操作吗?
下面来自 Apache CXF 的 link 有一个很好理解的文档,无论它是 java.util.logging 还是 log4j 或者sl4j:
http://cxf.apache.org/docs/general-cxf-logging.html
如果你用的是log4j就很简单了
您可以为 Apache CXF 配置 log4j,然后在 log4j.properties 文件中添加如下内容,这将关闭 apache cxf 日志记录。
log4j.apache.cxf = WARN
有一种方法可以以编程方式执行此操作,但它不直观。如果您最终需要在更精细的级别或多个 类
上进行控制,则更改为 SLF4J 或 Log4J 可能会更好
问题是记录器是使用 WeakReferences 缓存的。从您调用 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();
}
请注意,此方法存在一些问题:
- 您正在覆盖内置配置,因此您必须设置根处理程序。如果你设置
-Djava.util.logging.config.file
,它也会被覆盖。
- 完全破解 - 以后可能无法维护或理解。
- 您的配置字符串必须有效。请注意,所有行都必须以
\n
. 结尾
- 必须很早就调用,最好是
main()
中的第一行。如果这不可能,您可能还需要迭代所有现有的记录器并使用 setLevel()
更新它们的配置。
配置日志记录级别
在 CXF 发行版的 /etc
文件夹中有一个示例 Java SE logging.properties
文件,您可以使用它来配置日志记录。例如,如果要将控制台日志记录级别从 WARNING
更改为 FINE
,则需要更新此 logging.properties
文件中的两个属性,如下所示:
.level= FINE
java.util.logging.ConsoleHandler.level = FINE
N.B:如果要将FINE
改成其他LEVEL,只需将FINE
改成others
即可
完成后,您需要将 -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 服务提供商,将 [= WEB-INF/classes
文件夹中的 15=] 文件(有关详细信息,请参阅 here。)
资源Link:
Enables/Disable CXF Logging (payload)
To remove cxf logging just comment out or remove code the following
code from your cxf configuration xml file.
<cxf:bus>
<cxf:features>
<cxf:logging></cxf:logging>
</cxf:features>
</cxf:bus>
关闭额外的日志记录:
要关闭额外的日志记录,请将 org.apache.cxf
记录器级别更改为 ERROR
。将此行添加到 log4j.properties
:
log4j.logger.org.apache.cxf=ERROR
资源Link:
How can I turn off extra logging?
您可以使用 Log4j 而不是 java.util.logging documented. This is a 100% programmatic way to configure a Log4j appender for apache CXF based on this answer
//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 初始化 之前执行代码
我正在使用内部使用 Apache CXF 的 SDK。 Apache CXF 默认使用 java.util.logging
包进行日志记录。
我想将日志记录级别从 INFO
更改为 WARNING
或将其完全关闭。我可以在我的应用程序的主要方法中以编程方式执行此操作吗?
下面来自 Apache CXF 的 link 有一个很好理解的文档,无论它是 java.util.logging 还是 log4j 或者sl4j:
http://cxf.apache.org/docs/general-cxf-logging.html
如果你用的是log4j就很简单了
您可以为 Apache CXF 配置 log4j,然后在 log4j.properties 文件中添加如下内容,这将关闭 apache cxf 日志记录。
log4j.apache.cxf = WARN
有一种方法可以以编程方式执行此操作,但它不直观。如果您最终需要在更精细的级别或多个 类
上进行控制,则更改为 SLF4J 或 Log4J 可能会更好问题是记录器是使用 WeakReferences 缓存的。从您调用 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();
}
请注意,此方法存在一些问题:
- 您正在覆盖内置配置,因此您必须设置根处理程序。如果你设置
-Djava.util.logging.config.file
,它也会被覆盖。 - 完全破解 - 以后可能无法维护或理解。
- 您的配置字符串必须有效。请注意,所有行都必须以
\n
. 结尾
- 必须很早就调用,最好是
main()
中的第一行。如果这不可能,您可能还需要迭代所有现有的记录器并使用setLevel()
更新它们的配置。
配置日志记录级别
在 CXF 发行版的 /etc
文件夹中有一个示例 Java SE logging.properties
文件,您可以使用它来配置日志记录。例如,如果要将控制台日志记录级别从 WARNING
更改为 FINE
,则需要更新此 logging.properties
文件中的两个属性,如下所示:
.level= FINE
java.util.logging.ConsoleHandler.level = FINE
N.B:如果要将FINE
改成其他LEVEL,只需将FINE
改成others
完成后,您需要将 -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 服务提供商,将 [= WEB-INF/classes
文件夹中的 15=] 文件(有关详细信息,请参阅 here。)
资源Link:
Enables/Disable CXF Logging (payload)
To remove cxf logging just comment out or remove code the following code from your cxf configuration xml file.
<cxf:bus> <cxf:features> <cxf:logging></cxf:logging> </cxf:features> </cxf:bus>
关闭额外的日志记录:
要关闭额外的日志记录,请将 org.apache.cxf
记录器级别更改为 ERROR
。将此行添加到 log4j.properties
:
log4j.logger.org.apache.cxf=ERROR
资源Link:
How can I turn off extra logging?
您可以使用 Log4j 而不是 java.util.logging documented. This is a 100% programmatic way to configure a Log4j appender for apache CXF based on this answer
//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 初始化 之前执行代码