RequestLogger.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using LJLib.Tools.File;
  2. using System;
  3. using System.IO;
  4. namespace LJLib.TextLog
  5. {
  6. internal class RequestLogger : ILogger
  7. {
  8. private readonly string _logDir;
  9. private readonly object _syncRoot = new object();
  10. public RequestLogger(string logDir = null)
  11. {
  12. // 默认目录为执行目录下的 log 文件夹
  13. _logDir = logDir ?? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log");
  14. if (!Directory.Exists(_logDir))
  15. Directory.CreateDirectory(_logDir);
  16. }
  17. /// <summary>
  18. /// 获取今天的日志文件全路径
  19. /// </summary>
  20. private string GetTodayLogFile()
  21. {
  22. string fileName = $"REQUEST_{DateTime.Now:yyyyMMdd}.log";
  23. return Path.Combine(_logDir, fileName);
  24. }
  25. /// <summary>
  26. /// 写入日志
  27. /// </summary>
  28. public void WriteLog(string msg)
  29. {
  30. try
  31. {
  32. lock (_syncRoot)
  33. {
  34. string filePath = GetTodayLogFile();
  35. using (StreamWriter sw = new StreamWriter(filePath, true))
  36. {
  37. sw.WriteLine("====================================================================");
  38. sw.WriteLine($"时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
  39. sw.WriteLine("--------------------------------------------------------------------");
  40. sw.WriteLine(msg);
  41. sw.WriteLine("====================================================================");
  42. sw.WriteLine();
  43. }
  44. // 清理过期日志(7天前的删除)
  45. CleanupOldLogs();
  46. }
  47. }
  48. catch
  49. {
  50. // 这里可考虑写到系统事件日志或忽略
  51. }
  52. }
  53. /// <summary>
  54. /// 清理7天前的日志文件
  55. /// </summary>
  56. private void CleanupOldLogs()
  57. {
  58. try
  59. {
  60. var files = Directory.GetFiles(_logDir, "REQUEST_*.log");
  61. DateTime threshold = DateTime.Now.AddDays(-7);
  62. foreach (var file in files)
  63. {
  64. string fileName = Path.GetFileNameWithoutExtension(file);
  65. // 格式: REQUEST_yyyyMMdd
  66. if (fileName.Length == "REQUEST_yyyyMMdd".Length &&
  67. DateTime.TryParseExact(fileName.Replace("REQUEST_", ""),
  68. "yyyyMMdd",
  69. null,
  70. System.Globalization.DateTimeStyles.None,
  71. out DateTime logDate))
  72. {
  73. if (logDate < threshold.Date)
  74. {
  75. File.Delete(file);
  76. }
  77. }
  78. }
  79. }
  80. catch
  81. {
  82. // 忽略清理异常
  83. }
  84. }
  85. }
  86. }