Log4j2 不同级别的不同appender

2023-12-03

我有一个小问题,找不到解决方案。我想为级别信息而不是级别警告设置图案布局。如果我的登录级别为INFO,则一切正常,但如果日志级别为INFOWARN它被写入控制台两次(作为级别信息和级别警告)。简而言之,特定级别的所有日志都会写出该级别及其下级别的日志。

我想将 INFO 级别登录到控制台,如下所示:"%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"和水平WARN like "%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n".

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>        
        <Console name="ConsoleInfo" target="SYSTEM_OUT">
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/>
        </Console>     
        <Console name="ConsoleWarning" target="SYSTEM_OUT">
            <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
        </Console>   
        <File name="File" fileName="logs/cli.log">
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
        </File>
    </Appenders>

    <Loggers> 
        <Root level="ALL">
            <AppenderRef ref="ConsoleInfo"/>
            <AppenderRef ref="ConsoleWarning"/>
            <AppenderRef ref="File"/>    
        </Root>
    </Loggers>
</Configuration>

据我了解,您希望将 WARN 或更高级别(WARN、ERROR、FATAL)的日志事件仅发送到“ConsoleWarning”附加程序,而不是同时发送到“ConsoleWarning”和“ConsoleInfo”。

最简单的方法是修改“ConsoleInfo”附加程序中的过滤器配置,基本上执行相反的方法,如下所示:

<Console name="ConsoleInfo" target="SYSTEM_OUT">
    <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/>
    <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/>
</Console>   

这是有效的,因为作为log4j2 手册状态:

如果 LogEvent 中的级别相同,则此过滤器返回 onMatch 结果或者比更具体否则配置的级别和 onMismatch 值。例如,如果 ThresholdFilter 配置为 ERROR 级别,并且 LogEvent 包含 DEBUG 级别,则将返回 onMismatch 值,因为 ERROR 事件比 DEBUG 更具体。

这将导致附加程序仅接受级别低于 WARN 的事件。

另一种可能的解决方案是使用路由附加器指定每个级别的目的地。如果您这样做,那么您根本不需要 ThresholdFilters。另请注意,您可以通过不提供默认路由以及不提供该级别的路由来忽略特定级别的事件。例如,如果您删除<Route ref="ConsoleInfo" key="DEBUG" />根据下面的配置,所有 DEBUG 事件都将被路由附加器忽略,并且不会打印到控制台。这是配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>        
        <Console name="ConsoleInfo" target="SYSTEM_OUT">
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/>
        </Console>     
        <Console name="ConsoleWarning" target="SYSTEM_OUT">
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
        </Console>   
        <File name="File" fileName="logs/cli.log">
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
        </File>
        <Routing name="Routing">
            <Routes>
                <Script name="RoutingInit" language="JavaScript"><![CDATA[
                    logEvent.getLevel();]]>
                </Script>
                <Route ref="ConsoleInfo" key="TRACE" />
                <Route ref="ConsoleInfo" key="DEBUG" />
                <Route ref="ConsoleInfo" key="INFO" />
                <Route ref="ConsoleWarning" key="WARN" />
                <Route ref="ConsoleWarning" key="ERROR" />
                <Route ref="ConsoleWarning" key="FATAL" />
            </Routes>
        </Routing>
    </Appenders>

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

Log4j2 不同级别的不同appender 的相关文章

