- let extractNumberFromLogfilepath (path : string) : int option =
- 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
- | (true, n) -> Some n
- | _ -> None
-
- let [<Literal>] MAX_SIZE_FILE = 52428800L // [byte] (50 MB).
- let [<Literal>] NB_ENTRIES_CHECK_SIZE = 100; // Each 100 entries added we check the size of the log file to test if it is greater than 'MAX_SIZE_FILE'.
- 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 compress (filename : string) =
- 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)
-
- let moduleName = System.Diagnostics.StackFrame(1).GetMethod().Module.Name
-
- let mutable stream : StreamWriter = null
- let mutable filename : string = null
-
- let mutable logDir : string = null
-
- let monitor = Object()
-
- let listeners = List<IListener>()
-
- let debug =
-#if DEBUG
- true
-#else
- false
-#endif
-
- static let instance = new Log()
-
- let openLogFile (entryNumber : int64) =
- if not (isNull logDir) then
- try
- if isNull stream || (entryNumber % (int64 NB_ENTRIES_CHECK_SIZE) = 0L) && stream.BaseStream.Length > MAX_SIZE_FILE
- then
- if not (isNull stream)
- then
- stream.Close()
- if COMPRESS_ARCHIVED_FILES then
- compress filename
- File.Delete(filename)
-
- // Search the last id among the log files.
- let mutable n = 1
- 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))
- try
- if File.Exists(filename + COMPRESSED_FILE_POSTFIX) || FileInfo(filename).Length > MAX_SIZE_FILE
- then
- filename <- Path.Combine(logDir, String.Format(FILENAME_FORMAT, n + 1))
- with
- | :? FileNotFoundException -> () // The file may not exist.
-
- stream <- new StreamWriter(filename, true, encoding)
- with
- | ex -> Console.Error.WriteLine("Can't open the file log: {0}", ex)
-
- let write (msg : Message) (entryNumber : int64) =
- openLogFile entryNumber
-
- let header =
- String.Format(
- "{0:yyyy-MM-dd HH:mm:ss.fff} [{1}] {{{2}}} ({3})",
- 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)