如何使用类似于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
答案 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