DailyRollingFileAppender.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using log4net.Appender;
  5. using log4net.Util;
  6. namespace LotteryWebApp.Common
  7. {
  8. /// <summary>
  9. /// RollingFileAppender ghi log mỗi ngày 1 file (rolling theo ngày) và chỉ giữ lại
  10. /// N file log gần nhất — các file cũ hơn sẽ tự động bị xóa để tránh đầy ổ cứng.
  11. /// Toàn bộ cấu hình nằm trong log4net.config, không cần task bên ngoài.
  12. /// </summary>
  13. public class DailyRollingFileAppender : RollingFileAppender
  14. {
  15. /// <summary>
  16. /// Số file log tối đa được giữ lại. Cấu hình qua &lt;maxNumberOfFiles value="30" /&gt;
  17. /// trong log4net.config. Mặc định 30. Đặt &lt;= 0 để tắt việc tự xóa.
  18. /// </summary>
  19. public int MaxNumberOfFiles { get; set; } = 30;
  20. // Chỉ dọn log 1 lần mỗi ngày để không ảnh hưởng hiệu năng ghi log.
  21. private DateTime _lastCleanupDate = DateTime.MinValue;
  22. private readonly object _cleanupLock = new object();
  23. protected override void AdjustFileBeforeAppend()
  24. {
  25. // Để log4net xử lý việc cuộn file theo ngày trước.
  26. base.AdjustFileBeforeAppend();
  27. if (_lastCleanupDate == DateTime.Today)
  28. return;
  29. lock (_cleanupLock)
  30. {
  31. if (_lastCleanupDate == DateTime.Today)
  32. return;
  33. _lastCleanupDate = DateTime.Today;
  34. }
  35. CleanupOldFiles();
  36. }
  37. /// <summary>Giữ lại MaxNumberOfFiles file .log mới nhất, xóa phần còn lại.</summary>
  38. private void CleanupOldFiles()
  39. {
  40. try
  41. {
  42. if (MaxNumberOfFiles <= 0)
  43. return;
  44. string dir = Path.GetDirectoryName(File);
  45. if (string.IsNullOrEmpty(dir) || !Directory.Exists(dir))
  46. return;
  47. var oldFiles = new DirectoryInfo(dir)
  48. .GetFiles("*.log")
  49. .OrderByDescending(f => f.LastWriteTimeUtc)
  50. .Skip(MaxNumberOfFiles)
  51. .ToList();
  52. foreach (FileInfo file in oldFiles)
  53. {
  54. try
  55. {
  56. file.Delete();
  57. LogLog.Debug(GetType(), "Da xoa file log cu: " + file.Name);
  58. }
  59. catch (Exception ex)
  60. {
  61. LogLog.Warn(GetType(), "Khong xoa duoc file log: " + file.FullName, ex);
  62. }
  63. }
  64. }
  65. catch (Exception ex)
  66. {
  67. LogLog.Error(GetType(), "Loi khi don dep file log cu", ex);
  68. }
  69. }
  70. }
  71. }