修改包名
This commit is contained in:
33
README.md
33
README.md
@@ -31,6 +31,9 @@
|
|||||||
### 9. 工厂工具 (factory)
|
### 9. 工厂工具 (factory)
|
||||||
提供从配置直接创建已初始化客户端对象的功能,避免调用方重复实现创建逻辑。
|
提供从配置直接创建已初始化客户端对象的功能,避免调用方重复实现创建逻辑。
|
||||||
|
|
||||||
|
### 10. 日志工具 (logger)
|
||||||
|
提供统一的日志记录功能,支持多种日志级别和输出方式,使用Go标准库实现。
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
### 1. 配置私有仓库(重要)
|
### 1. 配置私有仓库(重要)
|
||||||
@@ -50,7 +53,7 @@ go env GOPRIVATE
|
|||||||
### 2. 安装模块
|
### 2. 安装模块
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go get git.toowon.com/jimmy/go-commom
|
go get git.toowon.com/jimmy/go-common
|
||||||
```
|
```
|
||||||
|
|
||||||
## 使用示例
|
## 使用示例
|
||||||
@@ -65,12 +68,13 @@ go get git.toowon.com/jimmy/go-commom
|
|||||||
- [邮件工具文档](./docs/email.md)
|
- [邮件工具文档](./docs/email.md)
|
||||||
- [短信工具文档](./docs/sms.md)
|
- [短信工具文档](./docs/sms.md)
|
||||||
- [工厂工具文档](./docs/factory.md)
|
- [工厂工具文档](./docs/factory.md)
|
||||||
|
- [日志工具文档](./docs/logger.md)
|
||||||
|
|
||||||
### 快速示例
|
### 快速示例
|
||||||
|
|
||||||
#### 数据库迁移
|
#### 数据库迁移
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/migration"
|
import "git.toowon.com/jimmy/go-common/migration"
|
||||||
|
|
||||||
migrator := migration.NewMigrator(db)
|
migrator := migration.NewMigrator(db)
|
||||||
migrator.AddMigration(migration.Migration{
|
migrator.AddMigration(migration.Migration{
|
||||||
@@ -85,7 +89,7 @@ migrator.Up()
|
|||||||
|
|
||||||
#### 日期转换
|
#### 日期转换
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/datetime"
|
import "git.toowon.com/jimmy/go-common/datetime"
|
||||||
|
|
||||||
datetime.SetDefaultTimeZone(datetime.AsiaShanghai)
|
datetime.SetDefaultTimeZone(datetime.AsiaShanghai)
|
||||||
now := datetime.Now()
|
now := datetime.Now()
|
||||||
@@ -94,7 +98,7 @@ str := datetime.FormatDateTime(now)
|
|||||||
|
|
||||||
#### HTTP响应
|
#### HTTP响应
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/http"
|
import "git.toowon.com/jimmy/go-common/http"
|
||||||
|
|
||||||
http.Success(w, data)
|
http.Success(w, data)
|
||||||
http.SuccessPage(w, list, total, page, pageSize)
|
http.SuccessPage(w, list, total, page, pageSize)
|
||||||
@@ -104,8 +108,8 @@ http.Error(w, 1001, "业务错误")
|
|||||||
#### 中间件
|
#### 中间件
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
"git.toowon.com/jimmy/go-commom/http"
|
"git.toowon.com/jimmy/go-common/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CORS + 时区中间件
|
// CORS + 时区中间件
|
||||||
@@ -121,7 +125,7 @@ timezone := http.GetTimezone(r)
|
|||||||
|
|
||||||
#### 配置管理
|
#### 配置管理
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/config"
|
import "git.toowon.com/jimmy/go-common/config"
|
||||||
|
|
||||||
// 从文件加载配置
|
// 从文件加载配置
|
||||||
cfg, err := config.LoadFromFile("./config.json")
|
cfg, err := config.LoadFromFile("./config.json")
|
||||||
@@ -134,7 +138,7 @@ corsConfig := cfg.GetCORS()
|
|||||||
|
|
||||||
#### 文件上传和查看
|
#### 文件上传和查看
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/storage"
|
import "git.toowon.com/jimmy/go-common/storage"
|
||||||
|
|
||||||
// 创建存储实例
|
// 创建存储实例
|
||||||
storage, _ := storage.NewStorage(storage.StorageTypeOSS, cfg)
|
storage, _ := storage.NewStorage(storage.StorageTypeOSS, cfg)
|
||||||
@@ -152,7 +156,7 @@ proxyHandler := storage.NewProxyHandler(storage)
|
|||||||
|
|
||||||
#### 邮件发送
|
#### 邮件发送
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/email"
|
import "git.toowon.com/jimmy/go-common/email"
|
||||||
|
|
||||||
// 从配置创建邮件发送器
|
// 从配置创建邮件发送器
|
||||||
mailer, _ := email.NewEmail(cfg.GetEmail())
|
mailer, _ := email.NewEmail(cfg.GetEmail())
|
||||||
@@ -167,7 +171,7 @@ mailer.SendSimple(
|
|||||||
|
|
||||||
#### 短信发送
|
#### 短信发送
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/sms"
|
import "git.toowon.com/jimmy/go-common/sms"
|
||||||
|
|
||||||
// 从配置创建短信发送器
|
// 从配置创建短信发送器
|
||||||
smsClient, _ := sms.NewSMS(cfg.GetSMS())
|
smsClient, _ := sms.NewSMS(cfg.GetSMS())
|
||||||
@@ -182,8 +186,8 @@ smsClient.SendSimple(
|
|||||||
#### 使用工厂直接获取客户端(推荐)
|
#### 使用工厂直接获取客户端(推荐)
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/factory"
|
"git.toowon.com/jimmy/go-common/factory"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 加载配置并创建工厂
|
// 加载配置并创建工厂
|
||||||
@@ -197,6 +201,11 @@ smsClient, _ := fac.GetSMSClient()
|
|||||||
// 直接使用
|
// 直接使用
|
||||||
emailClient.SendSimple(...)
|
emailClient.SendSimple(...)
|
||||||
smsClient.SendSimple(...)
|
smsClient.SendSimple(...)
|
||||||
|
|
||||||
|
// 获取日志记录器(已初始化,可直接使用)
|
||||||
|
logger, _ := fac.GetLogger()
|
||||||
|
logger.Info("Application started")
|
||||||
|
logger.Error("Error occurred: %v", err)
|
||||||
```
|
```
|
||||||
|
|
||||||
更多示例请查看 [examples](./examples/) 目录。
|
更多示例请查看 [examples](./examples/) 目录。
|
||||||
|
|||||||
4
SETUP.md
4
SETUP.md
@@ -130,7 +130,7 @@ go env -w GONOSUMDB=git.toowon.com
|
|||||||
2. 确认 Git 认证已配置
|
2. 确认 Git 认证已配置
|
||||||
3. 尝试手动克隆仓库验证:
|
3. 尝试手动克隆仓库验证:
|
||||||
```bash
|
```bash
|
||||||
git clone git@git.toowon.com:jimmy/go-commom.git
|
git clone git@git.toowon.com:jimmy/go-common.git
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 问题2:go mod download 失败
|
#### 问题2:go mod download 失败
|
||||||
@@ -164,7 +164,7 @@ git config --global url."git@git.toowon.com:".insteadOf "https://git.toowon.com/
|
|||||||
go env | grep GOPRIVATE
|
go env | grep GOPRIVATE
|
||||||
|
|
||||||
# 4. 测试模块下载
|
# 4. 测试模块下载
|
||||||
go get git.toowon.com/jimmy/go-commom@latest
|
go get git.toowon.com/jimmy/go-common@latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### 参考文档
|
### 参考文档
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config 应用配置
|
// Config 应用配置
|
||||||
@@ -18,6 +18,7 @@ type Config struct {
|
|||||||
MinIO *MinIOConfig `json:"minio"`
|
MinIO *MinIOConfig `json:"minio"`
|
||||||
Email *EmailConfig `json:"email"`
|
Email *EmailConfig `json:"email"`
|
||||||
SMS *SMSConfig `json:"sms"`
|
SMS *SMSConfig `json:"sms"`
|
||||||
|
Logger *LoggerConfig `json:"logger"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DatabaseConfig 数据库配置
|
// DatabaseConfig 数据库配置
|
||||||
@@ -218,6 +219,24 @@ type SMSConfig struct {
|
|||||||
Timeout int `json:"timeout"`
|
Timeout int `json:"timeout"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoggerConfig 日志配置
|
||||||
|
type LoggerConfig struct {
|
||||||
|
// Level 日志级别: debug, info, warn, error
|
||||||
|
Level string `json:"level"`
|
||||||
|
|
||||||
|
// Output 输出方式: stdout, stderr, file, both
|
||||||
|
Output string `json:"output"`
|
||||||
|
|
||||||
|
// FilePath 日志文件路径(当output为file或both时必需)
|
||||||
|
FilePath string `json:"filePath"`
|
||||||
|
|
||||||
|
// Prefix 日志前缀
|
||||||
|
Prefix string `json:"prefix"`
|
||||||
|
|
||||||
|
// DisableTimestamp 禁用时间戳
|
||||||
|
DisableTimestamp bool `json:"disableTimestamp"`
|
||||||
|
}
|
||||||
|
|
||||||
// LoadFromFile 从文件加载配置
|
// LoadFromFile 从文件加载配置
|
||||||
// filePath: 配置文件路径(支持绝对路径和相对路径)
|
// filePath: 配置文件路径(支持绝对路径和相对路径)
|
||||||
func LoadFromFile(filePath string) (*Config, error) {
|
func LoadFromFile(filePath string) (*Config, error) {
|
||||||
@@ -342,6 +361,16 @@ func (c *Config) setDefaults() {
|
|||||||
c.SMS.Timeout = 10
|
c.SMS.Timeout = 10
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 日志默认值
|
||||||
|
if c.Logger != nil {
|
||||||
|
if c.Logger.Level == "" {
|
||||||
|
c.Logger.Level = "info"
|
||||||
|
}
|
||||||
|
if c.Logger.Output == "" {
|
||||||
|
c.Logger.Output = "stdout"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDatabase 获取数据库配置
|
// GetDatabase 获取数据库配置
|
||||||
@@ -390,6 +419,11 @@ func (c *Config) GetSMS() *SMSConfig {
|
|||||||
return c.SMS
|
return c.SMS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetLogger 获取日志配置
|
||||||
|
func (c *Config) GetLogger() *LoggerConfig {
|
||||||
|
return c.Logger
|
||||||
|
}
|
||||||
|
|
||||||
// GetDatabaseDSN 获取数据库连接字符串
|
// GetDatabaseDSN 获取数据库连接字符串
|
||||||
func (c *Config) GetDatabaseDSN() (string, error) {
|
func (c *Config) GetDatabaseDSN() (string, error) {
|
||||||
if c.Database == nil {
|
if c.Database == nil {
|
||||||
|
|||||||
@@ -69,6 +69,13 @@
|
|||||||
"templateCode": "SMS_123456789",
|
"templateCode": "SMS_123456789",
|
||||||
"endpoint": "",
|
"endpoint": "",
|
||||||
"timeout": 10
|
"timeout": 10
|
||||||
|
},
|
||||||
|
"logger": {
|
||||||
|
"level": "info",
|
||||||
|
"output": "stdout",
|
||||||
|
"filePath": "",
|
||||||
|
"prefix": "app",
|
||||||
|
"disableTimestamp": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,13 +11,14 @@
|
|||||||
- [邮件工具](./email.md) - SMTP邮件发送
|
- [邮件工具](./email.md) - SMTP邮件发送
|
||||||
- [短信工具](./sms.md) - 阿里云短信发送
|
- [短信工具](./sms.md) - 阿里云短信发送
|
||||||
- [工厂工具](./factory.md) - 从配置直接创建已初始化客户端对象
|
- [工厂工具](./factory.md) - 从配置直接创建已初始化客户端对象
|
||||||
|
- [日志工具](./logger.md) - 统一的日志记录功能
|
||||||
|
|
||||||
## 快速开始
|
## 快速开始
|
||||||
|
|
||||||
### 安装
|
### 安装
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go get git.toowon.com/jimmy/go-commom
|
go get git.toowon.com/jimmy/go-common
|
||||||
```
|
```
|
||||||
|
|
||||||
### 使用示例
|
### 使用示例
|
||||||
@@ -25,7 +26,7 @@ go get git.toowon.com/jimmy/go-commom
|
|||||||
#### 数据库迁移
|
#### 数据库迁移
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/migration"
|
import "git.toowon.com/jimmy/go-common/migration"
|
||||||
|
|
||||||
migrator := migration.NewMigrator(db)
|
migrator := migration.NewMigrator(db)
|
||||||
migrator.AddMigration(migration.Migration{
|
migrator.AddMigration(migration.Migration{
|
||||||
@@ -41,7 +42,7 @@ migrator.Up()
|
|||||||
#### 日期转换
|
#### 日期转换
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/datetime"
|
import "git.toowon.com/jimmy/go-common/datetime"
|
||||||
|
|
||||||
datetime.SetDefaultTimeZone(datetime.AsiaShanghai)
|
datetime.SetDefaultTimeZone(datetime.AsiaShanghai)
|
||||||
now := datetime.Now()
|
now := datetime.Now()
|
||||||
@@ -51,7 +52,7 @@ str := datetime.FormatDateTime(now)
|
|||||||
#### HTTP响应
|
#### HTTP响应
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/http"
|
import "git.toowon.com/jimmy/go-common/http"
|
||||||
|
|
||||||
http.Success(w, data)
|
http.Success(w, data)
|
||||||
http.SuccessPage(w, list, total, page, pageSize)
|
http.SuccessPage(w, list, total, page, pageSize)
|
||||||
@@ -62,8 +63,8 @@ http.Error(w, 1001, "业务错误")
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
"git.toowon.com/jimmy/go-commom/http"
|
"git.toowon.com/jimmy/go-common/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CORS + 时区中间件
|
// CORS + 时区中间件
|
||||||
@@ -80,7 +81,7 @@ timezone := http.GetTimezone(r)
|
|||||||
#### 配置管理
|
#### 配置管理
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/config"
|
import "git.toowon.com/jimmy/go-common/config"
|
||||||
|
|
||||||
// 从文件加载配置
|
// 从文件加载配置
|
||||||
cfg, err := config.LoadFromFile("./config.json")
|
cfg, err := config.LoadFromFile("./config.json")
|
||||||
|
|||||||
@@ -103,7 +103,7 @@
|
|||||||
### 1. 加载配置文件
|
### 1. 加载配置文件
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/config"
|
import "git.toowon.com/jimmy/go-common/config"
|
||||||
|
|
||||||
// 从文件加载配置(支持绝对路径和相对路径)
|
// 从文件加载配置(支持绝对路径和相对路径)
|
||||||
config, err := config.LoadFromFile("/path/to/config.json")
|
config, err := config.LoadFromFile("/path/to/config.json")
|
||||||
@@ -167,7 +167,7 @@ addr := config.GetRedisAddr()
|
|||||||
corsConfig := config.GetCORS()
|
corsConfig := config.GetCORS()
|
||||||
|
|
||||||
// 使用CORS中间件
|
// 使用CORS中间件
|
||||||
import "git.toowon.com/jimmy/go-commom/middleware"
|
import "git.toowon.com/jimmy/go-common/middleware"
|
||||||
chain := middleware.NewChain(
|
chain := middleware.NewChain(
|
||||||
middleware.CORS(corsConfig),
|
middleware.CORS(corsConfig),
|
||||||
)
|
)
|
||||||
@@ -279,6 +279,16 @@ if minioConfig != nil {
|
|||||||
| Endpoint | string | 服务端点(可选,默认使用区域端点) | - |
|
| Endpoint | string | 服务端点(可选,默认使用区域端点) | - |
|
||||||
| Timeout | int | 请求超时时间(秒) | 10 |
|
| Timeout | int | 请求超时时间(秒) | 10 |
|
||||||
|
|
||||||
|
### LoggerConfig 日志配置
|
||||||
|
|
||||||
|
| 字段 | 类型 | 说明 | 默认值 |
|
||||||
|
|------|------|------|--------|
|
||||||
|
| Level | string | 日志级别: debug, info, warn, error | info |
|
||||||
|
| Output | string | 输出方式: stdout, stderr, file, both | stdout |
|
||||||
|
| FilePath | string | 日志文件路径(当output为file或both时必需) | - |
|
||||||
|
| Prefix | string | 日志前缀 | - |
|
||||||
|
| DisableTimestamp | bool | 禁用时间戳 | false |
|
||||||
|
|
||||||
## 完整示例
|
## 完整示例
|
||||||
|
|
||||||
### 示例1:加载配置并使用
|
### 示例1:加载配置并使用
|
||||||
@@ -289,8 +299,8 @@ package main
|
|||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
"gorm.io/driver/mysql"
|
"gorm.io/driver/mysql"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
@@ -466,6 +476,12 @@ dsn, err := cfg.GetDatabaseDSN()
|
|||||||
|
|
||||||
**返回:** 短信配置对象(可能为nil)
|
**返回:** 短信配置对象(可能为nil)
|
||||||
|
|
||||||
|
### (c *Config) GetLogger() *LoggerConfig
|
||||||
|
|
||||||
|
获取日志配置。
|
||||||
|
|
||||||
|
**返回:** 日志配置对象(可能为nil)
|
||||||
|
|
||||||
## 注意事项
|
## 注意事项
|
||||||
|
|
||||||
1. **配置文件路径**:
|
1. **配置文件路径**:
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
### 1. 设置默认时区
|
### 1. 设置默认时区
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/datetime"
|
import "git.toowon.com/jimmy/go-common/datetime"
|
||||||
|
|
||||||
// 设置默认时区为上海时区
|
// 设置默认时区为上海时区
|
||||||
err := datetime.SetDefaultTimeZone(datetime.AsiaShanghai)
|
err := datetime.SetDefaultTimeZone(datetime.AsiaShanghai)
|
||||||
@@ -401,7 +401,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/datetime"
|
"git.toowon.com/jimmy/go-common/datetime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -428,7 +428,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/datetime"
|
"git.toowon.com/jimmy/go-common/datetime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -18,8 +18,8 @@
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/email"
|
"git.toowon.com/jimmy/go-common/email"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 从配置加载
|
// 从配置加载
|
||||||
@@ -107,7 +107,7 @@ if err != nil {
|
|||||||
### 5. 使用Message结构发送(便捷方法)
|
### 5. 使用Message结构发送(便捷方法)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/email"
|
import "git.toowon.com/jimmy/go-common/email"
|
||||||
|
|
||||||
msg := &email.Message{
|
msg := &email.Message{
|
||||||
To: []string{"to@example.com"},
|
To: []string{"to@example.com"},
|
||||||
@@ -295,8 +295,8 @@ package main
|
|||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/email"
|
"git.toowon.com/jimmy/go-common/email"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/factory"
|
"git.toowon.com/jimmy/go-common/factory"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 加载配置
|
// 加载配置
|
||||||
@@ -63,7 +63,21 @@ resp, err := smsClient.SendSimple(
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. 完整示例
|
### 4. 获取日志记录器(已初始化)
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 直接获取已初始化的日志记录器
|
||||||
|
logger, err := fac.GetLogger()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 直接使用,无需再创建
|
||||||
|
logger.Info("Application started")
|
||||||
|
logger.Error("Error occurred: %v", err)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 完整示例
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
@@ -71,8 +85,8 @@ package main
|
|||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/factory"
|
"git.toowon.com/jimmy/go-common/factory"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -152,6 +166,14 @@ func main() {
|
|||||||
|
|
||||||
**说明:** 如果短信配置为nil,返回错误。
|
**说明:** 如果短信配置为nil,返回错误。
|
||||||
|
|
||||||
|
### (f *Factory) GetLogger() (*logger.Logger, error)
|
||||||
|
|
||||||
|
获取日志记录器(已初始化)。
|
||||||
|
|
||||||
|
**返回:** 已初始化的日志记录器对象和错误信息
|
||||||
|
|
||||||
|
**说明:** 如果日志配置为nil,会使用默认配置创建。
|
||||||
|
|
||||||
### (f *Factory) GetConfig() *config.Config
|
### (f *Factory) GetConfig() *config.Config
|
||||||
|
|
||||||
获取配置对象。
|
获取配置对象。
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ HTTP Restful工具提供了标准化的HTTP请求和响应处理功能,包含
|
|||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"git.toowon.com/jimmy/go-commom/http"
|
"git.toowon.com/jimmy/go-common/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 简单成功响应(data为nil)
|
// 简单成功响应(data为nil)
|
||||||
@@ -198,7 +198,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"git.toowon.com/jimmy/go-commom/http"
|
"git.toowon.com/jimmy/go-common/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 用户列表接口
|
// 用户列表接口
|
||||||
|
|||||||
266
docs/logger.md
Normal file
266
docs/logger.md
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
# 日志工具文档
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
日志工具提供了统一的日志记录功能,使用Go标准库实现,无需第三方依赖。
|
||||||
|
|
||||||
|
## 功能特性
|
||||||
|
|
||||||
|
- 支持多种日志级别(debug, info, warn, error)
|
||||||
|
- 支持多种输出方式(stdout, stderr, file, both)
|
||||||
|
- 支持日志文件自动创建
|
||||||
|
- 支持日志前缀
|
||||||
|
- 支持禁用时间戳
|
||||||
|
- 支持带字段的日志记录
|
||||||
|
- 使用配置工具统一管理配置
|
||||||
|
|
||||||
|
## 使用方法
|
||||||
|
|
||||||
|
### 1. 从配置创建日志记录器(推荐)
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
|
"git.toowon.com/jimmy/go-common/factory"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 加载配置
|
||||||
|
cfg, err := config.LoadFromFile("./config.json")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用工厂创建日志记录器(已初始化,可直接使用)
|
||||||
|
fac := factory.NewFactory(cfg)
|
||||||
|
logger, err := fac.GetLogger()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 直接使用
|
||||||
|
logger.Info("Application started")
|
||||||
|
logger.Error("Failed to connect: %v", err)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 直接创建日志记录器
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
|
"git.toowon.com/jimmy/go-common/logger"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 从配置获取日志配置
|
||||||
|
cfg, _ := config.LoadFromFile("./config.json")
|
||||||
|
loggerConfig := cfg.GetLogger()
|
||||||
|
|
||||||
|
// 创建日志记录器
|
||||||
|
logger, err := logger.NewLogger(loggerConfig)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用默认配置(如果loggerConfig为nil)
|
||||||
|
logger, err := logger.NewLogger(nil)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 基本日志记录
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 记录不同级别的日志
|
||||||
|
logger.Debug("Debug message: %s", "debug info")
|
||||||
|
logger.Info("Info message: %s", "info")
|
||||||
|
logger.Warn("Warning message: %s", "warning")
|
||||||
|
logger.Error("Error message: %s", "error")
|
||||||
|
|
||||||
|
// 致命错误(会退出程序)
|
||||||
|
logger.Fatal("Fatal error: %s", "fatal")
|
||||||
|
|
||||||
|
// 恐慌错误(会触发panic)
|
||||||
|
logger.Panic("Panic error: %s", "panic")
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 带字段的日志记录
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 记录带字段的日志
|
||||||
|
fields := map[string]interface{}{
|
||||||
|
"user_id": 123,
|
||||||
|
"action": "login",
|
||||||
|
}
|
||||||
|
logger.Infof(fields, "User logged in")
|
||||||
|
logger.Errorf(fields, "Failed to process request")
|
||||||
|
```
|
||||||
|
|
||||||
|
## API 参考
|
||||||
|
|
||||||
|
### NewLogger(cfg *config.LoggerConfig) (*Logger, error)
|
||||||
|
|
||||||
|
创建日志记录器。
|
||||||
|
|
||||||
|
**参数:**
|
||||||
|
- `cfg`: 日志配置对象(如果为nil,使用默认配置)
|
||||||
|
|
||||||
|
**返回:** 日志记录器实例和错误信息
|
||||||
|
|
||||||
|
### (l *Logger) Debug(format string, v ...interface{})
|
||||||
|
|
||||||
|
记录调试日志。
|
||||||
|
|
||||||
|
### (l *Logger) Info(format string, v ...interface{})
|
||||||
|
|
||||||
|
记录信息日志。
|
||||||
|
|
||||||
|
### (l *Logger) Warn(format string, v ...interface{})
|
||||||
|
|
||||||
|
记录警告日志。
|
||||||
|
|
||||||
|
### (l *Logger) Error(format string, v ...interface{})
|
||||||
|
|
||||||
|
记录错误日志。
|
||||||
|
|
||||||
|
### (l *Logger) Fatal(format string, v ...interface{})
|
||||||
|
|
||||||
|
记录致命错误日志并退出程序。
|
||||||
|
|
||||||
|
### (l *Logger) Panic(format string, v ...interface{})
|
||||||
|
|
||||||
|
记录恐慌日志并触发panic。
|
||||||
|
|
||||||
|
### (l *Logger) Debugf(fields map[string]interface{}, format string, v ...interface{})
|
||||||
|
|
||||||
|
记录调试日志(带字段)。
|
||||||
|
|
||||||
|
### (l *Logger) Infof(fields map[string]interface{}, format string, v ...interface{})
|
||||||
|
|
||||||
|
记录信息日志(带字段)。
|
||||||
|
|
||||||
|
### (l *Logger) Warnf(fields map[string]interface{}, format string, v ...interface{})
|
||||||
|
|
||||||
|
记录警告日志(带字段)。
|
||||||
|
|
||||||
|
### (l *Logger) Errorf(fields map[string]interface{}, format string, v ...interface{})
|
||||||
|
|
||||||
|
记录错误日志(带字段)。
|
||||||
|
|
||||||
|
## 配置说明
|
||||||
|
|
||||||
|
日志配置通过 `config.LoggerConfig` 提供:
|
||||||
|
|
||||||
|
| 字段 | 类型 | 说明 | 默认值 |
|
||||||
|
|------|------|------|--------|
|
||||||
|
| Level | string | 日志级别: debug, info, warn, error | info |
|
||||||
|
| Output | string | 输出方式: stdout, stderr, file, both | stdout |
|
||||||
|
| FilePath | string | 日志文件路径(当output为file或both时必需) | - |
|
||||||
|
| Prefix | string | 日志前缀 | - |
|
||||||
|
| DisableTimestamp | bool | 禁用时间戳 | false |
|
||||||
|
|
||||||
|
## 配置示例
|
||||||
|
|
||||||
|
### 输出到标准输出
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"logger": {
|
||||||
|
"level": "info",
|
||||||
|
"output": "stdout",
|
||||||
|
"prefix": "app"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 输出到文件
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"logger": {
|
||||||
|
"level": "debug",
|
||||||
|
"output": "file",
|
||||||
|
"filePath": "./logs/app.log",
|
||||||
|
"prefix": "app"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 同时输出到标准输出和文件
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"logger": {
|
||||||
|
"level": "info",
|
||||||
|
"output": "both",
|
||||||
|
"filePath": "./logs/app.log",
|
||||||
|
"prefix": "app",
|
||||||
|
"disableTimestamp": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 日志级别说明
|
||||||
|
|
||||||
|
- **debug**: 调试信息,最详细的日志级别
|
||||||
|
- **info**: 一般信息,正常的程序运行信息
|
||||||
|
- **warn**: 警告信息,可能的问题但不影响程序运行
|
||||||
|
- **error**: 错误信息,程序运行中的错误
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **文件路径**:
|
||||||
|
- 当output为`file`或`both`时,必须提供`filePath`
|
||||||
|
- 日志文件目录会自动创建(如果不存在)
|
||||||
|
|
||||||
|
2. **日志级别**:
|
||||||
|
- 设置为`debug`时,会记录所有级别的日志
|
||||||
|
- 设置为`info`时,会记录info、warn、error级别的日志
|
||||||
|
- 设置为`warn`时,只记录warn和error级别的日志
|
||||||
|
- 设置为`error`时,只记录error级别的日志
|
||||||
|
|
||||||
|
3. **文件权限**:
|
||||||
|
- 日志文件创建时使用0666权限
|
||||||
|
- 目录创建时使用0755权限
|
||||||
|
|
||||||
|
4. **性能考虑**:
|
||||||
|
- 使用标准库log包,性能较好
|
||||||
|
- 文件输出使用追加模式,不会覆盖已有日志
|
||||||
|
|
||||||
|
## 完整示例
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
|
"git.toowon.com/jimmy/go-common/factory"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// 加载配置
|
||||||
|
cfg, err := config.LoadFromFile("./config.json")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用工厂创建日志记录器
|
||||||
|
fac := factory.NewFactory(cfg)
|
||||||
|
logger, err := fac.GetLogger()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用日志记录器
|
||||||
|
logger.Info("Application started")
|
||||||
|
|
||||||
|
// 记录带字段的日志
|
||||||
|
logger.Infof(map[string]interface{}{
|
||||||
|
"user_id": 123,
|
||||||
|
"action": "login",
|
||||||
|
}, "User logged in successfully")
|
||||||
|
|
||||||
|
logger.Error("An error occurred: %v", err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例
|
||||||
|
|
||||||
|
完整示例请参考 `examples/logger_example.go`
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ CORS中间件用于处理跨域资源共享,支持:
|
|||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -50,7 +50,7 @@ func main() {
|
|||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -131,9 +131,9 @@ corsHandler := middleware.CORS(corsConfig)(handler)
|
|||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
"git.toowon.com/jimmy/go-commom/http"
|
"git.toowon.com/jimmy/go-common/http"
|
||||||
"git.toowon.com/jimmy/go-commom/datetime"
|
"git.toowon.com/jimmy/go-common/datetime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func handler(w http.ResponseWriter, r *http.Request) {
|
func handler(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -162,8 +162,8 @@ func main() {
|
|||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
"git.toowon.com/jimmy/go-commom/datetime"
|
"git.toowon.com/jimmy/go-common/datetime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func handler(w http.ResponseWriter, r *http.Request) {
|
func handler(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -183,8 +183,8 @@ func main() {
|
|||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"git.toowon.com/jimmy/go-commom/http"
|
"git.toowon.com/jimmy/go-common/http"
|
||||||
"git.toowon.com/jimmy/go-commom/datetime"
|
"git.toowon.com/jimmy/go-common/datetime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetUserList(w http.ResponseWriter, r *http.Request) {
|
func GetUserList(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -240,7 +240,7 @@ X-Timezone: Asia/Shanghai
|
|||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
)
|
)
|
||||||
|
|
||||||
func handler(w http.ResponseWriter, r *http.Request) {
|
func handler(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -282,9 +282,9 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
"git.toowon.com/jimmy/go-commom/http"
|
"git.toowon.com/jimmy/go-common/http"
|
||||||
"git.toowon.com/jimmy/go-commom/datetime"
|
"git.toowon.com/jimmy/go-common/datetime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func apiHandler(w http.ResponseWriter, r *http.Request) {
|
func apiHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -331,8 +331,8 @@ package main
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
"git.toowon.com/jimmy/go-commom/http"
|
"git.toowon.com/jimmy/go-common/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
import (
|
import (
|
||||||
"gorm.io/driver/mysql"
|
"gorm.io/driver/mysql"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"git.toowon.com/jimmy/go-commom/migration"
|
"git.toowon.com/jimmy/go-common/migration"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 初始化数据库连接
|
// 初始化数据库连接
|
||||||
|
|||||||
10
docs/sms.md
10
docs/sms.md
@@ -19,8 +19,8 @@
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/sms"
|
"git.toowon.com/jimmy/go-common/sms"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 从配置加载
|
// 从配置加载
|
||||||
@@ -102,7 +102,7 @@ if err != nil {
|
|||||||
### 5. 使用SendRequest结构发送(便捷方法)
|
### 5. 使用SendRequest结构发送(便捷方法)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/sms"
|
import "git.toowon.com/jimmy/go-common/sms"
|
||||||
|
|
||||||
req := &sms.SendRequest{
|
req := &sms.SendRequest{
|
||||||
PhoneNumbers: []string{"13800138000", "13900139000"},
|
PhoneNumbers: []string{"13800138000", "13900139000"},
|
||||||
@@ -329,8 +329,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/sms"
|
"git.toowon.com/jimmy/go-common/sms"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/storage"
|
"git.toowon.com/jimmy/go-common/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 加载配置
|
// 加载配置
|
||||||
@@ -50,7 +50,7 @@ if err != nil {
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"os"
|
"os"
|
||||||
"git.toowon.com/jimmy/go-commom/storage"
|
"git.toowon.com/jimmy/go-common/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 打开文件
|
// 打开文件
|
||||||
@@ -81,7 +81,7 @@ fmt.Printf("File URL: %s\n", url)
|
|||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"git.toowon.com/jimmy/go-commom/storage"
|
"git.toowon.com/jimmy/go-common/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 创建上传处理器
|
// 创建上传处理器
|
||||||
@@ -125,7 +125,7 @@ curl -X POST http://localhost:8080/upload \
|
|||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"git.toowon.com/jimmy/go-commom/storage"
|
"git.toowon.com/jimmy/go-common/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 创建代理查看处理器
|
// 创建代理查看处理器
|
||||||
@@ -144,7 +144,7 @@ GET /file?key=images/test.jpg
|
|||||||
### 5. 生成对象键
|
### 5. 生成对象键
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "git.toowon.com/jimmy/go-commom/storage"
|
import "git.toowon.com/jimmy/go-common/storage"
|
||||||
|
|
||||||
// 生成简单对象键
|
// 生成简单对象键
|
||||||
objectKey := storage.GenerateObjectKey("images/", "test.jpg")
|
objectKey := storage.GenerateObjectKey("images/", "test.jpg")
|
||||||
@@ -288,9 +288,9 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
"git.toowon.com/jimmy/go-commom/storage"
|
"git.toowon.com/jimmy/go-common/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -344,8 +344,8 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/storage"
|
"git.toowon.com/jimmy/go-common/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
"net/smtp"
|
"net/smtp"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Email 邮件发送器
|
// Email 邮件发送器
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
// "gorm.io/driver/mysql"
|
// "gorm.io/driver/mysql"
|
||||||
// "gorm.io/gorm"
|
// "gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/datetime"
|
"git.toowon.com/jimmy/go-common/datetime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/datetime"
|
"git.toowon.com/jimmy/go-common/datetime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/email"
|
"git.toowon.com/jimmy/go-common/email"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/factory"
|
"git.toowon.com/jimmy/go-common/factory"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/http"
|
"git.toowon.com/jimmy/go-common/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 用户结构
|
// 用户结构
|
||||||
|
|||||||
52
examples/logger_example.go
Normal file
52
examples/logger_example.go
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
|
"git.toowon.com/jimmy/go-common/factory"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// 加载配置
|
||||||
|
cfg, err := config.LoadFromFile("./config/example.json")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Failed to load config:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用工厂创建日志记录器(推荐方式)
|
||||||
|
fac := factory.NewFactory(cfg)
|
||||||
|
logger, err := fac.GetLogger()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Failed to create logger:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 示例1:基本日志记录
|
||||||
|
logger.Info("Application started")
|
||||||
|
logger.Debug("Debug message: %s", "This is a debug message")
|
||||||
|
logger.Warn("Warning message: %s", "This is a warning")
|
||||||
|
logger.Error("Error message: %s", "This is an error")
|
||||||
|
|
||||||
|
// 示例2:带字段的日志记录
|
||||||
|
logger.Infof(map[string]interface{}{
|
||||||
|
"user_id": 123,
|
||||||
|
"action": "login",
|
||||||
|
"ip": "192.168.1.1",
|
||||||
|
}, "User logged in successfully")
|
||||||
|
|
||||||
|
logger.Errorf(map[string]interface{}{
|
||||||
|
"error_code": 1001,
|
||||||
|
"module": "database",
|
||||||
|
}, "Failed to connect to database: %v", "connection timeout")
|
||||||
|
|
||||||
|
// 示例3:不同级别的日志
|
||||||
|
logger.Debug("This is a debug log")
|
||||||
|
logger.Info("This is an info log")
|
||||||
|
logger.Warn("This is a warn log")
|
||||||
|
logger.Error("This is an error log")
|
||||||
|
|
||||||
|
// 注意:Fatal和Panic会终止程序,示例中不执行
|
||||||
|
// logger.Fatal("This would exit the program")
|
||||||
|
// logger.Panic("This would panic")
|
||||||
|
}
|
||||||
|
|
||||||
@@ -4,9 +4,9 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/datetime"
|
"git.toowon.com/jimmy/go-common/datetime"
|
||||||
"git.toowon.com/jimmy/go-commom/http"
|
"git.toowon.com/jimmy/go-common/http"
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 示例:使用CORS和时区中间件
|
// 示例:使用CORS和时区中间件
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
|
|
||||||
"gorm.io/driver/mysql"
|
"gorm.io/driver/mysql"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"git.toowon.com/jimmy/go-commom/migration"
|
"git.toowon.com/jimmy/go-common/migration"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/migration"
|
"git.toowon.com/jimmy/go-common/migration"
|
||||||
"gorm.io/driver/sqlite"
|
"gorm.io/driver/sqlite"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/sms"
|
"git.toowon.com/jimmy/go-common/sms"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
"git.toowon.com/jimmy/go-commom/storage"
|
"git.toowon.com/jimmy/go-common/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -3,9 +3,10 @@ package factory
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
"git.toowon.com/jimmy/go-commom/email"
|
"git.toowon.com/jimmy/go-common/email"
|
||||||
"git.toowon.com/jimmy/go-commom/sms"
|
"git.toowon.com/jimmy/go-common/logger"
|
||||||
|
"git.toowon.com/jimmy/go-common/sms"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Factory 工厂类,用于从配置创建各种客户端对象
|
// Factory 工厂类,用于从配置创建各种客户端对象
|
||||||
@@ -38,6 +39,16 @@ func (f *Factory) GetSMSClient() (*sms.SMS, error) {
|
|||||||
return sms.NewSMS(f.cfg.SMS)
|
return sms.NewSMS(f.cfg.SMS)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetLogger 获取日志记录器(已初始化)
|
||||||
|
// 返回已初始化的日志记录器对象,可直接使用
|
||||||
|
func (f *Factory) GetLogger() (*logger.Logger, error) {
|
||||||
|
if f.cfg.Logger == nil {
|
||||||
|
// 如果没有配置,使用默认配置创建
|
||||||
|
return logger.NewLogger(nil)
|
||||||
|
}
|
||||||
|
return logger.NewLogger(f.cfg.Logger)
|
||||||
|
}
|
||||||
|
|
||||||
// GetConfig 获取配置对象
|
// GetConfig 获取配置对象
|
||||||
func (f *Factory) GetConfig() *config.Config {
|
func (f *Factory) GetConfig() *config.Config {
|
||||||
return f.cfg
|
return f.cfg
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -1,4 +1,4 @@
|
|||||||
module git.toowon.com/jimmy/go-commom
|
module git.toowon.com/jimmy/go-common
|
||||||
|
|
||||||
go 1.21
|
go 1.21
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/middleware"
|
"git.toowon.com/jimmy/go-common/middleware"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ParseJSON 解析JSON请求体
|
// ParseJSON 解析JSON请求体
|
||||||
|
|||||||
207
logger/logger.go
Normal file
207
logger/logger.go
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
package logger
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Logger 日志记录器
|
||||||
|
type Logger struct {
|
||||||
|
infoLog *log.Logger
|
||||||
|
errorLog *log.Logger
|
||||||
|
warnLog *log.Logger
|
||||||
|
debugLog *log.Logger
|
||||||
|
config *config.LoggerConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLogger 创建日志记录器
|
||||||
|
func NewLogger(cfg *config.LoggerConfig) (*Logger, error) {
|
||||||
|
if cfg == nil {
|
||||||
|
// 使用默认配置
|
||||||
|
cfg = &config.LoggerConfig{
|
||||||
|
Level: "info",
|
||||||
|
Output: "stdout",
|
||||||
|
FilePath: "",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置默认值
|
||||||
|
if cfg.Level == "" {
|
||||||
|
cfg.Level = "info"
|
||||||
|
}
|
||||||
|
if cfg.Output == "" {
|
||||||
|
cfg.Output = "stdout"
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建输出目标
|
||||||
|
var writers []io.Writer
|
||||||
|
switch cfg.Output {
|
||||||
|
case "stdout":
|
||||||
|
writers = append(writers, os.Stdout)
|
||||||
|
case "stderr":
|
||||||
|
writers = append(writers, os.Stderr)
|
||||||
|
case "file":
|
||||||
|
if cfg.FilePath == "" {
|
||||||
|
return nil, fmt.Errorf("file path is required when output is file")
|
||||||
|
}
|
||||||
|
// 确保目录存在
|
||||||
|
dir := filepath.Dir(cfg.FilePath)
|
||||||
|
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to create log directory: %w", err)
|
||||||
|
}
|
||||||
|
file, err := os.OpenFile(cfg.FilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to open log file: %w", err)
|
||||||
|
}
|
||||||
|
writers = append(writers, file)
|
||||||
|
case "both":
|
||||||
|
writers = append(writers, os.Stdout)
|
||||||
|
if cfg.FilePath == "" {
|
||||||
|
return nil, fmt.Errorf("file path is required when output is both")
|
||||||
|
}
|
||||||
|
dir := filepath.Dir(cfg.FilePath)
|
||||||
|
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to create log directory: %w", err)
|
||||||
|
}
|
||||||
|
file, err := os.OpenFile(cfg.FilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to open log file: %w", err)
|
||||||
|
}
|
||||||
|
writers = append(writers, file)
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("invalid output type: %s", cfg.Output)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建多写入器
|
||||||
|
multiWriter := io.MultiWriter(writers...)
|
||||||
|
|
||||||
|
// 创建日志前缀
|
||||||
|
prefix := ""
|
||||||
|
if cfg.Prefix != "" {
|
||||||
|
prefix = cfg.Prefix + " "
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建日志记录器
|
||||||
|
logger := &Logger{
|
||||||
|
config: cfg,
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据日志级别创建不同的logger
|
||||||
|
flags := log.LstdFlags
|
||||||
|
if cfg.DisableTimestamp {
|
||||||
|
flags = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.Level == "debug" || cfg.Level == "info" || cfg.Level == "warn" || cfg.Level == "error" {
|
||||||
|
logger.infoLog = log.New(multiWriter, prefix+"[INFO] ", flags)
|
||||||
|
logger.warnLog = log.New(multiWriter, prefix+"[WARN] ", flags)
|
||||||
|
logger.errorLog = log.New(multiWriter, prefix+"[ERROR] ", flags)
|
||||||
|
if cfg.Level == "debug" {
|
||||||
|
logger.debugLog = log.New(multiWriter, prefix+"[DEBUG] ", flags)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return logger, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Debug 记录调试日志
|
||||||
|
func (l *Logger) Debug(format string, v ...interface{}) {
|
||||||
|
if l.debugLog != nil {
|
||||||
|
l.debugLog.Printf(format, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Info 记录信息日志
|
||||||
|
func (l *Logger) Info(format string, v ...interface{}) {
|
||||||
|
if l.infoLog != nil {
|
||||||
|
l.infoLog.Printf(format, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warn 记录警告日志
|
||||||
|
func (l *Logger) Warn(format string, v ...interface{}) {
|
||||||
|
if l.warnLog != nil {
|
||||||
|
l.warnLog.Printf(format, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error 记录错误日志
|
||||||
|
func (l *Logger) Error(format string, v ...interface{}) {
|
||||||
|
if l.errorLog != nil {
|
||||||
|
l.errorLog.Printf(format, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fatal 记录致命错误日志并退出程序
|
||||||
|
func (l *Logger) Fatal(format string, v ...interface{}) {
|
||||||
|
if l.errorLog != nil {
|
||||||
|
l.errorLog.Fatalf(format, v...)
|
||||||
|
} else {
|
||||||
|
log.Fatalf(format, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Panic 记录恐慌日志并触发panic
|
||||||
|
func (l *Logger) Panic(format string, v ...interface{}) {
|
||||||
|
if l.errorLog != nil {
|
||||||
|
l.errorLog.Panicf(format, v...)
|
||||||
|
} else {
|
||||||
|
log.Panicf(format, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithFields 创建带字段的日志记录器(简化版,返回格式化字符串)
|
||||||
|
func (l *Logger) WithFields(fields map[string]interface{}) *Logger {
|
||||||
|
// 返回自身,实际使用时可以在format中包含fields
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
// formatFields 格式化字段
|
||||||
|
func formatFields(fields map[string]interface{}) string {
|
||||||
|
if len(fields) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
result := ""
|
||||||
|
for k, v := range fields {
|
||||||
|
result += fmt.Sprintf("%s=%v ", k, v)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Debugf 记录调试日志(带字段)
|
||||||
|
func (l *Logger) Debugf(fields map[string]interface{}, format string, v ...interface{}) {
|
||||||
|
if l.debugLog != nil {
|
||||||
|
fieldStr := formatFields(fields)
|
||||||
|
l.debugLog.Printf(fieldStr+format, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Infof 记录信息日志(带字段)
|
||||||
|
func (l *Logger) Infof(fields map[string]interface{}, format string, v ...interface{}) {
|
||||||
|
if l.infoLog != nil {
|
||||||
|
fieldStr := formatFields(fields)
|
||||||
|
l.infoLog.Printf(fieldStr+format, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warnf 记录警告日志(带字段)
|
||||||
|
func (l *Logger) Warnf(fields map[string]interface{}, format string, v ...interface{}) {
|
||||||
|
if l.warnLog != nil {
|
||||||
|
fieldStr := formatFields(fields)
|
||||||
|
l.warnLog.Printf(fieldStr+format, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Errorf 记录错误日志(带字段)
|
||||||
|
func (l *Logger) Errorf(fields map[string]interface{}, format string, v ...interface{}) {
|
||||||
|
if l.errorLog != nil {
|
||||||
|
fieldStr := formatFields(fields)
|
||||||
|
l.errorLog.Printf(fieldStr+format, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/datetime"
|
"git.toowon.com/jimmy/go-common/datetime"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TimezoneKey context中存储时区的key
|
// TimezoneKey context中存储时区的key
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SMS 短信发送器
|
// SMS 短信发送器
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
commonhttp "git.toowon.com/jimmy/go-commom/http"
|
commonhttp "git.toowon.com/jimmy/go-common/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UploadHandler 文件上传处理器
|
// UploadHandler 文件上传处理器
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MinIOStorage MinIO存储实现
|
// MinIOStorage MinIO存储实现
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
// OSSStorage OSS存储实现
|
// OSSStorage OSS存储实现
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.toowon.com/jimmy/go-commom/config"
|
"git.toowon.com/jimmy/go-common/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Storage 存储接口
|
// Storage 存储接口
|
||||||
|
|||||||
Reference in New Issue
Block a user