ElasticSearchLoggingWriter.cs 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证。
  2. //
  3. // 必须在法律法规允许的范围内正确使用,严禁将其用于非法、欺诈、恶意或侵犯他人合法权益的目的。
  4. using Nest;
  5. namespace Admin.NET.Core;
  6. /// <summary>
  7. /// ES日志写入器
  8. /// </summary>
  9. public class ElasticSearchLoggingWriter : IDatabaseLoggingWriter, IDisposable
  10. {
  11. private readonly IServiceScope _serviceScope;
  12. private readonly ElasticClient _esClient;
  13. private readonly SysConfigService _sysConfigService;
  14. public ElasticSearchLoggingWriter(IServiceScopeFactory scopeFactory)
  15. {
  16. _serviceScope = scopeFactory.CreateScope();
  17. _esClient = _serviceScope.ServiceProvider.GetRequiredService<ElasticClient>();
  18. _sysConfigService = _serviceScope.ServiceProvider.GetRequiredService<SysConfigService>();
  19. }
  20. public async Task WriteAsync(LogMessage logMsg, bool flush)
  21. {
  22. // 是否启用操作日志
  23. var sysOpLogEnabled = await _sysConfigService.GetConfigValue<bool>(CommonConst.SysOpLog);
  24. if (!sysOpLogEnabled) return;
  25. var jsonStr = logMsg.Context.Get("loggingMonitor").ToString();
  26. var loggingMonitor = JSON.Deserialize<dynamic>(jsonStr);
  27. // 不记录登录退出日志
  28. if (loggingMonitor.actionName == "userInfo" || loggingMonitor.actionName == "logout")
  29. return;
  30. // 获取当前操作者
  31. string account = "", realName = "", userId = "", tenantId = "";
  32. if (loggingMonitor.authorizationClaims != null)
  33. {
  34. foreach (var item in loggingMonitor.authorizationClaims)
  35. {
  36. if (item.type == ClaimConst.Account)
  37. account = item.value;
  38. if (item.type == ClaimConst.RealName)
  39. realName = item.value;
  40. if (item.type == ClaimConst.TenantId)
  41. tenantId = item.value;
  42. if (item.type == ClaimConst.UserId)
  43. userId = item.value;
  44. }
  45. }
  46. string remoteIPv4 = loggingMonitor.remoteIPv4;
  47. (string ipLocation, double? longitude, double? latitude) = DatabaseLoggingWriter.GetIpAddress(remoteIPv4);
  48. var sysLogOp = new SysLogOp
  49. {
  50. Id = DateTime.Now.Ticks,
  51. ControllerName = loggingMonitor.controllerName,
  52. ActionName = loggingMonitor.actionTypeName,
  53. DisplayTitle = loggingMonitor.displayTitle,
  54. Status = loggingMonitor.returnInformation.httpStatusCode,
  55. RemoteIp = remoteIPv4,
  56. Location = ipLocation,
  57. Longitude = longitude,
  58. Latitude = latitude,
  59. Browser = loggingMonitor.userAgent,
  60. Os = loggingMonitor.osDescription + " " + loggingMonitor.osArchitecture,
  61. Elapsed = loggingMonitor.timeOperationElapsedMilliseconds,
  62. LogDateTime = logMsg.LogDateTime,
  63. Account = account,
  64. RealName = realName,
  65. HttpMethod = loggingMonitor.httpMethod,
  66. RequestUrl = loggingMonitor.requestUrl,
  67. RequestParam = (loggingMonitor.parameters == null || loggingMonitor.parameters.Count == 0) ? null : JSON.Serialize(loggingMonitor.parameters[0].value),
  68. ReturnResult = JSON.Serialize(loggingMonitor.returnInformation),
  69. EventId = logMsg.EventId.Id,
  70. ThreadId = logMsg.ThreadId,
  71. TraceId = logMsg.TraceId,
  72. Exception = (loggingMonitor.exception == null) ? null : JSON.Serialize(loggingMonitor.exception),
  73. Message = logMsg.Message,
  74. CreateUserId = string.IsNullOrWhiteSpace(userId) ? 0 : long.Parse(userId),
  75. TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : long.Parse(tenantId)
  76. };
  77. await _esClient.IndexDocumentAsync(sysLogOp);
  78. }
  79. /// <summary>
  80. /// 释放服务作用域
  81. /// </summary>
  82. public void Dispose()
  83. {
  84. _serviceScope.Dispose();
  85. }
  86. }