未遵循 Java log4j2 记录器级别

2024-02-06

所以我正在尝试学习 log4j2 并关注记录器及其级别和父级传播。

目前我的源层次结构运行是:

├── main
│   ├── java
│   │   └── calculatorMain
│   │       ├── Main.java
│   │       ├── someClass2.java
│   │       └── someClass1.java
│   └── resources
│       ├── Excels
│       │   └── TestExcel.xlsx
│       ├── FXMLs
│       │   └── mainWindow.fxml
│       └── log4j2.xml

我的计算器主要是:

Public class Main extends Application
{
    private static final String mainWindow = //FXML stuff
    private static final Logger logger = LogManager.getLogger(Main.class.getName());

    public static void main(String[] args)
    {
        logger.debug("Main has started");
        launch(args);
    }

    @Override
    public void start(Stage primaryStage)
    {
        try
        {
            //FXML stuff
            Parent root = //fxml stuff
            logger.info("Main scene loaded successfully");
            if (root != null)
            {
                //FXML stuff
            }
            else
                logger.error("Root was null");
        }
        catch (Exception e)
        {
            logger.error("Error",e);
        }
    }
}

我的 log4j2.xml 是

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="BrightnessCalculator packages">
    <!-- Logging Properties -->
    <Properties>
        <Property name="basePath">./logs</Property>
        <Property name="filePattern">${date:yyyy-MM-dd}</Property>
    </Properties>

    <Appenders>

        <!-- File Appenders -->
        <RollingFile name="mainLog" fileName="${basePath}/info-${filePattern}.log"
                     filePattern="${basePath}/app-info-%d{yyyy-MM-dd}.log.gz">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>

        <!-- Console Appender -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>

        <Root level="ERROR">
            <AppenderRef ref="console"/>
        </Root>

        <Logger name="calculatorMain" level="ERROR">
            <appenderRef ref="mainLog"/>
        </Logger>

        <Logger name="calculatorMain.Main" level="TRACE">
            <appenderRef ref="mainLog"/>
        </Logger>


    </Loggers>
</Configuration>

问题是输出到控制台的根记录器设置为level="ERROR"。根据我对级别的理解,这意味着我的根记录器应该只输出错误日志或更低的日志。然后是我的CalculatorMain Calculator.Main记录器,前者应该只记录错误和更低,而后者应该记录跟踪和更低。所以我的理解是错误日志和更低的日志将被打印两次,并且错误日志之上的任何内容都应该只根据父传播打印到日志一次。然而,根据我的日志文件输出以下内容,情况并非如此:

[DEBUG] 2018-08-17 16:37:28.239 [main] calculatorMain.Main - Main has started
[DEBUG] 2018-08-17 16:37:28.239 [main] calculatorMain.Main - Main has started
[INFO ] 2018-08-17 16:37:28.741 [JavaFX Application Thread] calculatorMain.Main - Main scene loaded successfully
[INFO ] 2018-08-17 16:37:28.741 [JavaFX Application Thread] calculatorMain.Main - Main scene loaded successfully

上述日志应该只打印一次。我一直在关注this https://www.journaldev.com/7128#log4j2-levels经过深思熟虑的教程,但我想我一定是误解了。


您遇到的问题是由于可加性所致true默认情况下。您的教程具有误导性,因为它说:

默认情况下,log4j2 日志记录是附加的。这意味着所有的家长loggers当使用特定记录器时也会使用。

事实上确实如此not意味着所有家长loggers将被使用,这意味着所有的附加器将使用父记录器。您应该阅读log4j2手册 https://logging.apache.org/log4j/2.x/manual/configuration.html,特别是关于可加性的部分。

在手册的可加性部分,有一个示例,后面有一些解释:

请注意,来自 com.foo.Bar 的跟踪消息出现了两次。这是 因为首先使用与记录器 com.foo.Bar 关联的附加程序, 它将第一个实例写入控制台。接下来,父级 com.foo.Bar(在本例中是根记录器)被引用。这 然后事件被传递给它的appender,这也写入 控制台,导致第二个实例。这被称为 可加性。

将可加性设置为true(默认情况下)子记录器接受的任何事件都会传递给所有父记录器的附加程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未遵循 Java log4j2 记录器级别 的相关文章

