掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ログ出力について (ID:72954)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 複数のプロセスから、安全に操作する方法を教えてください。 言われているようにファイルの共有モード利用すれば良いと思うが、ログの書き込み要求がなされた順番を維持したいのならミューテックス使ってプロセス間同期をとれば良いかと。 以下 Shift-JIS 文字セットでlogを出力すると仮定してのコード void log(LPCSTR logtext) { HANDLE mutex = ::CreateMutex(NULL, FALSE, _T("適当なオブジェクト名")); if (mutex != NULL) { ::WaitForSingleObject(mutex, INFINITE); // 別プロセスが処理中なら待機 HANDLE file = ::CreateFile(_T("c:\\log.log"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (file != INVALID_HANDLE_VALUE) { ::SetFilePointer(file, 0, NULL, FILE_END); // const int filesizeLimit = ファイルサイズ制限値 // checkSize(file, max(0, filesizeLimit - strlen(logtext) + strlen("\r\n"))); // 詳細後述 DWORD written; ::WriteFile(file, logtext, strlen(logtext), &written, NULL); ::WriteFile(file, "\r\n", strlen("\r\n"), &written, NULL); // 改行 ::CloseHandle(file); } ::ReleaseMutex(mutex); } } UIスレッドから呼ぶ場合は WaitForSingleObject ではロック中画面が固まるので MsgWaitForMultipleObjects 辺りに置き換えるべき。 > 2番については、log1.log を書き込むときに、log2.log を削除... > (ログには改行コードが含まれていない前提です)。 在る程度古いログは自動的に削除してよいのならファイルを分けないやり方も有りじゃね? 例えば制限サイズを越える場合はその分古いログを捨てるとか。 void checkSize(HANDLE file, DWORD limitLength) { const DWORD lowLength = ::GetFileSize(file, NULL); if (lowLength >= limitLength) { // 制限越えた? std::vector<BYTE> v(lowLength + 1); ::SetFilePointer(file, 0, NULL, FILE_BEGIN); DWORD len; ::ReadFile(file, &v[0], lowLength, &len, NULL); const unsigned char *cutline = &v[len] - limitLength; // 切捨て境界位置 v[len] = '\0'; // _mbschr利用のために\0終端付加 unsigned char *p = p=_mbschr(&v[0], '\n'); // 各ログは"\r\n"(or"\n")で区切られている前提 for (; p != NULL && p < cutline; p=_mbschr(p+1, '\n')) ; ::SetFilePointer(file, 0, NULL, FILE_BEGIN); if (p != NULL) { ::WriteFile(file, ++p, len - (p - &v[0]), &len, NULL); } ::SetEndOfFile(file); } } ファイルを分けるのが仕様としてあるのならば既に挙がっている以外で画期的な方法は思いつかない… それでも挙げるとすれば、ファイルサイズが溢れた時点で ・log3.log削除、log2.log->log3.logとりネーム、log1.log->log2.logとりネーム、log1.logを初期化してログWrite として最新ログは常にlog1.logに記録していくとか。これならばログの書き込み対象は常にlog1.logとなるので迷わない。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.