- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 log4j2 OSGi 包,但 log4j2 api 似乎无法在 OSGi 环境中找到 log4j2 核心。我不断收到以下异常:
ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console
我发现在几个地方讨论了相同的异常,但我仍然无法弄清楚这个问题。我怀疑我遇到这个问题是因为 log4j2 api 在 log4j2 核心的 META-INF 目录中找不到 log4j-provider.properties。有什么线索为什么我会收到这个异常,我该如何纠正这个问题?(如果有人有用于添加 log4j 依赖项和捆绑的正确 pom 文件,请与我分享)
这些是我用过的依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.2</version>
</dependency>
我使用 apache felix 作为捆绑插件。发生此错误是因为 log4j2-core 的 META-INF 中的资源,特别是 log4j-providoer.properties 文件对 log4j api 不可见。
谢谢!
最佳答案
当 Activator 启动并开始搜索日志插件时,log4j-core bundle 会注册一个 bundle listener,如果找到某些东西,它会执行一系列类似于通常的 Logger 初始化的操作(不是真正惯用的 OSGi 东西,我是不确定它是否有效,但它似乎至少设置了 Log4jContextSelector
和 LoggerContextFactory
),只是为了确定它,您是否安装了 和 开始log4j-core 包并验证没有任何改变?
更新:
我做了一些测试,发现什么是 log4j2 OSGi 问题的可接受解决方案/变通方法。但正如其他人所推荐的那样,我也可以使用 slf4j、pax-logging 或简单的 OSGi 日志服务(最简单的一种)。
@Grant,您有两件事需要修复:
1. 如您所述,“Log4j2 找不到日志记录实现”错误是由于 log4j2-api
包无法找到log4j-provider.properties文件和,修复后,log4j2-api
找不到log4j2-core
类(这是一个不同的包,log4j2-api
没有特定的 Import-Package: 用于这些类)。
解决方法是为 log4j2-api
(我叫我的 log4j-api-config.jar)创建一个小片段包,其中包含 META-INF< 中的 .properties 文件
和强制动态导入的 list :
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Log4j API configurator
Bundle-SymbolicName: org.apache.logging.log4j.apiconf
Bundle-Version: 1.0.0
Bundle-Vendor: None
Bundle-RequiredExecutionEnvironment: OSGi/Minimum-1.2
Fragment-Host: org.apache.logging.log4j.api
DynamicImport-Package: *
我在此处导入 *,您可以通过添加 log4j2-api
所需的 log4j2-core
包的子集来改进它。
有了这个,错误就会消失,但 log4j 会注意到您没有提供 log4j2 配置文件,接下来要修复(仅当您关心这种情况时)。
2. 此时 Felix 会显示:
log4j2.xml not found by org.apache.logging.log4j.core
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
而且我想您可能希望添加自己的 log4j2.xml 而不会弄乱原始的 log4j2-core.jar
。您可以创建另一个片段包,这次由 log4j2-core
托管,根目录中只有一个 log4j2.xml 配置文件和一个简单的 list :
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Log4j Core configurator
Bundle-SymbolicName: org.apache.logging.log4j.coreconf
Bundle-Version: 1.0.0
Bundle-Vendor: None
Bundle-RequiredExecutionEnvironment: OSGi/Minimum-1.2
Fragment-Host: org.apache.logging.log4j.core
我在测试期间使用了这个简单的 log4j2.xml 配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
有了这个,您将不再需要下面描述的那种“桥接”包,您只需要一个简单的 Import-Package: org.apache.logging.log4j
来使用 log4j从你的包。
更新 2:
重要的是要注意这两个片段不是原始包的依赖项(不需要修改 log4j jar 或什至您的包来添加导入/导出),因此原始包和您自己的自定义包将保持不变。此外,它们也不依赖于原始包,它们只是带有 list 和附加文本文件的基本 jar 存档,没有代码,不需要 Import-Package 或 Export-Package。
您只需在安装主机包后安装每个片段。
我已经从一个空的 jar 开始手动创建了两个片段,然后在存档中复制属性文件并使用文本编辑器修改 MANIFEST.MF,您可以使用这个 pom.xml 创建它们,记得复制 log4j- pom.xml所在的provider.properties。
对于 log4j2-api
片段:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my.group</groupId>
<artifactId>log4j2-api-config</artifactId>
<version>1.0</version>
<name>log4j2-api-config</name>
<packaging>bundle</packaging>
<properties>
<java-version>1.7</java-version>
</properties>
<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.0.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>org.apache.logging.log4j.apiconf</Bundle-SymbolicName>
<Bundle-Name>Log4j API Configurator</Bundle-Name>
<Bundle-Version>1.0.0</Bundle-Version>
<Fragment-Host>org.apache.logging.log4j.api</Fragment-Host>
<DynamicImport-Package>
*;resolution:=optional
</DynamicImport-Package>
</instructions>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>.</directory>
<includes>
<include>log4j-provider.properties</include>
</includes>
<targetPath>META-INF</targetPath>
</resource>
</resources>
</build>
</project>
在适当的地方修改此 pom(包括文件、包名称)以生成另一个具有 log4j2-core
配置的 pom。
关于java - Log4j2 api在OSGi环境下找不到Log4j2核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30045873/
不同的 LogCat 方法是: Log.v(); // Verbose Log.d(); // Debug Log.i(); // Info Log.w(); // Warning Log.e();
在android群里,经常会有人问我,android log是怎么用的,今天我就把从网上以及sdk里东拼西凑过来,让大家先一睹为快,希望对大家入门android log有一定的帮助. android
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 社区 12
我正在尝试使用 sonarlint 检查代码质量.上面的问题概要,我不明白为什么它要说要大写。但是 this discussion与上述建议相反。哪一个应该被认为是正确的? 最佳答案 这没有正确答案,
随着 n 变大,log*(log n) 和 log(log* n) 这两个函数会更快吗? 这里,log* 函数是迭代对数,定义如下: 我怀疑它们是相同的,只是写法不同,但它们之间有什么区别吗? 最佳答
作为家庭作业,我被要求在 O(log(n)) 中编写一个算法,我可以计算出我编写的算法的复杂度为 O(log(n) + log(n/2) + log(n/4) + log(n/8) + ... + l
我正在使用 Tomee。日志文件夹包含这样的文件 localhost_access_log.2016-12-02.txt localhost.2016-12-02.log catalina.2016-
Android Log.v、Log.d、Log.i、Log.e 等的 ios 等效项是什么?同样在 android 上,我使用 Android 设备监视器和 logcat 来访问我的手机日志,我需要在
我认为下面的代码是 O(log log n) 因为它里面有 i*i 但我对 log n 感到困惑> 和 log (log n)。 for (i=2; i*i<=number; i++) { if
我正在修改 kvm 模块,并在内核代码中添加了 printk 语句。运行虚拟机后,printk 为我提供了错误地址和有关 guest 操作系统的其他信息。 我需要从这个信息中生成统计信息。当我使用 d
我有一个部署为 Windows Azure Web 角色的 WCF 服务。 我正在使用 Enterprise Library 进行异常处理,并且在我的本地 Development Fabric 中,似
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
在 Go 的生产中使用 log.SetFlags(log.LstdFlags | log.Lshortfile) 是好的做法(至少是一般做法)吗?我想知道在生产中这样做是否存在性能或安全问题。因为它不
我想知道什么更快: double value = Math.log(a) - Math.log(b); 或 double value = Math.log(a/b); 我计算值的方式是否会对性能产生影
我有数百个子例程使用 log.Println() 写入日志文件 我正在使用 log.Println 写入 error.log 文件。 func main() { e, err := os.Open
我将 Nuxt 与 SSR 一起使用,并希望有类似于 apaches 的 access.log 和 error.log 的东西 我特别感兴趣的是每次调用的响应时间。 我在 nuxt 文档中找不到任何内
我知道以前有人问过这个问题,但我相信这是一个不同的问题。 Nginx 在 www-data 下运行: $ ps -eo "%U %G %a" | grep nginx root root
我在我的日志文件中发现了一个非常奇怪的条目 Jan 29 01:35:30 vs-proj-handy sshd[5316]: Received disconnect from 130.207.203
对于我正在开发的应用程序,我希望在开发过程中和发布时简化故障排除。我希望能够检索到对 Log 的调用,以了解在 USB 调试中没有连接手机的情况下运行应用程序时的调用,以便可以检索并发送给我。例如,当
我试图捕获 panic 并记录错误: func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloRep
我是一名优秀的程序员,十分优秀!