LogHelper.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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;
  10. using System.Threading.Tasks;
  11. namespace XdCxRhDW.Framework
  12. {
  13. public static class LogHelper
  14. {
  15. private static bool _hasBuild = false;
  16. public static void BuildLogger(bool usePID = true)
  17. {
  18. string outputTemplate;
  19. if (usePID)
  20. outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}[线程={ThreadId}][PID={PID}][{Level:u3}]{Message:lj}{NewLine}\t{Exception}";
  21. else
  22. outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}[线程={ThreadId}][{Level:u3}]{Message:lj}{NewLine}\t{Exception}";
  23. Serilog.Log.Logger = new Serilog.LoggerConfiguration()
  24. .Enrich.FromLogContext()
  25. .Enrich.With(new SerilogEnricher(usePID))
  26. .WriteTo.Console(outputTemplate: outputTemplate)
  27. .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Information)
  28. .WriteTo.File("Logs\\Info\\.log", rollingInterval: Serilog.RollingInterval.Day, outputTemplate: outputTemplate))
  29. .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Warning)
  30. .WriteTo.File("Logs\\Warning\\.log", rollingInterval: Serilog.RollingInterval.Day, outputTemplate: outputTemplate))
  31. .WriteTo.Logger(p => p.Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Error)
  32. .WriteTo.File("Logs\\Error\\.log", rollingInterval: Serilog.RollingInterval.Day, outputTemplate: outputTemplate))
  33. .CreateLogger();
  34. _hasBuild = true;
  35. }
  36. public static void Info(string msg)
  37. {
  38. if (!_hasBuild)
  39. BuildLogger();
  40. Serilog.Log.Information(msg);
  41. }
  42. public static void Warning(string msg, Exception ex = null)
  43. {
  44. if (!_hasBuild)
  45. BuildLogger();
  46. Serilog.Log.Warning(ex, msg);
  47. }
  48. public static void Error(string msg, Exception ex = null)
  49. {
  50. if (!_hasBuild)
  51. BuildLogger();
  52. Serilog.Log.Error(ex, msg);
  53. }
  54. }
  55. /// <summary>
  56. /// Serilog日志添加线程ID
  57. /// </summary>
  58. class SerilogEnricher : ILogEventEnricher
  59. {
  60. private bool useProcessId;
  61. private string PID;
  62. public SerilogEnricher(bool useProcessId = false)
  63. {
  64. this.useProcessId = useProcessId;
  65. if (useProcessId)
  66. {
  67. this.PID = Process.GetCurrentProcess().Id.ToString("D5");
  68. }
  69. }
  70. /// <summary>
  71. /// 在日志中添加线程ID
  72. /// </summary>
  73. /// <param name="logEvent"></param>
  74. /// <param name="propertyFactory"></param>
  75. public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
  76. {
  77. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty(
  78. "ThreadId", Thread.CurrentThread.ManagedThreadId.ToString("D3")));
  79. if (useProcessId)
  80. {
  81. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("PID", PID));
  82. }
  83. }
  84. }
  85. }