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 に答える