{"id":24118035,"url":"https://github.com/itmisx/logx","last_synced_at":"2026-04-01T21:48:17.317Z","repository":{"id":44460022,"uuid":"441598713","full_name":"itmisx/logx","owner":"itmisx","description":"基于opentelemetry及zap实现的日志记录及追踪","archived":false,"fork":false,"pushed_at":"2025-08-06T01:38:17.000Z","size":99,"stargazers_count":15,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-06T03:21:52.278Z","etag":null,"topics":["grafana","log","loki","tempo","trace"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/itmisx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-12-25T03:47:54.000Z","updated_at":"2025-08-06T01:38:20.000Z","dependencies_parsed_at":"2024-11-14T13:20:53.168Z","dependency_job_id":"aace8f22-7275-4f73-a9ff-cab4eafd2e28","html_url":"https://github.com/itmisx/logx","commit_stats":null,"previous_names":["itmisx/logger"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/itmisx/logx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itmisx%2Flogx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itmisx%2Flogx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itmisx%2Flogx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itmisx%2Flogx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/itmisx","download_url":"https://codeload.github.com/itmisx/logx/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itmisx%2Flogx/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269015647,"owners_count":24345140,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-06T02:00:09.910Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["grafana","log","loki","tempo","trace"],"created_at":"2025-01-11T08:17:23.409Z","updated_at":"2026-04-01T21:48:12.260Z","avatar_url":"https://github.com/itmisx.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# logger\n\n#### logger\n\nlogger wraps uber/zap and trace with opentelemetry\n\n####\n\n```mermaid\nflowchart LR\nlogger  e1@-- openTelemetrySDK --\u003e trace\ne1@{ animate: true }\ntrace e2@-- http --\u003e tempo\ne2@{ animate: true }\n\nlogger e3@-- zap --\u003e log\ne3@{ animate: true }\nlog e4@--\u003eloki\ne4@{ animate: true }\n\ntempo e5@--\u003egrafana\ne5@{ animate: true }\nloki e6@--\u003egrafana\ne6@{ animate: true }\n\n```\n\n#### Feature\n\n- [x] 支持日志及切分\n- [x] 支持追踪（基于 `opentelemetry`）\n- [x] 支持 Debug,Info,Warn,Error,Fatal 日志等级\n- [x] 支持异常自动恢复 `defer logger.End(ctx)`\n\n#### Install\n\n```text\ngo get -u -v github.com/itmisx/logger\n```\n\n#### Usage\n\n- 配置项\n\n  ```go\n  type Config struct {\n      Debug              bool    `yaml:\"debug\" mapstructure:\"debug\"`               // 调试模式，默认仅记录错误\n      Output             bool    `yaml:\"output\" mapstructure:\"output\"`             // 日志打印方式。none不打印日志，console打印到控制台，file输出到文件。默认为console\n      File               string  `yaml:\"file\" mapstructure:\"file\"`                 // 日志文件路径\n      MaxSize            int     `yaml:\"max_size\" mapstructure:\"max_size\"`         // 单个日志文件的大小限制，单位MB\n      MaxBackups         int     `yaml:\"max_backups\" mapstructure:\"max_backups\"`   // 日志文件数据的限制\n      MaxAge             int     `yaml:\"max_age\" mapstructure:\"max_age\"`           // 日志文件的保存天数\n      Compress           bool    `yaml:\"compress\" mapstructure:\"compress\"`         // 日志文件压缩开关\n      Rotate             string  `yaml:\"rotate\" mapstructure:\"rotate\"`             // 日志切分的时间，参考linux定时任务0 0 0  * * *，精确到秒\n      EnableTrace        bool    `yaml:\"enable_trace\" mapstructure:\"enable_trace\"` // 日志追踪开关\n      TracerProviderType string  `yaml:\"tracer_provider_type\" mapstructure:\"tracer_provider_type\"`// 追踪内容导出类型，默认为jaeger\n      TraceSampleRatio   float64 `yaml:\"trace_sample_ratio\" mapstructure:\"trace_sample_ratio\"` // 追踪采样的频率, 0.0-1\n      JaegerServer       string  `yaml:\"jaeger_server\" mapstructure:\"jaeger_server\"`// jaeger的URI地址\n      JaegerUsername     string  `yaml:\"jaeger_username\" mapstructure:\"jaeger_username\"`// jaeger用户名\n      JaegerPassword     string  `yaml:\"jaeger_password\" mapstructure:\"jaeger_password\"`// jaeger密码\n  }\n  ```\n\n- 初始化\n\n  ```go\n  // 初始化,配置参考logger.Config\n  // service.name为服务的名字\n  // service.version为版本\n  // logger.Init(config,attrs...logger.Field),更多的logger.Type参考logger下filed.go\n  logger.Init(conf,logger.String(\"service.name\",\"service1\"),logger.String(\"service.version\",\"version\"))\n  ```\n\n* 基础使用\n\n  ```go\n  // 在一个函数中启动一个span\n  // 并注册一个延迟结束（！！切记，缺少可能会导致内存泄露）\n  func foo(){\n      // logger.Start(ctx,spanName,attrs...logger.Field)\n      // 可以为一个span指定spanName以及额外的属性信息\n      // attr支持logger.String(\"key\",\"value\") 形式,更多的logger.Type参考logger下filed.go\n      ctx:=logger.Start(context,spanName,logger.String(\"key\",\"value\"))\n      defer logger.End(ctx)\n      // 正常记录日志\n      // logger.Info(ctx,msg,attrs...logger.Field)\n      // 记录msg信息及额外的信息\n      // attr支持logger.String(\"key\",\"value\") 形式\n      // 支持Debug,Info,Warn,Error,Fatal\n      logger.Info(ctx,msg,logger.String(\"key\",\"value\"))\n  }\n  ```\n\n* 追踪传递，就是传递 traceID 和 spanID\n\n  \u003e gin 框架实例\n\n  ```go\n  // 请求方\n  //\n  // 请求方调用request时，注入context trace信息\n  // post为封装的一个请求函数\n  func post(ctx context.Context){\n      …… // request的请求\n      // 注入context追踪信息\n      // request类型为*http.Request\n      logger.HttpInject(ctx,request)\n      …… // 发送请求\n  }\n\n\n  // 接收方\n  // gin举例，初始化gin时，注册中间件\n  // sevice为当前后台服务的名称\n  router.Use(GinMiddleware(\"service\"))\n  // 使用\n  func foo(c *gin.Context){\n      ctx:=logger.Start(c.Request.Context(),spanName,logger.String(\"key\",\"value\"))\n      defer logger.End(ctx)\n      // 正常记录日志\n      logger.Info(ctx,msg,logger.String(\"key\",\"value\"))\n  }\n  ```\n\n  \u003e 手动传递\n\n  ```go\n  // 对于不能通过函数或请求传递的，则需要手动传递\n  // 通过 指定traceID和spanID生成一个context\n  //\n  // 然后，logger.Start(ctx,\"spanName\"),其生成的span就为childspan\n  //\n  // 其中traceID和spanID可以利用logger.GenTraceID()和logger.GenSpanID()生成\n  // 也可以通过上个start返回的spanCtx中获得,logger.TraceID(spanCtx),logger.SpanID(spanCtx)\n  ctx, err := NewRootContext(traceID, spanID)\n  ```\n\n#### functions\n\n- Init(conf Config,applicationAttributes ...logger.Field) //初始化，配置及应用信息\n- Start(ctx context.Context,spanName string,spanStartOption ...logger.Field) context.Context //启动日志追踪,spanName 为追踪跨度的名称，spanStartOption 为跨度额外信息\n- Info(ctx context.Context,msg string,attributes ...logger.Field) // 普通日志\n- Warn(ctx context.Context,msg string,attributes ...logger.Field) // 警告日志\n- Error(ctx context.Context,msg string,attributes ...logger.Field) // 错误日志\n- End(ctx context.Context) //结束日志追踪\n- TraceID(ctx context.Context)string //获取 traceID\n- SpanID(ctx context.Context)string //获取 spanID\n- GenTraceID()string // 生成 traceID\n- GenSpanID()string // 生成 spanID\n\n\u003e logger.Field 类型支持\n\n- bool\n- boolSlice\n- int\n- intSlice\n- int64\n- int64Slice\n- float64\n- float64Slice\n- string\n- stringSlice\n- stringer, interface{String()string{}}\n\n#### 基于 loki+tempo+grafana 的效果（日志查询+追踪）\n\n![image](https://user-images.githubusercontent.com/5791324/147378026-42819fbb-5abf-46b9-8bba-a3ec7bfbcc81.png)\n\n#### License\n\nUse of logger is governed by the Mit License\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fitmisx%2Flogx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fitmisx%2Flogx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fitmisx%2Flogx/lists"}