无法将自定义转换器添加到 log4j

2024-01-23

下列的here http://logging.apache.org/log4j/2.x/manual/extending.html#PatternConverters, 我想延长log4j通过自定义转换器,将 shiro 用户名添加到日志中。这是我的代码:

@Plugin(name = "shiro", type = "Converter")
@ConverterKeys({"susr", "shiro"})
public class ShiroUserConverter extends LogEventPatternConverter {

private static final ShiroUserConverter INSTANCE = new ShiroUserConverter();

private ShiroUserConverter()
{
    this("shiro", "shiro"); // not sure why!
}

protected ShiroUserConverter(String name, String style) {
    super(name, style);
}

public static ShiroUserConverter newInstance(final String[] options) {
    return INSTANCE;
} 

@Override
public void format(LogEvent arg0, StringBuilder arg1) {
    // TODO Auto-generated method stub
    Subject currentUser = SecurityUtils.getSubject();

    if ( currentUser != null && currentUser.getPrincipal() != null)
        arg1.append(currentUser.getPrincipal().toString());
    else
        arg1.append("No User");
}

}

配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="debug">
  <appenders>
    <File name="A1" fileName="/tmp/logs/A1.log" append="false">
      <PatternLayout pattern="%d %-5p [%t] [%susr] %C{2} (%F:%L) - %m%n"/>
    </File>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] [%susr] %C{2} (%F:%L) - %m%n"/>
    </Console>
  </appenders>
  <loggers>
    <logger name="org.apache.log4j.xml" level="debug">
      <appender-ref ref="A1"/>
    </logger>
    <root level="debug">
      <appender-ref ref="A1"/>
    </root>
  </loggers>
</configuration>

问题是log4j没有选择我的自定义转换器。当我调试它时,我收到以下错误消息:

ERROR Unrecognized format specifier [susr]
ERROR Unrecognized conversion specifier [susr] starting at position 19 in conversion pattern.

我什至将我的类放在同一个包中package org.apache.log4j.pattern;但仍然没有运气。任何帮助,将不胜感激。

-- Edit:这是完整的控制台输出:

2013-08-09 16:55:01,370 DEBUG Found Plugin Map at jar:file:/Users/path/to/log4j-core-2.0-beta5.jar!/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
2013-08-09 16:55:01,373 DEBUG Generated plugins in 0.003793000 seconds
2013-08-09 16:55:01,374 DEBUG Generated plugins in 0.000551000 seconds
2013-08-09 16:55:01,375 DEBUG Generated plugins in 0.000548000 seconds
2013-08-09 16:55:01,376 DEBUG Generated plugins in 0.000555000 seconds
2013-08-09 16:55:01,377 DEBUG Generated plugins in 0.000546000 seconds
2013-08-09 16:55:01,378 DEBUG Generated plugins in 0.000540000 seconds
2013-08-09 16:55:01,379 DEBUG Generated plugins in 0.000546000 seconds
2013-08-09 16:55:01,380 DEBUG Generated plugins in 0.000548000 seconds
2013-08-09 16:55:01,381 DEBUG Generated plugins in 0.000556000 seconds
2013-08-09 16:55:01,382 DEBUG Generated plugins in 0.000552000 seconds
2013-08-09 16:55:01,390 DEBUG Calling createLayout on class org.apache.logging.log4j.core.layout.PatternLayout for element PatternLayout with params(pattern="%d %-5p [%t] %susr %C{2} (%F:%L) - %m%n", Configuration(/Users/path/to/target/classes/WEB-INF/log4j.properties), null, charset="null")
2013-08-09 16:55:01,392 DEBUG Generated plugins in 0.000585000 seconds
2013-08-09 16:55:01,392 ERROR Unrecognized format specifier [susr]
2013-08-09 16:55:01,393 ERROR Unrecognized conversion specifier [susr] starting at position 18 in conversion pattern.
2013-08-09 16:55:01,399 DEBUG Calling createAppender on class org.apache.logging.log4j.core.appender.FileAppender for element File with params(fileName="/tmp/logs/A1.log", append="true", locking="null", name="A1", immediateFlush="null", suppressExceptions="null", bufferedIO="null", PatternLayout(%d %-5p [%t] %susr %C{2} (%F:%L) - %m%n), null, advertise="null", advertiseURI="null", Configuration(/Users/path/to/target/classes/WEB-INF/log4j.properties))
2013-08-09 16:55:01,401 DEBUG Starting FileManager /tmp/logs/A1.log
2013-08-09 16:55:01,402 DEBUG Calling createLayout on class org.apache.logging.log4j.core.layout.PatternLayout for element PatternLayout with params(pattern="%d %-5p [%t] [%susr] %C{2} (%F:%L) - %m%n", Configuration(/Users/path/totarget/classes/WEB-INF/log4j.properties), null, charset="null")
2013-08-09 16:55:01,403 ERROR Unrecognized format specifier [susr]
2013-08-09 16:55:01,403 ERROR Unrecognized conversion specifier [susr] starting at position 19 in conversion pattern.
2013-08-09 16:55:01,405 DEBUG Calling createAppender on class org.apache.logging.log4j.core.appender.ConsoleAppender for element Console with params(PatternLayout(%d %-5p [%t] [%susr] %C{2} (%F:%L) - %m%n), null, target="SYSTEM_OUT", name="STDOUT", follow="null", suppressExceptions="null")
2013-08-09 16:55:01,405 DEBUG Calling createAppenders on class org.apache.logging.log4j.core.config.plugins.AppendersPlugin for element appenders with params(appenders={A1, STDOUT})
2013-08-09 16:55:01,407 DEBUG Generated plugins in 0.000665000 seconds
2013-08-09 16:55:01,407 DEBUG Calling createAppenderRef on class org.apache.logging.log4j.core.config.AppenderRef for element appender-ref with params(ref="A1", level="null", null)
2013-08-09 16:55:01,409 DEBUG Calling createLogger on class org.apache.logging.log4j.core.config.LoggerConfig for element logger with params(additivity="null", level="debug", name="org.apache.log4j.xml", includeLocation="null", appender-ref={org.apache.logging.log4j.core.config.AppenderRef@f818d7}, properties={}, Configuration(/Users/path/to/target/classes/WEB-INF/log4j.properties), null)
2013-08-09 16:55:01,410 DEBUG Calling createAppenderRef on class org.apache.logging.log4j.core.config.AppenderRef for element appender-ref with params(ref="A1", level="null", null)
2013-08-09 16:55:01,411 DEBUG Calling createLogger on class org.apache.logging.log4j.core.config.LoggerConfig$RootLogger for element root with params(additivity="null", level="debug", includeLocation="null", appender-ref={org.apache.logging.log4j.core.config.AppenderRef@530ababd}, properties={}, Configuration(/Users/path/to/target/classes/WEB-INF/log4j.properties), null)
2013-08-09 16:55:01,412 DEBUG Calling createLoggers on class org.apache.logging.log4j.core.config.plugins.LoggersPlugin for element loggers with params(loggers={org.apache.log4j.xml, root})

