我使用异步工作流在 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# 中不可用。并且您想跟踪一些模块功能。这就是我选择上述分发模型的原因。如果你这样做任何其他方式你都很难通过日志。)