我已将我的 log4j2 自定义插件打包到一个单独的 jar 中(仅包含插件类)并将其放入应用程序类路径中。但它没有被检测到。
我用谷歌搜索发现这是一个错误 - 不再使用“packages”参数。还有一些链接建议了一些替代方案,其中 maven pom.xml 和 log4j2 插件 dat 文件出现在上下文中。问题是我不熟悉maven,也不知道dat文件是如何生成的。我只知道它包含在 log4j-2.1-core.jar 中,其中现有的 log4j2 插件在 pom.xml 中定义。
有人可以建议我如何让我的自定义插件工作吗?
我经历了这个 - Log4j2 custom plugins - annotation processing with Maven Assembly Plugin
但还不清楚。我正在关注解决方案,但不确定如何为自定义插件创建插件 dat 文件,或者我到底需要在哪里进行更改..
最佳答案
有两种方法可以让 log4j2 找到您的自定义插件:通过 packages 配置属性和通过 javac 生成的插件 dat 文件。
选项 1:包属性
有一个旧版本的 log4j2,其中 packages 属性不再起作用,但是这个 was fixed在 2.0.1 中。这应该不再是一个问题。
要使用此选项,请将插件类的包名称放在 packages 属性中。例如,如果您的插件的完全限定类名称是 com.mycompany.myproduct.MyPlugin,则使用
<Configuration status="trace" packages="com.mycompany.myproduct">
...
status="trace" 属性将显示控制台上显示的内部 log4j2 调试语句。这可能有助于解决任何问题,例如,如果找不到您的插件。
方案二:插件dat文件
如果在类路径中使用 log4j-core jar 进行编译,javac 将生成一个 log4j2 插件 dat 文件。 Maven 会自动将此文件包含在您的 jar 中,但如果您不使用 Maven,则可以手动将此文件包含在您的 jar 中。同样,如有必要,请使用 status="trace"进行故障排除。
配置
完成上述任一操作后,log4j2 就可以找到您的插件。下一步是正确配置您的插件。这可能是导致问题的原因。
假设您的插件是一个自定义查找插件,如下所示:
package com.mycompany.myproduct;
@Plugin(name = "FabLookup", category = StrLookup.CATEGORY)
public class BetterLookup extends AbstractLookup {
@Override
public String lookup(final LogEvent event, final String key) {
return com.mycompany.SomeClass.getValue(key);
}
}
现在,您声明了插件的名称 FabLookup,因此这是您需要在配置中使用的名称。不是类名(尽管它们可以相同)。
使用您的插件的示例配置如下所示:
<Configuration status="trace" packages="com.mycompany.myproduct">
...
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}.log.gz">
<!-- use custom lookups to access arbitrary internal system info -->
<PatternLayout header="${FabLookup:key1} ${FabLookup:key2}">
<Pattern>%d %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
...
如果以上内容不足以解决问题,请发布更多详细信息,例如您的插件是如何在您的 java 代码中声明的,以及它是如何在您的 log4j2.xml 中配置的。
关于java - 包属性未检测到 Log4j2 (2.1) 自定义插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29745938/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs