C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: 複数のサービスから1つのログファイルへの出力について


(過去ログ 55 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■30732 / inTopicNo.1)  複数のサービスから1つのログファイルへの出力について
  
□投稿者/ YOU (44回)-(2009/01/05(Mon) 14:36:27)

分類:[C#] 

言語:VisualStdio 2008 C#
Windowsサービス

複数のサービスから1つの共通ログ出力メソッドをコールしています。
テストで2つサービスを500ms周期にし、双方のログを確認した場合に
ログファイルに書き込まれません。それは、排他制御していないから
だと思うのですが、この場合、マルチスレッドでlookをかけて
処理する方法が理想なのでしょうか?

どなたか詳しい方教えてください。


引用返信 編集キー/
■30741 / inTopicNo.2)  Re[1]: 複数のサービスから1つのログファイルへの出力について
□投稿者/ なちゃ (247回)-(2009/01/05(Mon) 15:33:42)
一言でログといっても、ライブラリなどを利用するのか、書き込み先は何なのかなどにより異なります。
ただ、普通はlockでは解決できません。

普通に同一マシンのファイル書き込みなら、例えば名前つきのMutexなどを使って排他制御できます。

500ms毎などで出てないなら、ファイルを閉じずに書いてる可能性が高そうですね。
その場合は排他制御しつつフラッシュまで行い、かつ出力前にファイル最後までシークするなど工夫が要ります。
書き込みが頻繁でないなら書き込み毎に閉じてもいいと思います。
引用返信 編集キー/
■30743 / inTopicNo.3)  Re[2]: 複数のサービスから1つのログファイルへの出力について
□投稿者/ YOU (45回)-(2009/01/05(Mon) 15:43:30)
No30741 (なちゃ さん) に返信
> 一言でログといっても、ライブラリなどを利用するのか、書き込み先は何なのかなどにより異なります。
> ただ、普通はlockでは解決できません。
>
> 普通に同一マシンのファイル書き込みなら、例えば名前つきのMutexなどを使って排他制御できます。
>
> 500ms毎などで出てないなら、ファイルを閉じずに書いてる可能性が高そうですね。
> その場合は排他制御しつつフラッシュまで行い、かつ出力前にファイル最後までシークするなど工夫が要ります。
> 書き込みが頻繁でないなら書き込み毎に閉じてもいいと思います。
ありがとうございます。
ログ書き込みメソッドについては、ライブラリを作成してWindowsサービスで参照しています。
500msでは一部かけていません。
Mutexについて、調査してみます。なにかサンプルがあれば助かるのですが
あったらお願いいたします。





引用返信 編集キー/
■30755 / inTopicNo.4)  Re[3]: 複数のサービスから1つのログファイルへの出力について
□投稿者/ ちゃっぴ (194回)-(2009/01/06(Tue) 00:10:49)
ちゃっぴ さんの Web サイト
2009/01/06(Tue) 01:38:15 編集(投稿者)

一つの log file に出力しないといけないというのは必須条件なんですかね?

めんどくさい排他制御を行いたくないというのであれば event log を使うのも一つの方法です。
Default で用意されている application log とかを利用するというなら考慮が必要ですが、独自の event log file を作成してやることである程度回避可能ですね。
もっとも、Windows 2003 R2 以前では event log 自体 memory mapped file を利用しているので、上限に制限がありますので大量に出力する場合には問題になりますが。。。

どうしても、同じ log file に text 形式で出力したいのであれば、その log file を扱う専用の Windows service を作成する方がお勧めですね。
頻繁に open, close を繰り返すと排他制御が面倒ですし、うまくいったように思えたとしても Anti-Virus で問題になったりします。
引用返信 編集キー/
■30757 / inTopicNo.5)  Re[4]: 複数のサービスから1つのログファイルへの出力について
□投稿者/ オショウ (66回)-(2009/01/06(Tue) 08:07:48)
たかだか500msと言う長い時間間隔で自前のテキスト?ファイルのログファイルに
うまく出力できないと言うのは、根本的にどこかおかしい(バグがある)と思い
ます。

スレッドセーフなログ出力クラス作って使い回しすればよいだけの話なんで、そ
の「スレッドセーフ」な構造とするのにどう作るか・・・

最初からスレッドセーフなlog4net使う手もありますが、自前で作りたいのであれ
ば、System.Threading.ReaderWriterLock を調べてみて下さい。スレッドセーフ
化に必要な機能として使えます。

※ マシンの性能にも依存しますが、Pentium4 1GBメモリのWinXP Pro で、10ms
  間隔でのログ出力(自前テキストファイル、log4net使った両方とも)ログの
  出力は問題なく動作しています。
  .NET Framework 2.0/3.5 のランタイムでです。

頑張って下さい!

以上。
引用返信 編集キー/
■30761 / inTopicNo.6)  Re[5]: 複数のサービスから1つのログファイルへの出力について
□投稿者/ ちゃっぴ (195回)-(2009/01/06(Tue) 09:36:46)
ちゃっぴ さんの Web サイト
読み違えていた。。。

どうやら thread-safe にできていないようですね。
引用返信 編集キー/
■30762 / inTopicNo.7)  Re[6]: 複数のサービスから1つのログファイルへの出力について
□投稿者/ 渋木宏明(ひどり) (1021回)-(2009/01/06(Tue) 10:18:49)
渋木宏明(ひどり) さんの Web サイト
> どうやら thread-safe にできていないようですね。

どっちにしろ、「複数サービスから単独のログファイルに書き出したい」ということなので、プロセスローカルな thread-safe なだけでは不十分(つか、場合よっては見当違い)です。

確実なのは

>どうしても、同じ log file に text 形式で出力したいのであれば、その log file を扱う専用の Windows service を作成する方がお勧めですね。

になると思います。


引用返信 編集キー/
■30763 / inTopicNo.8)  Re[7]: 複数のサービスから1つのログファイルへの出力について
□投稿者/ オショウ (67回)-(2009/01/06(Tue) 10:56:59)
> どっちにしろ、「複数サービスから単独のログファイルに書き出したい」ということなので、プロセスローカルな thread-safe なだけでは不十分(つか、場合よっては見当違い)です。

  を!そうですネ〜
  以前、YOUさん、親サービス下で複数の子サービスを動作させたい由の
  書き込みがあったので、混同してました。

  現在は、別々のサービスとして動作させていると言うことですので、
  ログファイルへの排他制御も必要ですネ!

以上。
引用返信 編集キー/
■30790 / inTopicNo.9)  Re[8]: 複数のサービスから1つのログファイルへの出力について
□投稿者/ YOU (47回)-(2009/01/06(Tue) 22:47:47)
No30763 (オショウ さん) に返信
>>どっちにしろ、「複数サービスから単独のログファイルに書き出したい」ということなので、プロセスローカルな thread-safe なだけでは不十分(つか、場合よっては見当違い)です。
>
>   を!そうですネ〜
>   以前、YOUさん、親サービス下で複数の子サービスを動作させたい由の
>   書き込みがあったので、混同してました。
>
>   現在は、別々のサービスとして動作させていると言うことですので、
>   ログファイルへの排他制御も必要ですネ!
>
> 以上。
すみません。反省します。
みなさんの親切を裏切っていました。本当にすみません。
二度とこのようなことがないよう注意いたします。
今後とも宜しくお願いします。

ログ出力の件については、受信処理と同様に悩んでいました。
解決策として、共通ライブラリ内のログ出力メソッドをマルチスレッド化にして
排他制御させるようにさせました。
今は、問題なくログ出力されているので今はそれで進めています。










解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -