-
- member private this.Write (message: string, severity: Severity) =
- lock monitor (fun () ->
- nbEntries <- nbEntries + 1L
- openLogFile ()
-
- if stream <> null
- then
- let mutable moduleNameCaller = moduleName
- match StackTrace().GetFrames() |> Array.tryPick (fun frame -> let name = frame.GetMethod().Module.Name
- if name <> moduleName then Some name else None) with
- | Some name -> moduleNameCaller <- name
- | _ -> ()
-
- let threadName = Thread.CurrentThread.Name
-
- for listener in listeners do
- listener.NewEntry severity message
-
- try
- stream.WriteLine(
- "{0:yyyy-MM-dd HH:mm:ss.fff} [{1}] {{{2}}} ({3}) : {4}",
- TimeZone.CurrentTimeZone.ToLocalTime(DateTime.UtcNow),
- severity.ToString(),
- moduleNameCaller,
- (if String.IsNullOrEmpty(threadName) then Thread.CurrentThread.ManagedThreadId.ToString() else String.Format("{0}-{1}", threadName, Thread.CurrentThread.ManagedThreadId)),
- message
- )
- stream.Flush()
- with
- | :? IOException as ex -> Console.Error.WriteLine("Unable to write to the log file: {0}", ex))
-
-
- member private this.AddListener (listener: IListener) =
+ (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) =