Skip to content

Commit 06ee012

Browse files
authored
Merge pull request #10 from TheAngryByrd/remove-ConsoleProvider
Remove ConsoleProvider from main code
2 parents 4a41f27 + 3d43d4b commit 06ee012

File tree

2 files changed

+90
-91
lines changed

2 files changed

+90
-91
lines changed

examples/ConsoleExample/Program.fs

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,97 @@
11
open System
2+
open FsLibLog
3+
4+
/// WARN: This does not provide support for [MessageTemplates](https://messagetemplates.org/) so this will fail for message formats intended for structured logging. This is only used for simple display implementations purposes only.
5+
module ConsoleProvider =
6+
open System
7+
open System.Globalization
8+
9+
let isAvailable () = true
10+
11+
type private ConsoleProvider () =
12+
let propertyStack = System.Collections.Generic.Stack<string * obj>()
13+
14+
let threadSafeWriter = MailboxProcessor.Start(fun inbox ->
15+
let rec loop () = async {
16+
let! (consoleColor, message : string) = inbox.Receive()
17+
let originalForground = Console.ForegroundColor
18+
try
19+
Console.ForegroundColor <- consoleColor
20+
do! Console.Out.WriteLineAsync(message) |> Async.AwaitTask
21+
finally
22+
Console.ForegroundColor <- originalForground
23+
return! loop ()
24+
}
25+
loop ()
26+
)
27+
let levelToColor =
28+
Map([
29+
(LogLevel.Fatal, ConsoleColor.DarkRed)
30+
(LogLevel.Error, ConsoleColor.Red)
31+
(LogLevel.Warn, ConsoleColor.Yellow)
32+
(LogLevel.Info, ConsoleColor.White)
33+
(LogLevel.Debug, ConsoleColor.Gray)
34+
(LogLevel.Trace, ConsoleColor.DarkGray)
35+
])
36+
37+
let writeMessage name logLevel (messageFunc : MessageThunk) ``exception`` formatParams =
38+
match messageFunc with
39+
| None -> true
40+
| Some m ->
41+
let color =
42+
match levelToColor |> Map.tryFind(logLevel) with
43+
| Some color -> color
44+
| None -> Console.ForegroundColor
45+
let formattedMsg =
46+
let mutable msg = m ()
47+
48+
// have to do name replacements first
49+
for (propertyName, propertyValue) in (Seq.rev propertyStack) do
50+
let name = sprintf "{%s}" propertyName
51+
let value = sprintf "%A" propertyValue
52+
msg <- msg.Replace(name, value)
53+
54+
// it's possible for msg at this point to have what looks like format
55+
// specifiers, which will cause String.Format to puke
56+
let msg = msg.Replace("{", "{{").Replace("}", "}}")
57+
58+
// then c# numeric replacements
59+
let msg = String.Format(CultureInfo.InvariantCulture, msg , formatParams)
60+
61+
// then exception
62+
let msg =
63+
match ``exception`` with
64+
| Some (e : exn) ->
65+
String.Format("{0} | {1}", msg, e.ToString())
66+
| None ->
67+
msg
68+
69+
// stitch it all together
70+
String.Format("{0} | {1} | {2} | {3}", DateTime.UtcNow, logLevel, name, msg)
71+
72+
threadSafeWriter.Post(color, formattedMsg)
73+
true
74+
75+
let addProp key value =
76+
propertyStack.Push(key, value)
77+
{ new IDisposable with
78+
member __.Dispose () = propertyStack.Pop () |> ignore }
79+
80+
interface ILogProvider with
81+
82+
member this.GetLogger(name: string): Logger =
83+
writeMessage name
84+
member this.OpenMappedContext(key: string) (value: obj) (destructure: bool): System.IDisposable =
85+
addProp key value
86+
member this.OpenNestedContext(message: string): System.IDisposable =
87+
addProp "NDC" message
88+
89+
let create () =
90+
ConsoleProvider () :> ILogProvider
291

