Skip to content

Instantly share code, notes, and snippets.

@nodakai
Created May 16, 2022 14:28
Show Gist options
  • Save nodakai/70dd6f915ba14f36c122f601732af1c1 to your computer and use it in GitHub Desktop.
Save nodakai/70dd6f915ba14f36c122f601732af1c1 to your computer and use it in GitHub Desktop.
module Logger =
open System
open System.IO
open System.Text
type LogLevel = TRACE | DEBUG | INFO
type Logger0(writer: TextWriter) =
member x.Log (fmt: PrintfFormat<'Printer, _, _, _>): 'Printer =
Printf.fprintfn writer fmt
type LevelLogger0(writer: TextWriter, level: LogLevel) =
inherit Logger0(writer)
member x.Info (fmt: PrintfFormat<'Printer, _, _, _>): 'Printer =
if level <= LogLevel.INFO then
x.Log fmt
member x.Debug (fmt: PrintfFormat<'Printer, _, _, _>): 'Printer =
if level <= LogLevel.DEBUG then
x.Log fmt
type Logger1(writer: TextWriter) =
member x.Log tw (fmt: PrintfFormat<'Printer, _, _, _>): 'Printer =
Printf.fprintfn tw fmt
type LevelLogger1(writer: TextWriter, level: LogLevel) =
inherit Logger1(writer)
let getTw(threshold: LogLevel) =
if level <= threshold then writer else TextWriter.Null
member x.Info (fmt: PrintfFormat<'Printer, _, _, _>): 'Printer =
x.Log (getTw LogLevel.INFO) fmt
member x.Debug (fmt: PrintfFormat<'Printer, _, _, _>): 'Printer =
x.Log (getTw LogLevel.DEBUG) fmt
type Logger2() =
member val StringBuilder = StringBuilder()
member x.Log k (fmt: PrintfFormat<'Printer, _, _, _>): 'Printer =
Printf.kbprintf k (x.StringBuilder.Clear()) fmt
type LevelLogger2(writer: TextWriter, level: LogLevel) as x =
inherit Logger2()
let action(threshold: LogLevel) () =
if level <= threshold then writer.WriteLine(x.StringBuilder)
member x.Info (fmt: PrintfFormat<'Printer, _, _, _>): 'Printer =
x.Log (action LogLevel.INFO) fmt
member x.Debug (fmt: PrintfFormat<'Printer, _, _, _>): 'Printer =
x.Log (action LogLevel.DEBUG) fmt
module App =
open System
(*
let main0 args =
let logger = Logger.LevelLogger0(Console.Out, Logger.INFO)
logger.Debug "launch at %A" DateTime.UtcNow
logger.Info "hello with args %A" args
logger.Debug "shutdown at %A" DateTime.UtcNow
0 *)
let main1 args =
let logger = Logger.LevelLogger1(Console.Out, Logger.INFO)
logger.Debug "launch at %A" DateTime.UtcNow
logger.Info "hello with args %A" args
logger.Debug "shutdown at %A" DateTime.UtcNow
0
let main2 args =
let logger = Logger.LevelLogger2(Console.Out, Logger.INFO)
logger.Debug "launch at %A" DateTime.UtcNow
logger.Info "hello with args %A" args
logger.Debug "shutdown at %A" DateTime.UtcNow
0
[<EntryPoint>]
let main args = App.main1 args
{
"version": 1,
"target": "Run",
"mode": "Release",
"branch": "core-x64"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment