Skip to content

Commit 0dc37e8

Browse files
authored
Merge pull request #8 from baronfel/console-mapped-context
implement simple propertyname logging for the console logger
2 parents 8655fad + 7001c9c commit 0dc37e8

File tree

1 file changed

+26
-5
lines changed

1 file changed

+26
-5
lines changed

src/FsLibLog/FsLibLog.fs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,8 @@ module Providers =
417417
let isAvailable () = true
418418

419419
type private ConsoleProvider () =
420+
let propertyStack = System.Collections.Generic.Stack<string * obj>()
421+
420422
let threadSafeWriter = MailboxProcessor.Start(fun inbox ->
421423
let rec loop () = async {
422424
let! (consoleColor, message : string) = inbox.Receive()
@@ -439,6 +441,7 @@ module Providers =
439441
(LogLevel.Debug, ConsoleColor.Gray)
440442
(LogLevel.Trace, ConsoleColor.DarkGray)
441443
])
444+
442445
let writeMessage name logLevel (messageFunc : MessageThunk) ``exception`` formatParams =
443446
match messageFunc with
444447
| None -> true
@@ -448,26 +451,44 @@ module Providers =
448451
| Some color -> color
449452
| None -> Console.ForegroundColor
450453
let formattedMsg =
451-
let msg = String.Format(CultureInfo.InvariantCulture, m (), formatParams)
454+
let mutable msg = m ()
455+
456+
// have to do name replacements first
457+
for (propertyName, propertyValue) in (Seq.rev propertyStack) do
458+
let name = sprintf "{%s}" propertyName
459+
let value = sprintf "%A" propertyValue
460+
msg <- msg.Replace(name, value)
461+
462+
// then c# numeric replacements
463+
let msg = String.Format(CultureInfo.InvariantCulture, msg , formatParams)
464+
465+
// then exception
452466
let msg =
453467
match ``exception`` with
454468
| Some (e : exn) ->
455469
String.Format("{0} | {1}", msg, e.ToString())
456470
| None ->
457471
msg
472+
473+
// stitch it all together
458474
String.Format("{0} | {1} | {2} | {3}", DateTime.UtcNow, logLevel, name, msg)
459475

460476
threadSafeWriter.Post(color, formattedMsg)
461477
true
462478

479+
let addProp key value =
480+
propertyStack.Push(key, value)
481+
{ new IDisposable with
482+
member __.Dispose () = propertyStack.Pop () |> ignore }
483+
463484
interface ILogProvider with
464485

465486
member this.GetLogger(name: string): Logger =
466487
writeMessage name
467-
member this.OpenMappedContext(arg1: string) (arg2: obj) (arg3: bool): System.IDisposable =
468-
failwith "Not Implemented"
469-
member this.OpenNestedContext(arg1: string): System.IDisposable =
470-
failwith "Not Implemented"
488+
member this.OpenMappedContext(key: string) (value: obj) (destructure: bool): System.IDisposable =
489+
addProp key value
490+
member this.OpenNestedContext(message: string): System.IDisposable =
491+
addProp "NDC" message
471492

472493
let create () =
473494
ConsoleProvider () :> ILogProvider

0 commit comments

Comments
 (0)