392
[<EntryPoint>]
493
let main argv =
5-
FsLibLog.LogProvider.setLoggerProvider <| FsLibLog.Providers.ConsoleProvider.create()
94+
FsLibLog.LogProvider.setLoggerProvider <| ConsoleProvider.create()
695
SomeLib.Say.hello "Whatup" |> printfn "%s"
796
Console.ReadLine() |> ignore
897
0

src/FsLibLog/FsLibLog.fs

Lines changed: 0 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -408,95 +408,6 @@ module Types =
408408
let setLogLevel (logLevel : LogLevel) (log : Log) =
409409
{ log with LogLevel = logLevel}
410410
module Providers =
411-
412-
/// WARN: This does not provide support for [MessageTemplates](https://messagetemplates.org/) so this will fail for message formats intended for structured logging. This is only used for simple display implementations purposes only.
413-
module ConsoleProvider =
414-
open System
415-
open System.Globalization
416-
417-
let isAvailable () = true
418-
419-
type private ConsoleProvider () =
420-
let propertyStack = System.Collections.Generic.Stack<string * obj>()
421-
422-
let threadSafeWriter = MailboxProcessor.Start(fun inbox ->
423-
let rec loop () = async {
424-
let! (consoleColor, message : string) = inbox.Receive()
425-
let originalForground = Console.ForegroundColor
426-
try
427-
Console.ForegroundColor <- consoleColor
428-
do! Console.Out.WriteLineAsync(message) |> Async.AwaitTask
429-
finally
430-
Console.ForegroundColor <- originalForground
431-
return! loop ()
432-
}
433-
loop ()
434-
)
435-
let levelToColor =
436-
Map([
437-
(LogLevel.Fatal, ConsoleColor.DarkRed)
438-
(LogLevel.Error, ConsoleColor.Red)
439-
(LogLevel.Warn, ConsoleColor.Yellow)
440-
(LogLevel.Info, ConsoleColor.White)
441-
(LogLevel.Debug, ConsoleColor.Gray)
442-
(LogLevel.Trace, ConsoleColor.DarkGray)
443-
])
444-
445-
let writeMessage name logLevel (messageFunc : MessageThunk) ``exception`` formatParams =
446-
match messageFunc with
447-
| None -> true
448-
| Some m ->
449-
let color =
450-
match levelToColor |> Map.tryFind(logLevel) with
451-
| Some color -> color
452-
| None -> Console.ForegroundColor
453-
let formattedMsg =
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-
// it's possible for msg at this point to have what looks like format
463-
// specifiers, which will cause String.Format to puke
464-
let msg = msg.Replace("{", "{{").Replace("}", "}}")
465-
466-
// then c# numeric replacements
467-
let msg = String.Format(CultureInfo.InvariantCulture, msg , formatParams)
468-
469-
// then exception
470-
let msg =
471-
match ``exception`` with
472-
| Some (e : exn) ->
473-
String.Format("{0} | {1}", msg, e.ToString())
474-
| None ->
475-
msg
476-
477-
// stitch it all together
478-
String.Format("{0} | {1} | {2} | {3}", DateTime.UtcNow, logLevel, name, msg)
479-
480-
threadSafeWriter.Post(color, formattedMsg)
481-
true
482-
483-
let addProp key value =
484-
propertyStack.Push(key, value)
485-
{ new IDisposable with
486-
member __.Dispose () = propertyStack.Pop () |> ignore }
487-
488-
interface ILogProvider with
489-
490-
member this.GetLogger(name: string): Logger =
491-
writeMessage name
492-
member this.OpenMappedContext(key: string) (value: obj) (destructure: bool): System.IDisposable =
493-
addProp key value
494-
member this.OpenNestedContext(message: string): System.IDisposable =
495-
addProp "NDC" message
496-
497-
let create () =
498-
ConsoleProvider () :> ILogProvider
499-
500411
module SerilogProvider =
501412
open System
502413
open System.Linq.Expressions
@@ -688,7 +599,6 @@ module LogProvider =
688599

689600
let private knownProviders = [
690601
(SerilogProvider.isAvailable , SerilogProvider.create)
691-
// (ConsoleProvider.isAvailable, ConsoleProvider.create)
692602
]
693603

694604
/// Greedy search for first available LogProvider. Order of known providers matters.

0 commit comments

Comments
 (0)