ElasticSearchLoggingWriter.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // 麻省理工学院许可证
  2. //
  3. // 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司 联系电话/微信:18020030720 QQ:515096995
  4. //
  5. // 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
  6. //
  7. // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
  8. // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
  9. using Nest;
  10. namespace Admin.NET.Core;
  11. /// <summary>
  12. /// ES日志写入器
  13. /// </summary>
  14. public class ElasticSearchLoggingWriter : IDatabaseLoggingWriter
  15. {
  16. private readonly ElasticClient _esClient;
  17. private readonly SysConfigService _sysConfigService;
  18. public ElasticSearchLoggingWriter(ElasticClient esClient, SysConfigService sysConfigService)
  19. {
  20. _esClient = esClient;
  21. _sysConfigService = sysConfigService;
  22. }
  23. public async void Write(LogMessage logMsg, bool flush)
  24. {
  25. // 是否启用操作日志
  26. var sysOpLogEnabled = await _sysConfigService.GetConfigValue<bool>(CommonConst.SysOpLog);
  27. if (!sysOpLogEnabled) return;
  28. var jsonStr = logMsg.Context.Get("loggingMonitor").ToString();
  29. var loggingMonitor = JSON.Deserialize<dynamic>(jsonStr);
  30. // 不记录登录登出日志
  31. if (loggingMonitor.actionName == "userInfo" || loggingMonitor.actionName == "logout")
  32. return;
  33. #region 处理操作日志
  34. // 获取当前操作者
  35. string account = "", realName = "", userId = "", tenantId = "";
  36. if (loggingMonitor.authorizationClaims != null)
  37. {
  38. foreach (var item in loggingMonitor.authorizationClaims)
  39. {
  40. if (item.type == ClaimConst.Account)
  41. account = item.value;
  42. if (item.type == ClaimConst.RealName)
  43. realName = item.value;
  44. if (item.type == ClaimConst.TenantId)
  45. tenantId = item.value;
  46. if (item.type == ClaimConst.UserId)
  47. userId = item.value;
  48. }
  49. }
  50. string remoteIPv4 = loggingMonitor.remoteIPv4;
  51. (string ipLocation, double? longitude, double? latitude) = DatabaseLoggingWriter.GetIpAddress(remoteIPv4);
  52. //var client = Parser.GetDefault().Parse(loggingMonitor.userAgent.ToString());
  53. //var browser = $"{client.UA.Family} {client.UA.Major}.{client.UA.Minor} / {client.Device.Family}";
  54. //var os = $"{client.OS.Family} {client.OS.Major} {client.OS.Minor}";
  55. var sysLogOp = new SysLogOp
  56. {
  57. Id = DateTime.Now.Ticks,
  58. ControllerName = loggingMonitor.controllerName,
  59. ActionName = loggingMonitor.actionTypeName,
  60. DisplayTitle = loggingMonitor.displayTitle,
  61. Status = loggingMonitor.returnInformation.httpStatusCode,
  62. RemoteIp = remoteIPv4,
  63. Location = ipLocation,
  64. Longitude = longitude,
  65. Latitude = latitude,
  66. Browser = loggingMonitor.userAgent,
  67. Os = loggingMonitor.osDescription + " " + loggingMonitor.osArchitecture,
  68. Elapsed = loggingMonitor.timeOperationElapsedMilliseconds,
  69. LogDateTime = logMsg.LogDateTime,
  70. Account = account,
  71. RealName = realName,
  72. HttpMethod = loggingMonitor.httpMethod,
  73. RequestUrl = loggingMonitor.requestUrl,
  74. RequestParam = (loggingMonitor.parameters == null || loggingMonitor.parameters.Count == 0) ? null : JSON.Serialize(loggingMonitor.parameters[0].value),
  75. ReturnResult = JSON.Serialize(loggingMonitor.returnInformation),
  76. EventId = logMsg.EventId.Id,
  77. ThreadId = logMsg.ThreadId,
  78. TraceId = logMsg.TraceId,
  79. Exception = (loggingMonitor.exception == null) ? null : JSON.Serialize(loggingMonitor.exception),
  80. Message = logMsg.Message,
  81. CreateUserId = string.IsNullOrWhiteSpace(userId) ? 0 : long.Parse(userId),
  82. TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : long.Parse(tenantId)
  83. };
  84. #endregion 处理操作日志
  85. await _esClient.IndexDocumentAsync(sysLogOp);
  86. }
  87. }