Logger.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. namespace StationProbe
  2. {
  3. internal class Logger
  4. {
  5. private static DateTime _date;
  6. private static StreamWriter? _logWriter;
  7. private static readonly object _logWriterLocker = new();
  8. public static bool ConsoleOutput { get; set; } = true;
  9. static Logger()
  10. {
  11. RebuildLogger();
  12. }
  13. private static void RebuildLogger()
  14. {
  15. var logDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
  16. if (!Directory.Exists(logDirectory))
  17. {
  18. Directory.CreateDirectory(logDirectory);
  19. }
  20. var today = DateTime.Today;
  21. var logTag = $"{today:yyyyMMdd}";
  22. var logFileName = $"log_{logTag}.log";
  23. var logFile = Path.Combine(logDirectory, logFileName);
  24. if (!File.Exists(logFile))
  25. {
  26. _logWriter?.Close();
  27. var logFileStream = new FileStream(logFile, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
  28. _logWriter = new StreamWriter(logFileStream);
  29. }
  30. else
  31. {
  32. _logWriter?.Close();
  33. var logFileStream = new FileStream(logFile, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
  34. logFileStream.Position = logFileStream.Length;
  35. _logWriter = new StreamWriter(logFileStream);
  36. }
  37. }
  38. public static void WriteLine(string log)
  39. {
  40. lock (_logWriterLocker)
  41. {
  42. if (DateTime.Today != _date)
  43. {
  44. RebuildLogger();
  45. _date = DateTime.Today;
  46. }
  47. try
  48. {
  49. var now = DateTime.Now;
  50. var message = $"[{now:HH:mm:ss},{now.Millisecond:d3}]-{log}";
  51. _logWriter?.WriteLine(message);
  52. _logWriter?.Flush();
  53. if (ConsoleOutput)
  54. {
  55. Console.WriteLine(message);
  56. }
  57. }
  58. catch (Exception)
  59. {
  60. // There is exception during writing log, so just ignore
  61. }
  62. }
  63. }
  64. }
  65. }