- member private this.AddListener (listener : IListener) =
- lock monitor (fun () ->
- if not <| listeners.Contains(listener) then
- listeners.Add(listener))
-
- member private this.RmListener (listener : IListener) =
- lock monitor (fun () ->
- listeners.Remove(listener) |> ignore)
-
- static member AddListener (listener : IListener) = instance.AddListener(listener)
- static member RmListener (listener : IListener) = instance.RmListener(listener)
-
- static member LogWithTime (message : string, severity : Severity, f : unit -> 'a option, [<ParamArray>] args: Object[]) : 'a option =
- let sw = Stopwatch()
- sw.Start()
+ interface IDisposable with
+ member this.Dispose () =
+ if not (isNull stream)
+ then
+ stream.Dispose ()
+ (writeAgent :> IDisposable).Dispose ()
+
+ member private this.Write (message : string) (severity : Severity) =
+ let moduleNameCaller =
+ match StackTrace().GetFrames() |> Array.tryPick (fun frame -> let name = frame.GetMethod().Module.Name
+ if name <> moduleName then Some name else None) with
+ | Some name -> name
+ | _ -> moduleName
+
+ let command =
+ Write
+ {
+ Message = message
+ ThreadName = Thread.CurrentThread.Name
+ ThreadId = Thread.CurrentThread.ManagedThreadId
+ ModuleCaller = moduleNameCaller
+ Severity = severity
+ }
+
+ writeAgent.Post command
+
+ /// <summary>
+ /// Will stop and wait a reply. Used to flush the remaining messages.
+ /// </summary>
+ member private this.Stop () =
+ writeAgent.PostAndReply (
+ fun replyChannel ->
+ Stop replyChannel
+ )
+
+ member this.LogDirectory
+ with get () = logDir
+ and set value = setLogDirectory value
+
+ static member SetLogDirectory (dir : string) =
+ instance.LogDirectory <- dir
+
+ member this.AddListener (listener : IListener) =
+ lock monitor (
+ fun () ->
+ if not <| listeners.Contains listener
+ then
+ listeners.Add listener
+ )
+
+ member this.RmListener (listener : IListener) =
+ lock monitor (fun () -> listeners.Remove listener |> ignore)
+
+ static member AddListener (listener : IListener) = instance.AddListener listener
+ static member RmListener (listener : IListener) = instance.RmListener listener
+
+ static member LogWithTime (severity : Severity) (f : unit -> 'a) (format : Printf.StringFormat<'b, 'a>) : 'b =
+ let sw = Stopwatch ()
+ sw.Start ()