随机推荐

  • 如何在使用 Netbeans 的构建过程中将文件夹包含到 dist JAR 中?

    我正在使用 Netbeans 6 9 并且我已研究过编辑 build xml 文件 以便可以将目录和文件包含在构建项目所产生的 jar 文件中 所以我的问题是如何修改 build xml 文件以将其他文件夹放入 jar 中 我的项目有以下目
  • 从 Java 方法返回时 BigDecimal 不保留实际值

    我正在用 Java 制作一个货币转换应用程序 其他一些很棒的 StackOverflow 专家建议我阅读 BigDecimal 以替换 double 来解决任何精度问题 我有两种方法系统 它将起始货币转换为美元 然后将美元价值转换为目标货币
  • 使用名称访问工作表上的自定义属性

    我正在尝试使用属性名称来访问工作表上的自定义属性 但似乎不支持此功能 至少在 C 中不支持 我看到其他人报告它可以在 VB 中工作 并且文档也这么说 有人可以确认这在 C 中不起作用吗 这是示例代码 activeWorkSheet Cust
  • 如何使用 javascript 将时间(上午 12:30)转换为时间戳?

    谁能告诉我该怎么做 我想比较2次 看看哪一次更大 比如中午 12 30 和下午 5 30 使用 Date parse Date parse 24 09 2011 15 21 41
  • Visual Studios Express - 更改调试输出目录

    有没有办法让 VS 项目将调试 EXE 构建到 bin debug 以外的目录 我找到了这个 http msdn microsoft com en us library ms165410 28v vs 80 29 aspx 但是 这仅适用于
  • 更改存储在基于哈希的集合中的对象的哈希代码

    我有一个基于哈希的对象集合 例如HashSet or HashMap 实施过程中会遇到哪些问题hashCode 因为它是根据一些可变字段计算的 所以它可以随着时间而变化 它如何影响休眠 有什么理由让hashCode 默认返回对象的ID是坏的
  • 如何将类及其成员函数分离到头文件和源文件中

    我对如何将简单类的实现和声明代码分离到新的头文件和 cpp 文件中感到困惑 例如 我如何分离以下类的代码 class A2DD private int gx int gy public A2DD int x int y gx x gy y
  • gitlab:调用 gitlab-shell

    我一直在浏览代码gitlab shell 我无法理解它是如何被调用的 如果我对我的服务器 安装了 gitlab shell 进行了拉取 那么 gitlab shell 如何知道它 bin gitlab shell有这一行作为评论 GitLa
  • 事件源的性能

    我目前正在开发一个大型项目 需要实现服务器发送的事件 我决定使用事件源传输 并从简单的聊天开始 目前客户端仅监听新的聊天消息事件 但项目将来会有更多事件 首先 我真的很关心服务器端脚本及其循环 其次 我不确定使用mySQL数据库作为存储 在
  • 如何提取 MongoError: E11000 找到重复键的错误消息?

    如何提取错误消息MongoError E11000发现重复的钥匙 我只想要错误本身消息而不是整个对象 我将用一个例子来解释这一点 在mongo shell db test insertOne id 1 insert a document t
  • 在过去 365 天窗口中执行运行总计的有效方法

    这就是我的数据框的样子 库 数据 表 df lt fread Name EventType Date SalesAmount RunningTotal Runningtotal prior365Days John Email 1 1 201
  • 仅第一次记录显示,除非强制处置

    我正在使用 vs 2017 写一个netcoreapp2 0库 并使用 UnitTest 项目对其进行测试 XUnit 和 NUnit 给出相同的结果 我注意到除非我强行处置我的Serilog记录器 只有第一行会出现在Seq 这是我的两堂课
  • AWS 负载均衡器后面使用 Traefik 进行 HTTPS 重定向

    我正在尝试将所有传入的 Traefik 从 http 重定向到 https 以便从具有自定义端口的 docker 容器提供服务的 Web 应用程序 如果我构建这个 docker compose 文件 并扩展应用程序 一切都会按预期工作 我能
  • Ember Simple Auth 自定义验证器

    我一直在尝试创建一个session currentUser财产与id email and points特性 我正在参考使用 Ember 简单身份验证 Ember CLI 的自定义身份验证器 and 如何在会话中存储用户 但我就是不明白这些部
  • 使用 std::ranges::min 投影在 std::map 上

    是否可以在 std map 上投影 我尝试将 std ranges min 与投影一起使用 但它似乎会抛出错误 我无法解释为什么它不喜欢东西 include
  • 可以在自定义进度条progressDrawable中做圆角吗?

    I have a progress bar that is supposed to look like the attached image And I ve made it a long way I m very close the on
  • jMockit:如何期望构造函数调用模拟对象?

    我正在对执行一些序列化操作的方法进行单元测试 我打算模拟序列化逻辑 代码如下 ObjectInputStream ois new ObjectInputStream new BufferedInputStream new FileInput
  • 移植到 VS2015 / .NET 4.6 后,C++/CLI DLL 在加载时崩溃

    老实说 这可能是一个骗局VS2015 迁移的项目可以编译 但无法运行 调试断言失败 但这没有答案 我有更多细节 最近将我们的代码库从针对 v4 0 的 VS2010 移植到针对 v4 6 的 VS2015 我们有一个托管 C DLL 来提供
  • 更改模块目录后的 Python pickle

    我最近更改了程序的目录布局 之前 我将所有模块都放在 main 文件夹中 现在 我已将它们移动到以程序命名的目录中 并放置了一个 init py在那里制作一个包裹 现在 我的主目录中有一个 py 文件 用于启动我的程序 这更加简洁 不管怎样
  • Log4j2 不同级别的不同appender

    我有一个小问题 找不到解决方案 我想为级别信息而不是级别警告设置图案布局 如果我的登录级别为INFO 则一切正常 但如果日志级别为INFOWARN它被写入控制台两次 作为级别信息和级别警告 简而言之 特定级别的所有日志都会写出该级别及其下级