ElasticSearchLoggingWriter.cs 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // 大名科技(天津)有限公司版权所有 电话:18020030720 QQ:515096995
  2. //
  3. // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
  4. using Nest;
  5. namespace Admin.NET.Core;
  6. /// <summary>
  7. /// ES日志写入器
  8. /// </summary>
  9. public class ElasticSearchLoggingWriter : IDatabaseLoggingWriter
  10. {
  11. private readonly ElasticClient _esClient;
  12. private readonly SysConfigService _sysConfigService;
  13. public ElasticSearchLoggingWriter(ElasticClient esClient, SysConfigService sysConfigService)
  14. {
  15. _esClient = esClient;
  16. _sysConfigService = sysConfigService;
  17. }
  18. public async void Write(LogMessage logMsg, bool flush)
  19. {
  20. // 是否启用操作日志
  21. var sysOpLogEnabled = await _sysConfigService.GetConfigValue<bool>(CommonConst.SysOpLog);
  22. if (!sysOpLogEnabled) return;
  23. var jsonStr = logMsg.Context.Get("loggingMonitor").ToString();
  24. var loggingMonitor = JSON.Deserialize<dynamic>(jsonStr);
  25. // 不记录登录登出日志
  26. if (loggingMonitor.actionName == "userInfo" || loggingMonitor.actionName == "logout")
  27. return;
  28. #region 处理操作日志
  29. // 获取当前操作者
  30. string account = "", realName = "", userId = "", tenantId = "";
  31. if (loggingMonitor.authorizationClaims != null)
  32. {
  33. foreach (var item in loggingMonitor.authorizationClaims)
  34. {
  35. if (item.type == ClaimConst.Account)
  36. account = item.value;
  37. if (item.type == ClaimConst.RealName)
  38. realName = item.value;
  39. if (item.type == ClaimConst.TenantId)
  40. tenantId = item.value;
  41. if (item.type == ClaimConst.UserId)
  42. userId = item.value;
  43. }
  44. }
  45. string remoteIPv4 = loggingMonitor.remoteIPv4;
  46. (string ipLocation, double? longitude, double? latitude) = DatabaseLoggingWriter.GetIpAddress(remoteIPv4);
  47. //var client = Parser.GetDefault().Parse(loggingMonitor.userAgent.ToString());
  48. //var browser = $"{client.UA.Family} {client.UA.Major}.{client.UA.Minor} / {client.Device.Family}";
  49. //var os = $"{client.OS.Family} {client.OS.Major} {client.OS.Minor}";
  50. var sysLogOp = new SysLogOp
  51. {
  52. Id = DateTime.Now.Ticks,
  53. ControllerName = loggingMonitor.controllerName,
  54. ActionName = loggingMonitor.actionTypeName,
  55. DisplayTitle = loggingMonitor.displayTitle,
  56. Status = loggingMonitor.returnInformation.httpStatusCode,
  57. RemoteIp = remoteIPv4,
  58. Location = ipLocation,
  59. Longitude = longitude,
  60. Latitude = latitude,
  61. Browser = loggingMonitor.userAgent,
  62. Os = loggingMonitor.osDescription + " " + loggingMonitor.osArchitecture,
  63. Elapsed = loggingMonitor.timeOperationElapsedMilliseconds,
  64. LogDateTime = logMsg.LogDateTime,
  65. Account = account,
  66. RealName = realName,
  67. HttpMethod = loggingMonitor.httpMethod,
  68. RequestUrl = loggingMonitor.requestUrl,
  69. RequestParam = (loggingMonitor.parameters == null || loggingMonitor.parameters.Count == 0) ? null : JSON.Serialize(loggingMonitor.parameters[0].value),
  70. ReturnResult = JSON.Serialize(loggingMonitor.returnInformation),
  71. EventId = logMsg.EventId.Id,
  72. ThreadId = logMsg.ThreadId,
  73. TraceId = logMsg.TraceId,
  74. Exception = (loggingMonitor.exception == null) ? null : JSON.Serialize(loggingMonitor.exception),
  75. Message = logMsg.Message,
  76. CreateUserId = string.IsNullOrWhiteSpace(userId) ? 0 : long.Parse(userId),
  77. TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : long.Parse(tenantId)
  78. };
  79. #endregion 处理操作日志
  80. await _esClient.IndexDocumentAsync(sysLogOp);
  81. }
  82. }