протоколирование в стиле printf для f # - PullRequest
3 голосов
/ 11 марта 2011

Как настроить регистратор в стиле printf для f #, используя библиотеку журналов, аналогичную log4net. У меня есть функции Log.Debug, Info, Warn и т. д., которые похожи на DebugFormat или InfoFormat в log4net. я попытался настроить расширения типов для своего класса Log, которые я мог бы вызывать в стиле printf, например Log.Debugf "% s" "foo". моя общая функция журнала выглядит так:

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

У меня проблемы с сигнатурой функции расширения для входа в мою функцию отладки ... я пытался использовать формат Debugf и Debug

Ответы [ 3 ]

7 голосов
/ 11 марта 2011

Я не знаком с 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
4 голосов
/ 12 марта 2011

ты имеешь в виду что-то подобное?

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 голосов
/ 10 февраля 2012

Вы можете использовать стандартную подсистему ведения журнала, определенную в пространстве имен System.Diagnostic.Вы должны быть уверены, что ваш журнал enviromnet правильно инициализирован.Например, что-то вроде этого (часть примера в 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");

Для удобства вы можете использовать другую трассировкуслушатель, который определяется сторонним программистом.Например, lool at: AlignedTextWriterTraceListener

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...