SerilogHelper.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using Serilog;
  2. using Serilog.Core;
  3. using Serilog.Events;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Diagnostics;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace Ips.Library.Basic
  11. {
  12. public static class SerilogHelper
  13. {
  14. public static void BuildLogger(bool usePID)
  15. {
  16. string outputTemplate;
  17. if (usePID)
  18. outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}[线程={ThreadId}][PID={PID}][{Level:u3}]{Message:lj}{NewLine}\t{Exception}";
  19. else
  20. outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}[线程={ThreadId}][{Level:u3}]{Message:lj}{NewLine}\t{Exception}";
  21. Serilog.Log.Logger = new Serilog.LoggerConfiguration()
  22. .Enrich.FromLogContext()
  23. .Enrich.With(new SerilogEnricher(usePID))
  24. .WriteTo.Console(outputTemplate: outputTemplate)
  25. .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Information)
  26. .WriteTo.File("Logs\\Info\\.log", rollingInterval: Serilog.RollingInterval.Day, outputTemplate: outputTemplate))
  27. .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Warning)
  28. .WriteTo.File("Logs\\Warning\\.log", rollingInterval: Serilog.RollingInterval.Day, outputTemplate: outputTemplate))
  29. .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Error)
  30. .WriteTo.File("Logs\\Error\\.log", rollingInterval: Serilog.RollingInterval.Day, outputTemplate: outputTemplate))
  31. .CreateLogger();
  32. }
  33. }
  34. /// <summary>
  35. /// Serilog日志添加线程ID
  36. /// </summary>
  37. public class SerilogEnricher : ILogEventEnricher
  38. {
  39. private bool useProcessId;
  40. private string PID;
  41. public SerilogEnricher(bool useProcessId = false)
  42. {
  43. this.useProcessId = useProcessId;
  44. if (useProcessId)
  45. {
  46. this.PID = Process.GetCurrentProcess().Id.ToString("D5");
  47. }
  48. }
  49. /// <summary>
  50. /// 在日志中添加线程ID
  51. /// </summary>
  52. /// <param name="logEvent"></param>
  53. /// <param name="propertyFactory"></param>
  54. public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
  55. {
  56. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty(
  57. "ThreadId", Thread.CurrentThread.ManagedThreadId.ToString("D3")));
  58. if (useProcessId)
  59. {
  60. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("PID", PID));
  61. }
  62. }
  63. }
  64. }