ToB企服应用市场:ToB评测及商务社交产业平台

标题: c# 实现一个简朴的非常日志记录(非常迭代+分片+定时清理)+AOP Rougamo全 [打印本页]

作者: 泉缘泉    时间: 2024-12-25 22:23
标题: c# 实现一个简朴的非常日志记录(非常迭代+分片+定时清理)+AOP Rougamo全
1. 日志目录和文件管理


2. 非常日志记录


3. 日志条目天生


4. 旧日志文件清理


5. 非常处置处罚


  1. using System.IO;
  2. using System.Text;
  3. using System.Text.RegularExpressions;
  4. using System.Windows;
  5. using System.Windows.Shapes;
  6. namespace DataParser.Helpers;
  7. public class LogHelper
  8. {
  9.     private static readonly object objException = new object();
  10.     private static readonly string logDirectory = "./Exceptions";
  11.     private static string curfileName = $"{DateTime.Now:yyyy_MM_dd}.log";
  12.     private static readonly int maxLogFileAgeDays = 1;
  13.     private static readonly long maxFileSizeBytes = 3*1024;
  14.     private static readonly Encoding encoding =Encoding.UTF8;
  15.     static int cnt= 0;
  16.     public static void WriteExceptionLog(Exception ex)
  17.     {
  18.         try
  19.         {
  20.             lock (objException)
  21.             {
  22.                 if (!Directory.Exists(logDirectory))
  23.                 {
  24.                     Directory.CreateDirectory(logDirectory);
  25.                 }
  26.                 var files = Directory.GetFiles(logDirectory, "*.log")
  27.                     .Select(x=>System.IO.Path.GetFileName(x))
  28.                     .Where(x => x.Contains($"{DateTime.Now:yyyy_MM_dd}"));
  29.                 if(files.Count()>0)
  30.                 {
  31.                     var tmp = files.OrderBy(x => x.Length);
  32.                     curfileName = tmp.Last();
  33.                     if (curfileName.Contains("_P"))
  34.                     {
  35.                         Match match = Regex.Match(curfileName, @"_P(\d+)");
  36.                         if (match.Success)
  37.                         {
  38.                             string str = match.Groups[1].Value;
  39.                             int.TryParse(str, out cnt);
  40.                         }
  41.                     }
  42.                 }
  43.                 else
  44.                 {
  45.                     curfileName = $"{DateTime.Now:yyyy_MM_dd}.log";
  46.                 }
  47.                 string fileName = System.IO.Path.Combine(logDirectory, curfileName);
  48.                 string logEntry = GetLogEntry(ex);
  49.                 if (File.Exists(fileName) && (new FileInfo(fileName).Length > maxFileSizeBytes))
  50.                 {
  51.                     cnt++;
  52.                     fileName = System.IO.Path.Combine(logDirectory, $"{DateTime.Now:yyyy_MM_dd}_P{cnt}.log");
  53.                 }
  54.                 else if(!fileName.Contains("_P"))
  55.                 {
  56.                     cnt = 0;
  57.                 }
  58.                 File.AppendAllText(fileName, logEntry, encoding);
  59.                 CleanupOldLogFiles();
  60.             }
  61.         }
  62.         catch (Exception innerEx)
  63.         {
  64.         }
  65.     }
  66.     private static string GetLogEntry(Exception ex, int depth = 0)
  67.     {
  68.         string indent = new string(' ', depth * 4);
  69.         string logEntry =
  70.             $"{indent}【异常时间】{DateTime.Now}{Environment.NewLine}" +
  71.             $"{indent}【异常信息】{ex.Message}{Environment.NewLine}" +
  72.             $"{indent}【异常对象】{ex.Source}{Environment.NewLine}" +
  73.             $"{indent}【调用堆栈】{Environment.NewLine}   {ex.StackTrace?.Trim() ?? "N/A"}{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}";
  74.         if (ex.InnerException != null)
  75.         {
  76.             logEntry += GetLogEntry(ex.InnerException, depth + 1);
  77.         }
  78.         return logEntry;
  79.     }
  80.     private static void CleanupOldLogFiles()
  81.     {
  82.         var files = Directory.GetFiles(logDirectory, "*.log")
  83.                 .Select(f => new FileInfo(f))
  84.                 .Where(f => (DateTime.Now - f.LastWriteTime).TotalDays > maxLogFileAgeDays);
  85.         foreach (var file in files)
  86.         {
  87.             File.Delete(file.FullName);
  88.         }
  89.     }
  90. }
复制代码
Rougamo 实现AOP

导包Rougamo.Fody
  1. using DataParser.Helpers;
  2. using Rougamo;
  3. using Rougamo.Context;
  4. namespace DataParser
  5. {
  6.     public class ExceptionLogAttribute : MoAttribute
  7.     {
  8.         public override void OnException(MethodContext context)
  9.         {
  10.             LogHelper.WriteExceptionLog(context.Exception);
  11.             context.HandledException(this, null);
  12.         }
  13.     }
  14. }
复制代码
  1.     public partial class MainViewModel:IRougamo<ExceptionLogAttribute>
  2.     {}
复制代码
MainViewModel 类实现了接口 IRougamo<ExceptionLogAttribute>。这意味着在这个类中,全部被 ExceptionLogAttribute 特性标记的方法或类,都会在抛出非常时自动调用 ExceptionLogAttribute 的 OnException 方法

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4