将您的配置行更改为

<configuration status="debug" packages="path.to.ShiroUserConverterDirectory">

需要明确的是,packages 是包含类的目录,而不是类本身。

我有以下工作:

package com.test.util;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;

@Plugin(name = "shiro", category = "Converter")
@ConverterKeys({"susr", "shiro"})
public class ShiroUserConverter extends LogEventPatternConverter {

private static final ShiroUserConverter INSTANCE = new ShiroUserConverter();

private ShiroUserConverter()
{
    this("shiro", "shiro"); // not sure why!
}

protected ShiroUserConverter(String name, String style) {
    super(name, style);
}

public static ShiroUserConverter newInstance(final String[] options) {
    return INSTANCE;
}

@Override
public void format(LogEvent arg0, StringBuilder arg1) {
    // TODO Auto-generated method stub
        arg1.append("No User");
}

}

我的 log4j2.xml 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="debug" packages="com.test.util">
  <appenders>
    <Console name="CA" target="SYSTEM_OUT">
       <PatternLayout pattern="%d %-5p [%t] [%susr] %C{2} (%F:%L) - %m%n"/>
    </Console>
   </appenders>

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

无法将自定义转换器添加到 log4j 的相关文章

  • Spring控制器是线程安全的吗

    我遇到了这个控制器示例 想知道它是否是线程安全的 我特别想知道 gson 实例变量 import org springframework stereotype Controller import org springframework we
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • Java 创建浮雕(红/蓝图像)

    我正在编写一个 Java 游戏引擎 http victoryengine org http victoryengine org 并且我一直在尝试生成具有深度的 3D 图像 您可以使用那些红色 蓝色眼镜看到 我正在使用 Java2D 进行图形
  • 由于连接超时,无法通过 ImageIO.read(url) 获取图像

    下面的代码似乎总是失败 URL url new URL http userserve ak last fm serve 126 8636005 jpg Image img ImageIO read url System out printl
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • Path2D 上的鼠标指针检测

    我构建了一个Path2D http docs oracle com javase 7 docs api java awt geom Path2D html表示由直线组成的未闭合形状 我希望能够检测何时单击鼠标并且鼠标指针靠近路径 在几个像素
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • 为什么 BufferedWriter 不写入文件?

    我有这个代码 String strings Hi You He They Tetrabenzene Caaorine Calorine File file new File G words txt FileWriter fWriter Bu
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • android recyclerView水平和垂直间距

    大家好 我对 android 很陌生 我在 recyclerview 方面遇到了问题 我试图在回收视图中的图像视图之间添加空间 但没有成功 我想要的是 怎么了 以下是我的实现ItemOffsetDecoration java public
  • EmberJS 中的 I18n(路由和一般情况)

    EmberJS 支持国际化应用程序的翻译路由吗 或者至少可以轻松扩展它以支持 i18n 路由 有人有这方面的经验吗 例如 可以以某种方式从语言环境文件动态设置路由字符串吗 另外 当使用 Ember 和 Rails 路由时不必指定两次 这会很
  • 无法分配 CursorWindow

    我正在操作SQLite3我的 Android 应用程序中的数据库 我刚刚从预填充的数据库中读取数据 该数据库有 20 万行和 14 列 条目是文字 所有列的数据类型都是文本 查询最多 11 个字母的单词 例如 ABANDONMENT 效果很
  • 使用 IMongoQueryable 进行单元测试

    我正在使用 NET Core 2 0 和 NET Core MongoDB 驱动程序 我创建了一个像这样的存储库 public interface IRepository
  • Laravel 5.1 eloquent 的 with() 方法中的使用限制

    Eloquent staffGroup StaffGroup where id id gt with staffGroupRight gt first In StaffGroup Model public function staffGro
  • 获取类的实例方法列表

    我有一堂课 class TestClass def method1 end def method2 end def method3 end end 我如何获得此类中的方法列表 method1 method2 method3 TestClas
  • 将参数添加到 @keyframes 属性 Less

    我有一处房产 keyframes 我用autoprefixer编译来添加所需的前缀 我想做的是向动画名称 或任何可能的地方 添加一个参数 以将属性值更改为关键帧键 这就是我现在所拥有的 keyframes loader 0 transfor
  • Node.js Express 模块未正确加载

    Geos Mac hone georgiana npm list Users georgiana local hone email protected cdn cgi l email protection email protected c
  • (Z3Py) 函数声明有什么限制吗?

    函数声明有什么限制吗 例如 这段代码返回 unsat from z3 import def one op op arg1 arg2 if op 1 return arg1 arg2 if op 2 return arg1 arg2 if o
  • 如何让PHP使用代理设置来连接互联网?

    我位于不允许直接连接到互联网的代理服务器后面 我的所有 PHP 应用程序都无法连接到互联网进行更新检查等 我如何告诉 PHP 我的代理设置 我不想在代码中输入代理设置 我希望 PHP 本身通过全局配置设置或类似的东西使用它 如果几乎所有人的
  • 根据类中的变量对类向量进行排序[重复]

    这个问题在这里已经有答案了 我有一个类 其中有一个类型变量int储存在里面 然后我创建了一个向量 其中包含此类 然后我需要对其进行排序 然而 我的问题源于这样一个事实 我需要使用此类中存储的 int 值按升序对向量进行排序 我看过std s
  • 羽毛可以与羽毛外部管理的路线共存吗

    我们有一个大型应用程序 它使用 Express 进行休息 使用 primus 进行套接字路由 一下子全部变成羽毛是非常困难的 我正在考虑分阶段的方法 我可以采用一些路线并将它们转换为服务 因此任何新路线都将遵循服务模式 我将慢慢迁移应用程序
  • 如何处理文件路径中的空格

    我在使用以下脚本时遇到问题 我正在检查的文件路径中的空格似乎让我感到震惊 关于如何不让 PoweShell 崩溃的任何想法 Program Files x86 GC C server txt server if Test Path serv
  • 如何将数组类型作为泛型类型参数传递给 VHDL 包?

    我正在 VHDL 2008 中开发通用包 列表 该包具有元素类型的泛型类型 如果我在包中声明此元素类型的数组类型 那么它就是一个新类型 所以对于例如整数 我的新整数数组将与 ieee 库中的整数向量不兼容 所以我还需要传入数组类型 例如in
  • Pyspark:从 blob 存储加载 zip 文件

    我正在使用 Pyspark 尝试从 blob 存储中读取 zip 文件 我想在加载后解压缩文件 然后将解压缩的 CSV 写回 Blob 存储 我正在遵循此指南 该指南解释了如何在阅读后解压缩文件 https docs databricks
  • 我们可以从oracle10g程序中执行unix命令吗

    unix机器上的oracle10g 我需要在程序中执行unix命令 我该怎么做 BEGIN DBMS SCHEDULER create job job name gt SHELL JOB repeat interval gt FREQ DA
  • NGINX 将路径作为变量发送给 PHP,除非路径是文件路径

    我想将所有路径传递给index php page path 例如 domain com a b c gt index php page a b c 因此这是我的 NGINX conf 文件 location P
  • 代理似乎被 Mechanize 忽略了?

    我正在使用 http 代理和 Mechanize 模块 我初始化 mechanize 对象并设置代理 如下所示 self br mechanize Browser self br set proxies http proxyAddress
  • HTML 表单操作 method="POST" 还是 method="post"? [复制]

    这个问题在这里已经有答案了 使用非大写的 post 或大写的 POST 有什么区别吗
  • 无法将自定义转换器添加到 log4j

    下列的here http logging apache org log4j 2 x manual extending html PatternConverters 我想延长log4j通过自定义转换器 将 shiro 用户名添加到日志中 这是