停止来自第三方 Jars 的 log4j 调试打印
Stop log4j debug printing from third party Jars
我正在使用来自其他 Jars 的 类,这些 Jars 使用来自其他使用 log4j 的 Jars 的 类。我无法更改这些 Jar 中的任何一个。
其中很多 类 在 IntelliJ 中调试时在启动时将调试打印到控制台。
我正在寻找阻止它的方法,因为它很烦人。
我尝试创建一个日志级别为 "error" 的 log4j.properties 文件,并将其加载到我的应用程序的 main() 中,并将默认记录器设置为 "error"等级。我还检查了所有 Jars 内部都有一个属性,但没有指定什么日志级别(他们只是说 Jar 是什么版本)。我已经尝试为 类 创建我自己的属性文件以使用它,但他们已经在加载文件之前打印了他们的调试。
下面是正在生成的一些调试信息:
12:54:17.660 [main] DEBUG org.apache.commons.configuration.PropertiesConfiguration - FileName set to xxx.properties
12:54:17.665 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - ConfigurationUtils.locate(): base is null, name is xxx.properties
12:54:17.665 [main] DEBUG org.apache.commons.configuration.DefaultFileSystem - Could not locate file xxx.properties at null: no protocol: xxx.properties
12:54:17.668 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - Loading configuration from the path xxx.properties
12:54:17.668 [main] DEBUG org.apache.commons.configuration.PropertiesConfiguration - Base path set to file:///C:/myProgram/xxx.properties
12:54:17.680 [main] DEBUG org.apache.commons.configuration.PropertiesConfiguration - FileName set to yyy.properties
12:54:17.680 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - ConfigurationUtils.locate(): base is null, name is yyy.properties
12:54:17.681 [main] DEBUG org.apache.commons.configuration.DefaultFileSystem - Could not locate file yyy.properties at null: no protocol: yyy.properties
12:54:17.681 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - Loading configuration from the path yyy.properties
12:54:17.681 [main] DEBUG org.apache.commons.configuration.PropertiesConfiguration - Base path set to file:///C:/myProgram/yyy.properties
这是我的 .properties 文件:
---log4j.properties---
log4j.rootLogger=error
---xxx.properties---
log4j.rootLogger=error
---yyy.properties---
log4j.rootLogger=error
我的主要方法是这样开始的:
public static void main(String[] args) {
PropertyConfigurator.configure("log4j.properties");
Logger.getRootLogger().setLevel(Level.ERROR);
log4j.properties 文件加载正常,没有问题,对 "log4j.rootLogger=error" 很满意。 (如果我像在 中看到的那样添加 ', R' 或 ', stdout' 它会抱怨,但我怀疑这是因为我在 Windows 上)。
如果这不可能,请告诉我,我会接受它,接受它并停止寻找。
该项目由使用 windows、mac 和 linux 的大量观众 运行 完成。 (该项目是为需要 运行 Jar 集合开发新集合的开发人员提供的测试工具)
---编辑----
我已经研究了将 log4j.xml 放入我项目的 src/main/resource 文件夹中的建议,但无法使其正常工作。
我读到的所有内容都表明 log4j.xml 应该有效,但我 运行 没有什么可以尝试的了。作为最后的尝试,我尝试 google:
"org.apache.commons.configuration"调试停止
并且 google 让我回答了我自己的问题哈哈
这是我的 log4j.xml,每次启动 类 时,似乎都不会停止每个 jar 调试打印的 org.apache.commons.configuration(每秒发生几百次) ).
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<appender name="CA" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
<logger name="org.apache.commons.configuration">
<level value="error"/>
</logger>
<root>
<priority value="off"/>
<appender-ref ref="CA"/>
</root>
</log4j:configuration>
我重建了我的项目并重新打包了我的 jar。我希望我不必将 log4j.xml 放入每个 Jar 的资源文件夹中? :/
有没有办法查看它是否正在加载 log4j.xml 文件?
我需要做些什么来让所有可能实例化它们自己的 log4j 实例的 Jar 都使用这个 log4j.xml?
我现在为我的主要方法尝试了这个:
public static void main(String[] args) {
PropertyConfigurator.configure("log4j.xml");
Logger.getRootLogger().setLevel(Level.ERROR);
但我仍然看到控制台充斥着来自 org.apache.commons.configuration
的 DEBUG 消息
-- 编辑 2 --
还是卡住了。我尝试简单地使用一个非常基本的示例,DEBUG 输出仍然出现在控制台中。
这是我简单的主要方法:
public static void main(String[] args) throws ConfigurationException {
PropertyConfigurator.configure("log4j.xml");
Logger.getRootLogger().setLevel(Level.ERROR);
PropertiesConfiguration config = new PropertiesConfiguration("log4j.xml");
}
这里是导入:
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
第 3 行导致出现此输出:
10:04:08.526 [main] DEBUG org.apache.commons.configuration.PropertiesConfiguration - FileName set to log4j.xml
10:04:08.536 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - ConfigurationUtils.locate(): base is null, name is log4j.xml
10:04:08.536 [main] DEBUG org.apache.commons.configuration.DefaultFileSystem - Could not locate file log4j.xml at null: no protocol: log4j.xml
10:04:08.546 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - Loading configuration from the path log4j.xml
这是我确认正在加载的 log4j.xml,通过重命名它并看到加载文件错误。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<root>
<level value="error"/>
<priority value="off"/>
</root>
<logger name="org.springframework">
<level value="error"/>
<priority value="off"/>
</logger>
<logger name="org.apache.commons.configuration">
<level value="error"/>
<priority value="off"/>
</logger>
<logger name="org.apache.commons.configuration.PropertiesConfiguration">
<level value="error"/>
<priority value="off"/>
</logger>
<logger name="org.apache.commons">
<level value="error"/>
<priority value="off"/>
</logger>
<logger name="org.apache">
<level value="error"/>
<priority value="off"/>
</logger>
</log4j:configuration>
我创建了一个名为 "logback-test.xml" 的文件,并尝试将它放在我能想到的每个可能的文件夹中,最后发现如果我把它放到这里 "Log4JTest\out\production\Log4JTest"(其中 Log4JTest 是我的测试名称IntelliJ project) 然后就找到了。
loopback-test.xml有以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<logger name="org.apache" level="OFF"/>
</configuration>
它似乎完成了任务!
这是我的 Main.java
package com.company;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
public class Main {
public static void main(String[] args) throws ConfigurationException {
PropertiesConfiguration config = new PropertiesConfiguration("log4j.xml");
}
}
这是输出控制台:
Connected to the target VM, address: '127.0.0.1:50725', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:50725', transport: 'socket'
Process finished with exit code 0
现在对整个项目进行测试...如果它解决了原始问题,会将其标记为 'solved'。
我正在使用来自其他 Jars 的 类,这些 Jars 使用来自其他使用 log4j 的 Jars 的 类。我无法更改这些 Jar 中的任何一个。
其中很多 类 在 IntelliJ 中调试时在启动时将调试打印到控制台。
我正在寻找阻止它的方法,因为它很烦人。
我尝试创建一个日志级别为 "error" 的 log4j.properties 文件,并将其加载到我的应用程序的 main() 中,并将默认记录器设置为 "error"等级。我还检查了所有 Jars 内部都有一个属性,但没有指定什么日志级别(他们只是说 Jar 是什么版本)。我已经尝试为 类 创建我自己的属性文件以使用它,但他们已经在加载文件之前打印了他们的调试。
下面是正在生成的一些调试信息:
12:54:17.660 [main] DEBUG org.apache.commons.configuration.PropertiesConfiguration - FileName set to xxx.properties
12:54:17.665 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - ConfigurationUtils.locate(): base is null, name is xxx.properties
12:54:17.665 [main] DEBUG org.apache.commons.configuration.DefaultFileSystem - Could not locate file xxx.properties at null: no protocol: xxx.properties
12:54:17.668 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - Loading configuration from the path xxx.properties
12:54:17.668 [main] DEBUG org.apache.commons.configuration.PropertiesConfiguration - Base path set to file:///C:/myProgram/xxx.properties
12:54:17.680 [main] DEBUG org.apache.commons.configuration.PropertiesConfiguration - FileName set to yyy.properties
12:54:17.680 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - ConfigurationUtils.locate(): base is null, name is yyy.properties
12:54:17.681 [main] DEBUG org.apache.commons.configuration.DefaultFileSystem - Could not locate file yyy.properties at null: no protocol: yyy.properties
12:54:17.681 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - Loading configuration from the path yyy.properties
12:54:17.681 [main] DEBUG org.apache.commons.configuration.PropertiesConfiguration - Base path set to file:///C:/myProgram/yyy.properties
这是我的 .properties 文件:
---log4j.properties---
log4j.rootLogger=error
---xxx.properties---
log4j.rootLogger=error
---yyy.properties---
log4j.rootLogger=error
我的主要方法是这样开始的:
public static void main(String[] args) {
PropertyConfigurator.configure("log4j.properties");
Logger.getRootLogger().setLevel(Level.ERROR);
log4j.properties 文件加载正常,没有问题,对 "log4j.rootLogger=error" 很满意。 (如果我像在
如果这不可能,请告诉我,我会接受它,接受它并停止寻找。
该项目由使用 windows、mac 和 linux 的大量观众 运行 完成。 (该项目是为需要 运行 Jar 集合开发新集合的开发人员提供的测试工具)
---编辑----
我已经研究了将 log4j.xml 放入我项目的 src/main/resource 文件夹中的建议,但无法使其正常工作。
我读到的所有内容都表明 log4j.xml 应该有效,但我 运行 没有什么可以尝试的了。作为最后的尝试,我尝试 google: "org.apache.commons.configuration"调试停止 并且 google 让我回答了我自己的问题哈哈
这是我的 log4j.xml,每次启动 类 时,似乎都不会停止每个 jar 调试打印的 org.apache.commons.configuration(每秒发生几百次) ).
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<appender name="CA" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
<logger name="org.apache.commons.configuration">
<level value="error"/>
</logger>
<root>
<priority value="off"/>
<appender-ref ref="CA"/>
</root>
</log4j:configuration>
我重建了我的项目并重新打包了我的 jar。我希望我不必将 log4j.xml 放入每个 Jar 的资源文件夹中? :/
有没有办法查看它是否正在加载 log4j.xml 文件?
我需要做些什么来让所有可能实例化它们自己的 log4j 实例的 Jar 都使用这个 log4j.xml?
我现在为我的主要方法尝试了这个:
public static void main(String[] args) {
PropertyConfigurator.configure("log4j.xml");
Logger.getRootLogger().setLevel(Level.ERROR);
但我仍然看到控制台充斥着来自 org.apache.commons.configuration
的 DEBUG 消息-- 编辑 2 --
还是卡住了。我尝试简单地使用一个非常基本的示例,DEBUG 输出仍然出现在控制台中。
这是我简单的主要方法:
public static void main(String[] args) throws ConfigurationException {
PropertyConfigurator.configure("log4j.xml");
Logger.getRootLogger().setLevel(Level.ERROR);
PropertiesConfiguration config = new PropertiesConfiguration("log4j.xml");
}
这里是导入:
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
第 3 行导致出现此输出:
10:04:08.526 [main] DEBUG org.apache.commons.configuration.PropertiesConfiguration - FileName set to log4j.xml
10:04:08.536 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - ConfigurationUtils.locate(): base is null, name is log4j.xml
10:04:08.536 [main] DEBUG org.apache.commons.configuration.DefaultFileSystem - Could not locate file log4j.xml at null: no protocol: log4j.xml
10:04:08.546 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils - Loading configuration from the path log4j.xml
这是我确认正在加载的 log4j.xml,通过重命名它并看到加载文件错误。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<root>
<level value="error"/>
<priority value="off"/>
</root>
<logger name="org.springframework">
<level value="error"/>
<priority value="off"/>
</logger>
<logger name="org.apache.commons.configuration">
<level value="error"/>
<priority value="off"/>
</logger>
<logger name="org.apache.commons.configuration.PropertiesConfiguration">
<level value="error"/>
<priority value="off"/>
</logger>
<logger name="org.apache.commons">
<level value="error"/>
<priority value="off"/>
</logger>
<logger name="org.apache">
<level value="error"/>
<priority value="off"/>
</logger>
</log4j:configuration>
我创建了一个名为 "logback-test.xml" 的文件,并尝试将它放在我能想到的每个可能的文件夹中,最后发现如果我把它放到这里 "Log4JTest\out\production\Log4JTest"(其中 Log4JTest 是我的测试名称IntelliJ project) 然后就找到了。
loopback-test.xml有以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<logger name="org.apache" level="OFF"/>
</configuration>
它似乎完成了任务!
这是我的 Main.java
package com.company;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
public class Main {
public static void main(String[] args) throws ConfigurationException {
PropertiesConfiguration config = new PropertiesConfiguration("log4j.xml");
}
}
这是输出控制台:
Connected to the target VM, address: '127.0.0.1:50725', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:50725', transport: 'socket'
Process finished with exit code 0
现在对整个项目进行测试...如果它解决了原始问题,会将其标记为 'solved'。