【问题标题】:Cannot serialize log message using NoSQLAppender in Log4j2无法在 Log4j2 中使用 NoSQLAppender 序列化日志消息
【发布时间】:2013-08-01 01:25:59
【问题描述】:

你们能否演示一下如何在 Log4j2 (2.0-beta8) 中将 NoSQLAppender 与 MongoDB 一起使用?

我正在使用 Scala(尽管我认为这无关紧要)。

我拥有的 Java Mongo DB 驱动程序是 2.11.2

Appender 抛出以下异常

2013-07-31 18:19:27,831 ERROR An exception occurred processing Appender databaseAppender java.lang.IllegalArgumentException: can't serialize class org.apache.logging.log4j.Level
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:270)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:174)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:120)
    at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
    at com.mongodb.OutMessage.putObject(OutMessage.java:289)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:239)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:204)
    at com.mongodb.DBCollection.insert(DBCollection.java:148)
    at com.mongodb.DBCollection.insert(DBCollection.java:91)
    at org.apache.logging.log4j.core.appender.db.nosql.mongo.MongoDBConnection.insertObject(MongoDBConnection.java:61)

【问题讨论】:

    标签: mongodb scala log4j mongodb-java log4j2


    【解决方案1】:

    好吧,我最终像这样为 Level 枚举实现了转换器

    class LevelBSONEncoder extends org.bson.Transformer {
      def transform(o: Any): AnyRef =
        o match {
          case level: org.apache.logging.log4j.Level => new java.lang.Integer(level.intLevel())
        }
    }
    
    // which is used like this
    
    org.bson.BSON.addEncodingHook(org.apache.logging.log4j.Level.ERROR.getClass, new LevelBSONEncoder())
    

    如果有人知道更优雅的解决方案,请告诉我。

    附言。嗯,那很快。我报告了这个错误 https://issues.apache.org/jira/browse/LOG4J2-330 并且维护人员确认建议的修复将被合并到 repo 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 2019-10-27
      • 2019-05-27
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      相关资源
      最近更新 更多