質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

16632閲覧

一つのログファイルに複数のユーザーが書き込み際に問題が。

yuki00079

総合スコア45

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/12/05 15:58

編集2016/12/07 02:56

###前提・実現したいこと
タイトル通りなのですが、一つのログファイルに対して複数のプロセスで書き込む運用を行っております。log4netを使用し、ロックすることなく書き込めるのですが下記の問題がございます。

###発生している問題・エラーメッセージ
〇ファイルが複数出力される。(ロックしそうな際に別ファイルに出力される?。)
〇ログが順序よく出力されない。プロセス単位で出力されない。他のプロセスが処理途中に書き込んでしまい、
ログが見難くなる。(時系列通りには出力される。)

###該当のソースコード
下記の設定でマルチプロセス書き込みはできるのですが。

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

###補足情報(言語/FW/ツール等のバージョンなど)
log4netで上記の問題を解決する方法がございますでしょうか。
また、その他ライブラリで解決できるのであれば挙げていただけると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2016/12/07 01:49

「ログが順序よく出力されない。プロセスごとのまとまりで出力されずにバラバラに出力されてしまう。」というのは、「順序良く」の意味を時系列でなく一つのプロセスが終了するまでを一つの書き込み単位としたい、ということでしょうか?
yuki00079

2016/12/07 02:54

返信ありがとうございます。説明下手で申し訳ございません。「順序良く」は時系列ではなくプロセス単位を意味しております。
guest

回答1

0

ベストアンサー

log4netのコンフィグについては、ここで同様の問題の解決策が乗っていたので共有します。

個人的な意見としては、マルチプロセス等を抱える複雑な要件ではlog出力クラスをある程度自前で作成しておくべきだと思います。

〇ログが順序よく出力されない。プロセスごとのまとまりで出力されずにバラバラに出力されてしまう。

各ログを一つのファイルにそれぞれ順次追記していけばまずプロセスごとの纏まりで出力することはできません。
正確な希望がわかりませんが、マルチプロセスのログを適切に管理したい場合、ログ出力用の受け皿となるクラスを自前で作成する必要があると思います。
先ほど紹介したページでは、log4netのバッファリングに任せてグループ化する方法をとっていましたが、それをプログラマーが制御できない状態というのは良い状態とは言えません。(先ほどのページのように要件を満たしてる場合は当然良いのですが。)

Queueを使って書き込む内容を自前で整列させたり、ログの書き込み処理を別のスレッドに逃がしたり、はたまた構造化したりということをいつでも改善できるように、また特定のログ出力技術にロックインされないように、log4netを使うならこれを別のクラスを一旦ラップしておくのを推奨します。ログ出力クラスはいくらでも再利用しますしね。

投稿2016/12/07 02:46

編集2016/12/07 02:47
haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki00079

2016/12/08 09:56

返信ありがとうございます。 >ログ出力用の受け皿となるクラスを自前で作成する必要があると思います。 ライブラリのみでの実装では困難のようですね。当方の要件を満たすにはログクラスの新規作成かラッパークラスですか。ログ出力自体はどのプロジェクトでも応用できるので解決案とさせていただきます。
haru666

2016/12/09 01:30

他に回答つかなかったのが残念ですが… 一応、自分はパフォーマンス重視の案件ではSLAB(Semmantic Logging Application Block)というのも使っていたことがあります。 ただ、各クラスと1:1になるようなログを吐くためのクラスをコーディングしておくような作りでテンプレート無しに実装するのが困難だったのと、Windows専用だったことがあって、結局自分もlog4netラップしてます。物凄いパフォーマンスが必要な要件に出会わない限りいいかなと…。 SLABを正しく使い、そのログをデータベースに保存しておけば、クエリ検索でグループ化はどうとでもなります。興味があれば検索してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問