f#的printf样式日志记录

时间:2011-03-11 20:22:20

标签: f#

如何使用类似于log4net的日志库为f#设置printf样式的记录器。 我有Log.Debug,Info,Warn等功能,类似于log4net中的DebugFormat或InfoFormat。我试图为我的Log类设置类型扩展,我可以调用printf样式,如Log.Debugf“%s”“foo”。我的通用日志功能如下所示:

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

我无法使用扩展功能签名登录我的调试功能... 我尝试使用Debugf格式和Debug

3 个答案:

答案 0 :(得分:7)

我不熟悉log4net,但假设您正在登录MessageBox(就像专业人士那样),您可以执行以下操作:

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

答案 1 :(得分:4)

你的意思是这样的吗?

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 :(得分: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

中的lool