java - Groovy Xml 解析器忽略 CDATA CRCL

标签 java xml groovy log4j

我想解析 log4j 生成的 xml 日志。 xml 中有一个带有可抛出对象(如果有)的节点。此(多行、选项卡式)文本封装在 CDATA 标记中。

这是整个文件的摘录:

<log4j:event logger="org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver" timestamp="1330083921521" level="ERROR" thread="http-8080-1">
<log4j:message><![CDATA[Exception occurred when processing request: [GET] /test/log/show
Stacktrace follows:]]></log4j:message>
<log4j:throwable><![CDATA[org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
    at test.LogController$_closure2.doCall(LogController.groovy:21)
    at test.LogController$_closure2.doCall(LogController.groovy)
    at java.lang.Thread.run(Thread.java:662)
]]></log4j:throwable>
</log4j:event>

我用groovys XmlParser解析它:

def parser = new XmlParser(false, false).parse(new File("stack.log"))

return parser.'log4j:event'.collect { l ->
    LogEntry entry = new LogEntry()
    entry.with {
        level = l.'@level'
        message = l.'log4j:message'.text()
        thread = l.'@thread'
        logger = l.'@logger'
        timestamp = new Date(l.'@timestamp' as long)
        throwable = l.'log4j:throwable'?.text() ?: ''
    }
    entry
}

“可抛出”字段包含所有文本,但不包含 CR/LF。

有人知道如何应对吗?

提前致谢...

最佳答案

不想只是向你扔代码,但它似乎按预期工作并返回 CRLF

def xml = '''<log>
            |  <log4j:event logger="org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver" timestamp="1330083921521" level="ERROR" thread="http-8080-1">
            |    <log4j:message><![CDATA[Exception occurred when processing request: [GET] /test/log/show
            |Stacktrace follows:]]></log4j:message>
            |    <log4j:throwable><![CDATA[org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
            |    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231)
            |    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
            |    at test.LogController$_closure2.doCall(LogController.groovy:21)
            |    at test.LogController$_closure2.doCall(LogController.groovy)
            |    at java.lang.Thread.run(Thread.java:662)
            |]]></log4j:throwable>
            |  </log4j:event>
            |</log>'''.stripMargin()


class LogEntry {
  def level
  def message
  def thread
  def logger
  def timestamp
  def throwable

  String toString() {
    """EVENT:
      |  level   : $level
      |  message : $message
      |  thread  : $thread
      |  logger  : $logger
      |  ts      : $timestamp
      |  thrown  : $throwable""".stripMargin()
  }
}

def parser = new XmlParser(false, false).parseText( xml )
def entries = parser.'log4j:event'.collect { event ->
  new LogEntry().with {
    level     = event.@level
    message   = event.'log4j:message'.text()
    thread    = event.@thread
    logger    = event.@logger
    timestamp = new Date( event.@timestamp as long )
    throwable = event.'log4j:throwable'?.text() ?: ''
    it
  }
}

entries.each {
  println it
}

打印:

EVENT:
  level   : ERROR
  message : Exception occurred when processing request: [GET] /test/log/show
Stacktrace follows:
  thread  : http-8080-1
  logger  : org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver
  ts      : Fri Feb 24 11:45:21 GMT 2012
  thrown  : org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
    at test.LogController$_closure2.doCall(LogController.groovy:21)
    at test.LogController$_closure2.doCall(LogController.groovy)
    at java.lang.Thread.run(Thread.java:662)

其中有 CRLF 字符,它们应该在...

这是 Groovy 1.8.6 顺便说一句...您使用的是什么版本?您可以升级并重试吗?

关于java - Groovy Xml 解析器忽略 CDATA CRCL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9431771/

相关文章:

java - 递归代码到非递归循环

java - 安全异常 : BC provider not installed

java - 解析xml文件错误

c# - 如何从 XDocument 获取 Xml 作为字符串?

java - 在 eclipse 中运行程序

java - 无法弄清楚 java.lang.ArrayIndexOutOfBoundsException : length=1; index=1 is coming from 在哪里

jquery - 在 XML 文档中使用 find() 和 first() 以及 replaceWith()

groovy - 通过名称访问变量值作为 String (groovy)

java - 预期和实际未显示在控制台日志中 - Groovy Spock

java - 为什么不在模板中显示 Playframework 自定义验证消息