2011-03-11 84 views
2

如何設置登錄使用F#的一個printf風格的記錄庫類似,log4net的。 我有Log.Debug,信息,警告等類似於DebugFormat或InfoFormat在log4net的功能。我試圖安裝類型擴展我的日誌類,我可以在printf類型調用諸如Log.Debugf「%s的」「富」。我一般的日誌功能看起來是這樣的:printf類型的日誌記錄F#

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

我有擴展函數簽名的麻煩登錄到我的調試功能... 我嘗試使用Debugf格式和調試

回答

6

我不熟悉與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 
+0

非常感謝你們倆,我爲此跳了一陣子,終於放棄了(一反常態* :)) – Alex 2011-03-11 20:59:32

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

您可以使用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"); 

爲了更方便您可以使用由第三方程序員definded另一個跟蹤偵聽器。 例如lool在:AlignedTextWriterTraceListener