问题描述
我正在尝试使用mongoDb3设置log4j2,并且一切正常,唯一的问题是当我长时间抛出带有此类消息的异常时
logger.error("Some Message",new Exception("Test"));
Caused by: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class org.apache.logging.log4j.mongodb3.MongoDbDocumentObject.
但是我可以轻松地记录错误
logger.error(new Exception("Test"));
没有任何问题。
我们的项目主要使用slf4j进行日志记录,并且所有错误日志的样式都与第一个示例相同。 有什么办法可以在不更改所有异常日志的情况下解决此错误?
我的配置也很简单
<Nosql name="databaseAppender">
<MongoDb3 databaseName="admin" collectionName="testLogger" server="localhost"
username="***" password="****" />
</Nosql>
谢谢
解决方法
经过很多头痛和测试,我弄清楚了如何解决这个问题。 我只是将结果发布在这里,以防其他人遇到此问题。
由于某种原因org.apache.logging.log4j.mongodb3.MongoDbDocumentObject
不会自动由MongoDb编解码器注册,因此我必须创建一个ConnectionFactory类来注册该类。
public static MongoClient getMongoClient () {
MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder()
.codecRegistry(CodecRegistries.fromRegistries(
CodecRegistries.fromCodecs(new LevelCodec()),CodecRegistries.fromProviders(PojoCodecProvider.builder().register(MongoDbDocumentObject.class).build()),MongoClient.getDefaultCodecRegistry()));
MongoClientURI uri = new MongoClientURI("mongodb://"+userName+":"+passWord+"@"+dbUrl+":"+port,optionsBuilder);
return new MongoClient(uri);
}
显然,您必须更改log4j Appender才能使用类和方法:
<NoSql name="databaseAppender">
<MongoDb3 databaseName="test" collectionName="testLogger" factoryClassName="ClassName"
factoryMethodName="getMongoClient" />
</NoSql>
我的依赖是:
implementation group: 'org.slf4j',name: 'slf4j-api',version: '1.7.30'
// Log4j
implementation group: 'org.apache.logging.log4j',name: 'log4j-core',version: '2.13.3'
implementation group: 'org.apache.logging.log4j',name:'log4j-mongodb3',version:'2.13.3'
implementation group: 'org.apache.logging.log4j',name: 'log4j-slf4j-impl',version: '2.13.3'
implementation group:'com.fasterxml.jackson.dataformat',name:'jackson-dataformat-xml',version:'2.9.4'
// https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver
implementation group: 'org.mongodb',name: 'mongo-java-driver',version: '3.12.7'