0

我正在 Scala 中创建一个简单的 Web 服务器,并尝试将事件日志记录到 XML 文件中。因此,XML 结构是:

<log>
      <event>
             <type>Info/Warning/Error/etc</type>
             <description>File not found etc</description>
             <file>/etc/etc.etc</file>
             <ip>1.2.3.4</ip>
             <time>12:34:56 1st Jan 2012</time>
      </event>
      <event>
             etc...
      <event>
</log>

目前我正在尝试将 XML 写入这样的文件:

var logEvent = 
    <log>
<event>
<type>ERROR</type>
<description>The Requested File was not found</description>
<file>{path}</file>
<ip>{connection.getRemoteSocketAddress}</ip>
<time>{new Date(System.currentTimeMillis)}</time>
</event>
</log>

XML.save(logFile, logEvent, "UTF-8", true, null)

但是,当我检查文件时,只有最近的偶数存在并在服务器运行时刷新文件显示每个事件都会替换文件中的最后一个事件。

我还尝试使用FileOutputStream启用附加功能的方法,XML.write但它会在每个事件之前插入 XML 模式,这会阻止它被识别为正确的 XML 文件。它还<log>在每个事件周围添加根标签。

我能想到的唯一方法是将当前 XML 加载到文件中,添加到它然后将其写回,这对我来说似乎效率很低。

有没有一种简单的方法可以将 XML 附加到我丢失的文件中?任何帮助表示赞赏:)

4

1 回答 1

0

如果您以该格式附加另一个日志,则您的文档将不是有效的 XML,因为缺少顶级容器。
如果您不在乎,您可以简单地使用 java.nio.channels.FileChannel。

import java.nio._
import java.io._

def appendToFile(f: File) {
  var foutstream: Option[FileOutputStream] = None
  lazy val foutchannel = foutstream.get.getChannel
  try {
    foutstream = Some(new FileOutputStream(f, true)
    val buffer = ByteBuffer.allocate(1024)
    "this text will be appended" foreach (buffer.put(_.toByte))
    buffer.flip
    foutchannel.write(buffer)
    foutchannel.close
    foutstream.get.close
  } catch {
    case e: Exception => e printStackTrace
  }
}
于 2012-05-10T06:33:45.383 回答