2012-05-09 96 views
0

我正在Scala中創建一個簡單的Web服務器,我試圖將事件日誌記錄實現到一個XML文件。 XML結構是這樣的:Scala - 將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追加到我缺少的文件中? 任何幫助表示讚賞:)

回答

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 
    } 
}