if isNull path then
None
else
- let filename = path.Substring(path.LastIndexOf(Path.DirectorySeparatorChar) + 1)
- let filenameWithoutExtension = filename.Remove(filename.IndexOf('.'))
- match Int32.TryParse(filenameWithoutExtension) with
+ let filename = path.Substring (path.LastIndexOf Path.DirectorySeparatorChar + 1)
+ let filenameWithoutExtension = filename.Remove (filename.IndexOf '.')
+ match Int32.TryParse filenameWithoutExtension with
| (true, n) -> Some n
| _ -> None
let [<Literal>] COMPRESS_ARCHIVED_FILES = true
let [<Literal>] FILENAME_FORMAT = "{0:D4}.log"
let [<Literal>] COMPRESSED_FILE_POSTFIX = ".gzip"
- let encoding = Encoding.GetEncoding("UTF-8")
+ let encoding = Encoding.GetEncoding "UTF-8"
let compress (filename : string) =
- use inputStream = new FileStream(filename, FileMode.Open, FileAccess.Read)
+ use inputStream = new FileStream (filename, FileMode.Open, FileAccess.Read)
let filenameCompressed = filename + COMPRESSED_FILE_POSTFIX
- use compressedStream = new GZipStream(new FileStream(filenameCompressed, FileMode.Create, FileAccess.Write), CompressionLevel.Optimal)
- inputStream.CopyTo(compressedStream)
+ use compressedStream = new GZipStream (new FileStream (filenameCompressed, FileMode.Create, FileAccess.Write), CompressionLevel.Optimal)
+ inputStream.CopyTo compressedStream
let moduleName = System.Diagnostics.StackFrame(1).GetMethod().Module.Name
let mutable logDir : string = null
- let monitor = Object()
+ let monitor = Object ()
- let listeners = List<IListener>()
+ let listeners = List<IListener> ()
let debug =
#if DEBUG
false
#endif
- static let instance = new Log()
+ static let instance = new Log ()
let openLogFile (entryNumber : int64) =
if not (isNull logDir) then
then
if not (isNull stream)
then
- stream.Close()
+ stream.Close ()
if COMPRESS_ARCHIVED_FILES then
compress filename
- File.Delete(filename)
+ File.Delete filename
// Search the last id among the log files.
let mutable n = 1
- for existingFile in Directory.GetFiles(logDir) do
+ for existingFile in Directory.GetFiles logDir do
match extractNumberFromLogfilepath existingFile with
| Some n' when n' > n -> n <- n'
| _ -> ()
- filename <- Path.Combine(logDir, String.Format(FILENAME_FORMAT, n))
+ filename <- Path.Combine (logDir, String.Format (FILENAME_FORMAT, n))
try
- if File.Exists(filename + COMPRESSED_FILE_POSTFIX) || FileInfo(filename).Length > MAX_SIZE_FILE
+ if File.Exists (filename + COMPRESSED_FILE_POSTFIX) || FileInfo(filename).Length > MAX_SIZE_FILE
then
- filename <- Path.Combine(logDir, String.Format(FILENAME_FORMAT, n + 1))
+ filename <- Path.Combine (logDir, String.Format (FILENAME_FORMAT, n + 1))
with
| :? FileNotFoundException -> () // The file may not exist.
- stream <- new StreamWriter(filename, true, encoding)
+ stream <- new StreamWriter (filename, true, encoding)
with
- | ex -> Console.Error.WriteLine("Can't open the file log: {0}", ex)
+ | ex -> Console.Error.WriteLine ("Can't open the file log: {0}", ex)
let write (msg : Message) (entryNumber : int64) =
openLogFile entryNumber
let header =
- String.Format(
+ String.Format (
"{0:yyyy-MM-dd HH:mm:ss.fff} [{1}] {{{2}}} ({3})",
- TimeZone.CurrentTimeZone.ToLocalTime(DateTime.UtcNow),
+ TimeZone.CurrentTimeZone.ToLocalTime DateTime.UtcNow,
string msg.Severity,
msg.ModuleCaller,
- (if String.IsNullOrEmpty(msg.ThreadName) then string msg.ThreadId else sprintf "%s-%i" msg.ThreadName msg.ThreadId)
+ (if String.IsNullOrEmpty msg.ThreadName then string msg.ThreadId else sprintf "%s-%i" msg.ThreadName msg.ThreadId)
)
for listener in listeners do
if not (isNull stream)
then
try
- stream.WriteLine("{0} : {1}", header, msg.Message)
- stream.Flush()
+ stream.WriteLine ("{0} : {1}", header, msg.Message)
+ stream.Flush ()
with
- | :? IOException as ex -> Console.Error.WriteLine("Unable to write to the log file: {0}", ex)
+ | :? IOException as ex -> Console.Error.WriteLine ("Unable to write to the log file: {0}", ex)
let writeAgent =
- new MailboxProcessor<Command>(
+ new MailboxProcessor<Command> (
fun inbox ->
let rec loop (nbEntries : int64) =
async {
- let! command = inbox.Receive()
+ let! command = inbox.Receive ()
match command with
| Write message ->
write message nbEntries
)
do
- writeAgent.Start()
+ writeAgent.Start ()
let setLogDirectory (dir : string) =
- lock monitor (fun () ->
- logDir <- dir
+ lock monitor (
+ fun () ->
+ logDir <- dir
- if not <| isNull stream then
- stream.Close()
- stream <- null
+ if not <| isNull stream then
+ stream.Close ()
+ stream <- null
- try
- if not <| Directory.Exists(logDir)
- then
- Directory.CreateDirectory(logDir) |> ignore
- with
- | _ -> Console.Error.WriteLine("Unable to create the log directory: {0}", logDir))
+ try
+ if not <| Directory.Exists logDir
+ then
+ Directory.CreateDirectory logDir |> ignore
+ with
+ | _ -> Console.Error.WriteLine ("Unable to create the log directory: {0}", logDir)
+ )
interface IDisposable with
member this.Dispose () =
if not (isNull stream)
then
- stream.Dispose()
- (writeAgent :> IDisposable).Dispose()
+ stream.Dispose ()
+ (writeAgent :> IDisposable).Dispose ()
member private this.Write (message : string) (severity : Severity) =
let moduleNameCaller =
/// Will stop and wait a reply. Used to flush the remaining messages.
/// </summary>
member private this.Stop () =
- writeAgent.PostAndReply(
+ writeAgent.PostAndReply (
fun replyChannel ->
Stop replyChannel
)
instance.LogDirectory <- dir
member this.AddListener (listener : IListener) =
- lock monitor (fun () ->
- if not <| listeners.Contains(listener)
- then
- listeners.Add(listener))
+ lock monitor (
+ fun () ->
+ if not <| listeners.Contains listener
+ then
+ listeners.Add listener
+ )
member this.RmListener (listener : IListener) =
- lock monitor (fun () ->
- listeners.Remove(listener) |> ignore)
+ 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 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()
+ let sw = Stopwatch ()
+ sw.Start ()
let res = f ()
- sw.Stop()
+ sw.Stop ()
Printf.kprintf (fun s -> instance.Write (s + sprintf " (time: %d ms)" sw.ElapsedMilliseconds) severity; res) format
static member Debug format =
Printf.kprintf (fun s -> instance.Write s Severity.FATAL) format
static member Shutdown () =
- instance.Stop()
+ instance.Stop ()