我想构建一个自定义打印功能,用于确定调试记录器的打印内容。
我正在寻找的功能如下:
let debugLog severity ... =
if severity < logLevel then
printfn ...
// otherwise just ignore
不幸的是我不知道如何填写...我还想避免直接传递一个字符串作为第二个参数,我真的希望我的函数表现得像一个扩展的printfn。
答案 0 :(得分:2)
您可以使用kprintf
功能。
let maxLevel = 3
let log severityLevel str =
if severityLevel < maxLevel then
printfn "%s" str
// or you can add more formatting
// printfn "Level: %i -> %s" severityLevel str
let logf sevLevel str = Printf.kprintf (log sevLevel) str
logf 1 "Message: %i" 1 // prints 'Message: 1'
logf 4 "Message: %i" 2 // doesn't print
logf 2 "Message: %s %i" "this is test" 3 // prints Message: this is test 3
答案 1 :(得分:1)
我能想到的最佳方式是在您想要打印时将fprintf
与stdout
一起使用,在不打印时使用TextWriter.Null
。
let logLevel = 3
let debugLog severity format =
let out =
if severity < logLevel then
stdout
else
System.IO.TextWriter.Null
fprintfn out format
debugLog 2 "test: %i" 42 // prints 'test: 42'
debugLog 4 "test: %i" 42 // prints nothing