アフィリエイト広告を利用しています

広告

posted by fanblog

2014年05月30日

サーバ方式ではないログの多重追記方式を考えてみる

同じログ出力ライブラリを使用していて、たまたま同じファイル名になる場合というのも、結構あったりする
こうした際、通常は先にログファイルをオープンしている方が排他的にファイルに書き込むことができえるわけだ
ところが、こうした方式の場合、同じファイル名だと、後から書こうとしていたプロセスのログが失われててしまう
度々非同期に呼ばれるコマンドが、同じログファイルを使用していると、こうしたことになってしまい、後から解析するのに困ってしまうわけだ

とりあえず、Win32 に限って考えてみると、 LockFile API が何となく使えそうな気がした

例えば次のようなインタフェースでログを書くとする


void write(void* buffer, size);


書き込み動作の最終インターフェースがこうした形式であれば、ファイルの最後の領域をロックして、そのロックした両機に指定サイズのデータを書き込めば、うまくいくのではないかと思えた
そこで、次のようなコードを考えてみた


void CWin32Logger::write(void* buffer, DWORD size)
{
DWORD dwSize = GetFileSize(m_hFile, NULL);
while (!LockFile(m_hFile, dwSize, 0, size, 0)) {
Sleep(10);
dwSize = GetFileSize(m_hFile, NULL);
}
if (INVALID_SET_FILE_POINTER != SetFilePointer(m_hFile, 0, NULL, FILE_END)) {
DWORD sz;
if (WriteFile(m_hFile, buffer, size, &sz, NULL)) {
m_dwLoPos = dwSize + size;
FlushFileBuffers(m_hFile);
SetEndOfFile(m_hFile);
}
} else {
TCHAR msg[256] = {0};
wsprintf(msg, _T("%d\r\n"), GetLastError());
OutputDebugString(msg);
}
UnlockFile(m_hFile, dwSize, 0, size, 0);
}


一見これでうまく行きそうに見えたのだが、残念ながらうまくいかず、ファイルの書き込みがオーバーラップしてしまっていた
重なった領域はロックできないと思ったのだが、先頭部分のロック獲得ループがあっさりと抜けてしまい、前のプロセスの書き込み途中から上書きするようになってしまった
もう少し工夫しないといけなさそうだ




この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/2461162
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
ファン
検索
<< 2016年05月 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
最新記事
最新コメント
タグクラウド
カテゴリアーカイブ
プロフィール
いしちゃんさんの画像
いしちゃん
ブログ
プロフィール
日別アーカイブ
×

この広告は30日以上新しい記事の更新がないブログに表示されております。