F#中的printf风格日志记录

4

如何使用类似于log4net的日志库为F#设置printf样式的记录器?我有类似于log4net中的DebugFormat或InfoFormat的Log.Debug、Info、Warn等函数。我尝试设置类型扩展,以便可以像Log.Debugf“%s”“foo”这样以printf样式调用它们。我的通用记录函数如下:

let log format = Printf.kprintf (sprintf "%s") format

我在扩展函数签名上遇到了麻烦,想要记录到我的Debug函数中... 我尝试使用Debugf格式和Debug。
3个回答

7

我不熟悉log4net,但假设你正在记录到消息框(就像专业人士一样),你可以执行以下操作:

let log format = Printf.kprintf (fun msg -> System.Windows.Forms.MessageBox.Show(msg)) format

在这种情况下,由于Show需要一个字符串,因此可以缩短为:
let log format = Printf.kprintf System.Windows.Forms.MessageBox.Show format

非常感谢你们俩的帮助,我在这个问题上跳了一段时间,最终不得不放弃(这是不寻常的 :))。 - Alex

5
你是指像这样的东西吗?
open System

type SomeLogger() = 
    member this.Error(format : string, [<ParamArray>]args : obj[] ) = ()
    member this.Info(format : string, [<ParamArray>]args : obj[] ) = ()


module Extensions = 
    type SomeLogger with
        member this.FInfo format = Printf.ksprintf (this.Info) format
        member this.FError format = Printf.ksprintf (this.Error) format

open Extensions

let l = new SomeLogger()
l.FInfo "%d%s" 10 "123"

2

您可以使用在System.Diagnostic命名空间中定义的标准日志记录子系统。您需要确保日志记录环境正确初始化。例如,下面是C#示例代码的一部分,但它也可以轻松地与F#代码链接起来。

Trace.Listeners.Clear();
try {
    TextWriterTraceListener infoTextLogger = new AlignedTextWriterTraceListener(@"c:\temp\log.log");
    infoTextLogger.Filter = new EventTypeFilter(SourceLevels.All);
    infoTextLogger.TraceOutputOptions = TraceOptions.DateTime | TraceOptions.ProcessId | TraceOptions.ThreadId;
    Trace.Listeners.Add(infoTextLogger);
    TextWriterTraceListener consoleWriter = new AlignedTextWriterTraceListener(System.Console.Out);
    consoleWriter.Filter = new EventTypeFilter(SourceLevels.Information);
    Trace.Listeners.Add(consoleWriter);
} catch (Exception exp) {
    throw exp;
}
AlignedTextWriterTraceListener.TraceSourceNameLength = SOURCE_NAME_FIELD_LENGTH;
Trace.AutoFlush = true;
Trace.TraceInformation("Logging subsystem has been initiated");

所以在 F# 中
open System
open System.Diagnostics
module ClientConsole =
    let Run _ =
      Trace.TraceInformation("Client started");

为了更方便,您可以使用第三方程序员定义的另一个跟踪侦听器。

例如,请查看:AlignedTextWriterTraceListener


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接