kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Common Log File System(CLFS)で書いてみる。

昨日に引き続き、CLFS。少し試行錯誤してわかってきました。今日やったのはログを追記するあたり。
Appending Records to a Log (Windows)

  • CreateLogFileで領域を作り、ポリシーを設定する(自動拡張ポリシーはWindows Server 2003 R2ではうまく動かないみたいなことが書いてある)
  • AddLogContainer か AddLogContainerSet でコンテナを作成する。最低二ついるようなことが書いてあるが、私が1レコード書くだけの場合は呼ばなくてもよかった。
  • CreateLogMarshallingAreaを呼び出してMarshallingAreaを作成する。COMのIUNKOWNをもらうと思えばいい(なんて乱暴な)。
  • ReserveAndAppendLog で実際に追記する。追記する内容は第二引数のPCLFS_WRITE_ENTRY構造体のメンバに指定する。cReserveRecordsとrgcbReservationはNULL指定でも問題なくかけたが、たぶん指定したほうがいいのかもしれない。まだよくわからない。
  • FlushLogBuffersでログをフラッシュする。私が試したときはCloseAndResetLogFileで閉じてもFlushLogBuffersを呼び出さないと書いてくれなかった。
  • CloseAndResetLogFileでクローズ(?)。

Windows 7 SDKでもCLFSはサンプルがなくて試行錯誤しています。System.IO.Log使うか、非同期書き込みでも十分間に合うのでしょうけど、これでどのくらい性能が変わるか少し試してみたいと思ってます。特にログ書き込みに排他をアプリケーション側が気にしなくていいのがとてもありがたいですね。それと、CLFSも非同期I/Oサポートしているんだ…。