非同期ワークフローを使用して F# でアプリケーションを作成しました。今私がやりたいことはそれにいくつかのトレースを追加することです!
基本的に、複数回インスタンス化できるクラス A があります。インスタンスのそれぞれは、独立して非同期 (それ自体) および並列 (他に対して) 動作しています。私の基本的なアイデアは、A のすべてのインスタンスに TraceSource インスタンスを追加することです。これは、おそらく私がやりたいことです。https://github.com/matthid/fsharpasynctraceを介して Async オブジェクトを使用して TraceSource を配布する問題を解決できました
ただし、すべての TraceSource インスタンスに同じ名前が付けられている場合、それらの一部は同じファイル (log.txt) に書き込まれ、その他は {guid}log.txt に書き込まれます。
すべてのインスタンスに別の名前を付けた場合、ユーザーは app.config ファイルを編集してログを正しく取得する必要があります。A のすべてのインスタンスには、ユーザーが指定した論理名があるため、インスタンスのログを name_log.txt に保存するのが理想的です。(これは、ユーザーが基本的に実行時に A のインスタンスを作成しているためです)
だから私の質問は:これを行うためのより良い方法はありますか?つまり、ユーザーが対話せずに(app.configを介して)必要な出力と柔軟性を得ることができますか?
注: 基本的にすべてがスレッドプールにあり、インスタンス間で同時に多くのアクションが発生する可能性があるため、クラスまたはスレッドをトレースすることはまったくオプションではありません。
注 2: app.config を何らかの方法で拡張し、それを自分で行うことを考えることができます。これが私の唯一のオプションですか?
編集:質問をより明確にするために:
次のクラスを想像してください。
module OtherModule =
let doSomethingAsync m = async{return()}
[<AbstractClass>]
type A (name:string) as x =
let processor =
MailboxProcessor.Start(
fun inbox -> async {
while true do
let! msg = inbox.Receive()
do! x.B(msg)
do! OtherModule.doSomethingAsync(msg)})
abstract member B : string -> Async<unit>
member x.Do(t:string) = processor.Post(t)
このクラスのインスタンスが多数あり、すべてのインスタンスが非常に長く存続しています。これで、上記の状況になりました。(F# では使用できない保護された tracesource によって実行できる抽象メンバーもトレースしたいと考えています。また、いくつかのモジュール関数をトレースしたいと考えています。それが、上記の分散モデルを選択した理由です。それを行う場合他の方法では、ログを調べるのに苦労します。)