随机推荐

  • 如何使用 Code First Entity Framework 4.1 获取完整对象

    我试图以 JSON 形式返回完全深层的对象 填充了所有外键关系 但我得到的所有引用对象均为空值 这是获取对象的调用 public ActionResult GetAll return Json ppEFContext Orders Json
  • 每个时间步更新 ODE 求解器中的初始条件

    我想要求解一个 ODE 系统 在前 30 000 秒内 我希望状态变量之一从相同的初始值开始 30 000 秒之后 我想将该状态变量的初始值更改为不同的值 并在其余时间模拟系统 这是我的代码 def ode rhs y t ydot 0 p
  • 数据库中的动态站点地图不显示节点

    我已经实现了这个https github com maartenba MvcSiteMapProvider wiki Defining sitemap nodes using IDynamicNodeProvider https githu
  • 为什么在本地 k8s 环境中使用 nginx-ingress 控制器和资源时有时需要编辑 /etc/hosts?

    不确定这是否特定于操作系统 但在我的 M1 Mac 上 我正在安装位于官方的 Nginx 控制器和资源示例控制器快速入门指南 https kubernetes github io ingress nginx deploy quick sta
  • jQuery DOM 操作效率 - 使用 JavaScript 构建整个页面

    我将从一个完全空白的页面开始 除了 html head 和 body 之外没有任何元素 然后使用 jQuery 构建页面 页面内容将采用来自 AJAX 请求的 JSON 形式 JSON 中的内容不会有任何 HTML 将根据 JSON 对象的
  • 使用 TypeScript 将箭头函数编译为常规函数

    这是一个非常简单的问题 但我还没有在任何地方找到答案 是否有一些开关可以使 TypeScript 将箭头函数编译为纯 JavaScript 函数 我在代码中经常使用它们 并且不想重写所有内容 但我最近意识到 IE 不支持它们 我已经尝试将脚
  • 创建一个全局类 Objective-c?

    我想在 Objective C 中创建一个具有已存储数据的类 以便访问数据时我不想实例化该类 我该怎么做 您可以使用单例 也可以使用仅由类方法组成并允许您访问静态数据的类 这是 ObjC 中的基本单例实现 interface MySingl
  • 如何修改此脚本以获取参数?

    我有一个结合了电源点的电源 shell 脚本 问题是它仅适用于当前目录 脚本所在的目录 中的电源点并将组合的电源点保存到文档中 如何更改脚本以从作为参数给出的任何目录运行 我像这样运行 power shell 脚本 Merge Presen
  • z 索引无法正常工作

    所以我正在制作一个网站 我有一个带有一些盒子阴影的顶部栏 然后我的正下方有一个描述框 因此 我设置了 z 索引以确保顶部栏 box shadow 会使用以下 css 覆盖描述框 topbar z index 9999 important d
  • 如何在汇编中实现 mod 运算符

    我正在学习汇编语言中的除法 根据我正在学习的书 idiv运算的结果放在eax中 余数放在edx中 书中的一个练习是实现number result divisor在装配中 我本以为这相当于正常的除法运算 除了 edx 是结果 然而这并没有起作
  • jQuery UI 可排序 - 对图像进行排序

    我刚刚为一组图像实现了 jQuery UI 可排序插件 我的标记如下 ul class ui sortable li img src images member 4698568 7884029 t jpg alt li li img src
  • WebBrowser 控件不会从 C# 打印

    我在 WinForms 应用程序上有一个 WebBrowser 控件 它正在加载转换为 HTML CSS 的 XML 如果我只想在那里或在常规浏览器中查看它 看起来很漂亮 当表单加载时 它应该导航到该文件 然后当 OnDocumentCom
  • 如何使用ssr在nuxt中添加ckeditor插件

    我正在尝试在我的通用 nuxt 应用程序中添加 ckeditor 5 的对齐插件 SSR 我在插件中尝试过这样 import Vue from vue import ClassicEditor from ckeditor ckeditor5
  • Jekyll编码类别特殊字符名称

    我的 Jekyll 安装曾经可以工作 自更新以来 我遇到了 URL 包含带有一些特殊字符的标签名称的问题 现在 当我尝试访问包含特殊字符的 URL 时 会收到一条错误消息 例如http 127 0 0 1 4000 tag Actualit
  • 最小成本强连通有向图

    我有一个强连接的有向图 即图 G 中的每对节点 i j 都有一条从 i 到 j 和 j 到 i 的路径 我希望从该图中找到一个强连通图 使得所有边的总和最小 换句话说 我需要以这样的方式删除边 即删除它们后 图仍然是强连接的 并且边总和的成
  • 反应具有比例依赖性的本机动画旋转圆圈

    我有一个动画组件 您可以在其中选择十七个圆圈之一 到目前为止看起来像这样 我想添加一个动画 当圆靠近中心时 它会缩放圆 我怎么做 到目前为止 我尝试将圆的 x 值计算为Math sin index deltaTheta Math PI 18
  • TPL 取消延续从未调用已取消的任务

    我的代码中有以下使用 TPL 的设置 我的班级中有一个字段 private CancellationTokenSource cancellationTokenSource 每次我创建使用特定取消令牌的 TPL 任务时 都会实例化此 Canc
  • 加载配置文件时发生错误:无法开始监视“\\share”的更改

    上周我也遇到了同样的问题 在启用模拟后它自行解决了 现在 我已将此盒子移至其他位置 现在再次收到它 然而 这一次的描述性要少得多 我收到的唯一错误是 An error occurred loading a configuration fil
  • boost::make_shared 没有调用(放置)运算符 new 吗?

    我第一次使用 boost make shared 创建共享指针指向的对象 主要是因为我们的代码太慢了 而单一分配确实有助于提高性能 在 硬手动方式 修复了一些内存泄漏之后 我决定通过覆盖所有相关类的新运算符来实现一个简单的内存泄漏检测器 只
  • 未遵循 Java log4j2 记录器级别

    所以我正在尝试学习 log4j2 并关注记录器及其级别和父级传播 目前我的源层次结构运行是 main java calculatorMain Main java someClass2 java someClass1 java resourc