# logger **Repository Path**: liumou_site/logger ## Basic Information - **Project Name**: logger - **Description**: 使用Go编写的彩色日志工具 - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-11-25 - **Last Updated**: 2026-01-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # logger 基于`github.com/wonderivan/logger`改造,主要针对模块使用场景进行优化 2023.08.02 增强了在Windows平台上的颜色支持,Win7等系统中也可在控制台实现彩色输出 ## 新增功能 支持类似zap的结构化日志功能,提供L()和S()风格的API,支持字段化日志记录。 # 1. 使用说明 ## 普通使用 ```go import "gitee.com/liumou_site/logger" // 配置logger,如果不配置时默认为控制台输出,等级为DEBG logger.SetLogger(`{"Console": {"level": "DEBG"}`) // 配置说明见下文 // 设置完成后,即可在控制台和日志文件app.log中看到如下输出 logger.Trace("this is Trace") logger.Debug("this is Debug") logger.Info("this is Info") logger.Warn("this is Warn") logger.Error("this is Error") logger.Crit("this is Critical") logger.Alert("this is Alert") logger.Emer("this is Emergency") ``` ## 结构化日志使用 ### L() 风格 - 类似 Zap 的全局 Logger ```go // 使用 L() 风格的结构化日志 logger.L().Info("应用启动", logger.String("version", "1.0.0"), logger.String("env", "production"), logger.Int("port", 8080), ) logger.L().Error("数据库连接失败", logger.String("host", "localhost"), logger.Int("port", 5432), logger.String("database", "myapp"), logger.Err("error", fmt.Errorf("连接超时")), logger.Duration("timeout", time.Second*30), ) ``` ### S() 风格 - Sugar Logger ```go // 使用 Sugar Logger 风格 logger.S().Infow("用户登录成功", logger.String("username", "alice"), logger.String("role", "admin"), logger.Bool("success", true), logger.Time("login_time", time.Now()), ) // 使用全局糖化函数 logger.Infow("API 请求处理完成", logger.String("method", "POST"), logger.String("path", "/api/users/create"), logger.Int("status_code", 201), logger.Duration("response_time", time.Millisecond*125), logger.String("client_ip", "192.168.1.100"), ) ``` ### 支持的字段类型 - `logger.String(key, value)` - 字符串类型 - `logger.Int(key, value)` - 整数类型 - `logger.Int64(key, value)` - 64位整数类型 - `logger.Float64(key, value)` - 浮点数类型 - `logger.Bool(key, value)` - 布尔类型 - `logger.Err(key, error)` - 错误类型 - `logger.Time(key, time)` - 时间类型 - `logger.Duration(key, duration)` - 时长类型 - `logger.Object(key, obj)` - 对象类型 - `logger.Array(key, array)` - 数组类型 - `logger.Any(key, value)` - 任意类型 ### With 方法 - 持久字段 ```go // 使用 With 方法创建带有固定字段的 logger requestLogger := logger.L().With( logger.String("request_id", "req-789012"), logger.String("session_id", "sess-abcdef"), logger.String("endpoint", "/api/payment/process"), ) requestLogger.Info("处理支付请求", logger.String("payment_method", "credit_card"), logger.Float64("amount", 99.99), logger.String("currency", "USD"), ) ``` 输出结果(传统格式): ![Demo](images/output1.png) 结构化日志输出示例(完全结构化输出,字段顺序固定): ```json {"timestamp":"2026-01-22T17:21:30+08:00","timestamp_nano":1769073690974308200,"level":"INFO","message":"应用启动","caller":"main:15","file":"main","line":15,"version":"1.0.0","env":"production","port":8080} {"timestamp":"2026-01-22T17:21:30+08:00","timestamp_nano":1769073690991312700,"level":"EROR","message":"数据库连接失败","caller":"main:20","file":"main","line":20,"host":"localhost","port":5432,"database":"myapp","error":"连接超时"} ``` ## 作为模块日志使用 ### 显示模块名称 ```go logs := NewLogger(1) // logs.Version = "v1.0.3" logs.Modular = "gcs" logs.Trace("this is Trace") logs.Debug("this is Debug") logs.Info("this is Info") logs.Warn("this is Warn") logs.Error("this is Error") logs.Crit("this is Critical") logs.Alert("this is Alert") logs.Emer("this is Emergency") ``` ![模块](images/m1.png) ### 显示模块+版本 ```go logs := NewLogger(1) logs.Version = "v1.0.3" logs.Modular = "gcs" logs.Trace("this is Trace") logs.Debug("this is Debug") logs.Info("this is Info") logs.Warn("this is Warn") logs.Error("this is Error") logs.Crit("this is Critical") logs.Alert("this is Alert") logs.Emer("this is Emergency") ``` ![模块+版本](images/m2.png) # 2. 日志等级 当前日志输出等级共8种,从0-7对应的等级由高到底,当配置为某个输出等级时,只有大于等于该等级的日志才会输出。不同的输出适配器支持不同的日志等级配置: | 等级 | 配置 | 释义 | 控制台颜色 | | ---- | ---- | ------------------------------------------------ | ---------- | | 0 | EMER | 系统级紧急,比如磁盘出错,内存异常,网络不可用等 | 红色底 | | 1 | ALRT | 系统级警告,比如数据库访问异常,配置文件出错等 | 紫色 | | 2 | CRIT | 系统级危险,比如权限出错,访问异常等 | 蓝色 | | 3 | EROR | 用户级错误 | 红色 | | 4 | WARN | 用户级警告 | 黄色 | | 5 | INFO | 用户级重要 | 天蓝色 | | 6 | DEBG | 用户级调试 | 绿色 | | 7 | TRAC | 用户级基本输出 | 绿色 | # 3. 配置说明 logger当前支持控制台、文件、网络3种方式适配器输出,可以通过各自的参数进行设置,该logger支持多个方式同时输出,如果未配置某项适配器时,则不初始化也不会输出到该适配器。 通过调用logger.SetLogger(config string)方法设置参数,config支持json配置,也支持指定内容为json配置的文件路径,例如: ```go // 通过配置参数直接配置 logger.SetLogger(`{"Console": {"level": "DEBG"}}`) // 通过配置文件配置 logger.SetLogger("/home/log.json") ``` ```json { "TimeFormat":"2006-01-02 15:04:05", // 输出日志开头时间格式 "Console": { // 控制台日志配置 "level": "TRAC", // 控制台日志输出等级 "color": true // 控制台日志颜色开关 }, "File": { // 文件日志配置 "filename": "app.log", // 初始日志文件名 "level": "TRAC", // 日志文件日志输出等级 "daily": true, // 跨天后是否创建新日志文件,当append=true时有效 "maxlines": 1000000, // 日志文件最大行数,当append=true时有效 "maxsize": 1, // 日志文件最大大小,当append=true时有效 "maxdays": -1, // 日志文件有效期 "append": true, // 是否支持日志追加 "permit": "0660" // 新创建的日志文件权限属性 }, "Conn": { // 网络日志配置 "net":"tcp", // 日志传输模式 "addr":"10.1.55.10:1024", // 日志接收服务器 "level": "Warn", // 网络日志输出等级 "reconnect":true, // 网络断开后是否重连 "reconnectOnMsg":false, // 发送完每条消息后是否断开网络 } } ``` - 时间格式 | 时间类型 | 时间格式 | | ------------ | ----------------------------------------- | | ANSIC | "Mon Jan _2 15:04:05 2006" | | UnixDate | "Mon Jan _2 15:04:05 MST 2006" | | RubyDate | "Mon Jan 02 15:04:05 -0700 2006" | | RFC822 | "02 Jan 06 15:04 MST" | | RFC822Z | "02 Jan 06 15:04 -0700" | | RFC850 | "Monday, 02-Jan-06 15:04:05 MST" | | RFC1123 | "Mon, 02 Jan 2006 15:04:05 MST" | | RFC1123Z | "Mon, 02 Jan 2006 15:04:05 -0700" | | RFC3339 | "2006-01-02T15:04:05Z07:00" | | RFC3339Nano | "2006-01-02T15:04:05.999999999Z07:00" | | Kitchen | "3:04PM" | | Stamp | "Jan _2 15:04:05" | | StampMilli | "Jan _2 15:04:05.000" | | StampMicro | "Jan _2 15:04:05.000000" | | StampNano | "Jan _2 15:04:05.000000000" | | RFC3339Nano1 | "2006-01-02 15:04:05.999999999 -0700 MST" | | DEFAULT | "2006-01-02 15:04:05" | - 时间格式打印: ``` ========RFC1123Z time format======== Thu, 02 Aug 2018 18:48:04 +0800 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC1123Z ========Stamp time format======== Aug 2 18:48:04 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug Stamp ========StampMilli time format======== Aug 2 18:48:04.489 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug StampMilli ========StampNano time format======== Aug 2 18:48:04.490002155 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug StampNano ========RubyDate time format======== Thu Aug 02 18:48:04 +0800 2018 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RubyDate ========RFC822 time format======== 02 Aug 18 18:48 CST [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC822 ========RFC822Z time format======== 02 Aug 18 18:48 +0800 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC822Z ========RFC1123 time format======== Thu, 02 Aug 2018 18:48:04 CST [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC1123 ========RFC3339 time format======== 2018-08-02T18:48:04+08:00 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC3339 ========RFC3339Nano time format======== 2018-08-02T18:48:04.490377325+08:00 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC3339Nano ========ANSIC time format======== Thu Aug 2 18:48:04 2018 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug ANSIC ========UnixDate time format======== Thu Aug 2 18:48:04 CST 2018 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug UnixDate ========RFC850 time format======== Thursday, 02-Aug-18 18:48:04 CST [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC850 ========Kitchen time format======== 6:48PM [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug Kitchen ========StampMicro time format======== Aug 2 18:48:04.490662 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug StampMicro ``` # 3.1 文件写入的配置方式 文件日志输出通过`File`适配器实现,支持多种参数配置,示例: ```go logger.SetLogger(`{ "File": { "filename": "app.log", "level": "DEBG", "daily": true, "maxlines": 1000000, "maxsize": 1, "maxdays": 7, "append": true, "permit": "0660" } }`) ``` - **filename**:日志文件名,必填项。 - **level**:日志输出等级,详见日志等级表。 - **daily**:是否按天分割日志文件(跨天自动新建),默认`true`。 - **maxlines**:单个日志文件最大行数,超过后自动切分。 - **maxsize**:单个日志文件最大大小(MB),超过后自动切分。 - **maxdays**:日志文件最大保存天数,过期自动删除。 - **append**:是否追加写入日志文件,默认`true`。 - **permit**:新建日志文件的权限(如`0660`)。 **注意**: - 当`append=true`且`daily=true`时,跨天或超限会自动重命名旧文件并新建新文件,重命名格式如`app.2023-08-01.001.log`。 - 文件日志的所有参数均可在初始化时通过JSON配置传入。 --- # 3.2 控制台输出的配置方式 控制台日志输出通过`Console`适配器实现,支持如下参数: ```go logger.SetLogger(`{ "Console": { "level": "DEBG", "color": true } }`) ``` - **level**:控制台日志输出等级。 - **color**:是否开启彩色输出,Windows下同样支持。 --- # 3.3 全局初始化与输出类型切换 - **全局初始化** logger包默认初始化了全局的`defaultLogger`,无需手动创建即可直接调用如`logger.Debug(...)`等方法,适合大多数场景。 - **多输出类型同时启用** 支持同时配置多种输出类型(如控制台+文件+网络),只需在JSON配置中同时写入多个适配器配置即可。例如: ```go logger.SetLogger(`{ "Console": {"level": "INFO"}, "File": {"filename": "app.log", "level": "DEBG"} }`) ``` - **动态切换/添加输出类型** 通过`SetLogger(adapterName, config)`方法可动态添加或切换某一输出类型。例如: ```go logger.SetLogger("file", `{"filename":"new.log","level":"INFO"}`) logger.SetLogger("console", `{"level":"WARN","color":false}`) ``` - **删除某一输出类型** 可通过`DelLogger(adapterName)`方法移除某一输出类型。 --- # 3.4 作为模块日志的全局用法 如需为不同模块单独管理日志,可通过`NewLogger()`创建独立实例,并分别设置模块名、版本号等: ```go logs := logger.NewLogger(1) logs.Modular = "模块A" logs.Version = "v1.2.3" logs.SetLogger("file", `{"filename":"modA.log"}`) logs.Info("模块A的日志") ``` --- # 3.5 配置文件方式 支持将所有配置写入JSON文件,通过如下方式加载: ```go logger.SetLogger("C:/path/to/logger.json") ``` --- # 3.6 日志文件路径显示(相对路径) 日志库现已默认自动获取当前工作目录作为日志路径前缀,日志输出时会自动显示为相对于项目根目录的相对路径(如 [subdir/file.go:23]),而不再仅显示文件名。 - 如果不做任何设置,日志会自动以“当前工作目录”为基准显示相对路径,便于在多模块或多层级项目中快速定位日志来源。 - 如果需要自定义路径前缀,可通过如下方式手动覆盖: ```go // 例如你的项目源码在 E:/CODE/gitee/go/logger 下 logger.SetLogPathTrim("E:/CODE/gitee/go/logger/") // 之后日志输出会变成 [subdir/file.go:23] 这样的相对路径 ``` - 如果设置了 `SetLogPathTrim("src/")`,则会去除路径中的 `src/` 前缀,显示为相对路径。 **注意:** 该设置对所有日志输出生效,用户手动设置会覆盖默认行为。 --- # 4. 其他 1. logger默认是控制台输出,输出等级为DEBG,默认是支持颜色区分的。 2. 日志文件append为true时,当写入的日志文件发生跨天(daily为true)或超过最大限制时,会创建一个新文件,原有文件格式被重命名为: ****.xxxx-xx-xx.xxx.xxx 格式,例如:当向app.log写入日志时,触发了创建新文件操作,则将app.log重命名为 app.2018-01-01.001.log, 如果此时app.2018-01-01.001.log已经存在,则将刚才的app.log重命名为 app.2018-01-01.002.log,以此类推。 3. logger package默认初始化了全局的defaultLogger,直接调用logger包的Debug方法时,会默认调用defaultLogger.Debug,所以普通调用时,仅需要import logger即可使用。 4. 网络配置中的reconnectOnMsg为每条消息都重连一次网络日志中心,适用于写日志频率极低的情况下的服务调用,避免长时间连接,占用资源。但强烈不建议普通使用时设置为true,这将会导致调用方反复的网络重连,极大增加资源消耗和延迟。 5. conn网络输出适配器经过ELK集成环境的测试验证,通过该方式发送的日志,能够正常通过Elecsearch和Kibana检索和分析。 ## 结构化日志功能特点 - **L() 风格**: 类似 Zap 的全局结构化 Logger,提供 `.Info()`, `.Error()` 等方法 - **S() 风格**: Sugar Logger 风格,提供 `.Infow()`, `.Errorw()` 等方法 - **字段化记录**: 支持多种数据类型的字段记录,如字符串、数字、布尔值、时间、错误等 - **持久字段**: 通过 `.With()` 方法可以创建带有固定字段的 Logger 实例 - **兼容性**: 完全兼容原有 API,新功能为新增功能,不影响现有代码 - **JSON输出**: 结构化日志以 JSON 格式输出,便于日志分析系统解析