java - 即使将 Additivity 设置为 false,log4j ConsoleAppender 也会打印到控制台两次
问题描述
在 intellIj 中运行程序时 ,我有 log4j 附加程序将输出打印到控制台一次
但是通过可执行.jar 运行程序时会出现两次。
写入日志文件的实际日志只出现一次,这是正确的。
我在这个代码块中以编程方式定义了我的记录器/附加器
一切都完成后,我打电话给
rootLogger.setAdditivity(false);
但由于某种原因,我的类在作为 .jar 运行时仍会输出两次到 cmdline 控制台。我通过在顶部定义一个日志变量来调用每个类中的记录器,如下所示:
public class SomeClass {
static Logger log = Logger.getLogger(SomeClass .class);
这个日志变量在“SomeClass”类的任何地方都使用。
在我设置它们的级别之前和之后,我已经尝试将所有包记录器的可加性设置为 false ......
Logger.getLogger("com.company").setAdditivity(false);
Logger.getLogger("com.company.project.database.Admin").setAdditivity(false);
...
但是当我以这种方式运行代码时,它抱怨它找不到我在其中定义所有 log4j 内容的类的附加程序,并且没有任何内容被写入输出/日志。
解决方案
我认为您在可加性方面走在了正确的轨道上,但是可加性是孩子的属性,告诉 log4j 不要使用父母: https ://logging.apache.org/log4net/release/sdk/html/P_log4net_Repository_Hierarchy_Logger_Additivity.htm 你已将最终父记录器的可加性设置为 false ,因为 root 不会是任何东西的孩子,所以它永远不会做任何事情。
尝试将每个包记录器的可加性设置为 false,希望这能解决问题。
推荐阅读
- module - 我可以获得 prestashop 主题的所有钩子名称(默认和创建的)的数组吗?
- react-admin - 有升级到material-ui 3的计划吗?
- c++ - std::chrono::duration 可以以秒为单位初始化,但不能以毫秒为单位?
- javascript - 单击链接时,是否可以同时切换模式并在另一个选项卡中打开 URL?
- javascript - 如何使用Javascript从数组中获取选定的字段?
- php - 使用子 ID 拉取整个数组(树)分支 - PHP Arrauu
- reactivesearch - 使用 ReactiveSearch 提交搜索查询
- tomcat8 - 将子域流量重定向到tomcat8上的不同端口
- babeljs - 如何控制 babel-cli 输出目录
- c++ - Microsoft ODBC 无法创建有效句柄