这是基于vue-vben-admin 模板适用于abp Vnext的前端管理项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2.3 KiB

LINGYUN.Abp.Serilog.Enrichers.UniqueId

简体中文 | English

日志属性添加唯一标识,使用雪花算法生成唯一ID。

功能特性

  • 为每个日志事件添加唯一标识
  • 基于雪花算法(Snowflake)生成分布式唯一ID
  • 支持自定义雪花算法配置
  • 支持代码配置和JSON配置两种方式
  • 与Serilog无缝集成

模块引用

[DependsOn(typeof(AbpSerilogEnrichersUniqueIdModule))]
public class YouProjectModule : AbpModule
{
  // other
}

配置项

常量配置

  • AbpSerilogUniqueIdConsts.UniqueIdPropertyName - 唯一标识字段的名称,默认为"UniqueId"

雪花算法配置

通过 AbpSerilogEnrichersUniqueIdOptions 配置雪花算法参数:

{
  "UniqueId": {
    "Snowflake": {
      "WorkerId": 1,        // 工作机器ID
      "DatacenterId": 1,    // 数据中心ID
      "Sequence": 0,        // 序列号
      "BaseTime": "2020-01-01 00:00:00"  // 基准时间
    }
  }
}

使用方法

代码配置方式

Log.Logger = new LoggerConfiguration()
    .Enrich.WithUniqueId()
    // ...其他配置...
    .CreateLogger();

JSON配置方式

{
   "Serilog": {
    "MinimumLevel": {
      "Default": "Information"
    },
    "Enrich": [ "WithUniqueId" ]
  }
}

实现细节

该enricher使用雪花算法为每个日志事件生成一个唯一的ID。雪花算法的特点是:

  • 生成的ID是64位的长整型
  • ID由时间戳、数据中心ID、工作机器ID和序列号组成
  • 保证在分布式环境下的唯一性
  • 基于时间戳的有序性

最佳实践

  1. 合理配置工作机器ID和数据中心ID,避免在分布式环境中产生冲突:
{
  "UniqueId": {
    "Snowflake": {
      "WorkerId": 1,
      "DatacenterId": 1
    }
  }
}
  1. 设置合适的基准时间以最大化ID的可用时间范围:
{
  "UniqueId": {
    "Snowflake": {
      "BaseTime": "2020-01-01 00:00:00"
    }
  }
}
  1. 在日志查询时可以使用UniqueId字段进行精确定位。

注意事项

  1. 雪花算法生成的ID是趋势递增的,但不保证严格递增
  2. 工作机器ID和数据中心ID在集群中必须唯一
  3. 基准时间一旦设置就不能修改,否则可能导致ID重复
  4. 每个日志事件都会生成新的唯一ID,这可能会增加一些性能开销