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.
go-library/utils/golog/gin.go

105 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package golog
import (
"go.dtapp.net/library/utils/goip"
"gorm.io/datatypes"
"gorm.io/gorm"
"log"
"os"
"runtime"
"strings"
)
type GinConfig struct {
Db *gorm.DB // 驱动
TableName string // 表名
}
// Gin 框架
type Gin struct {
db *gorm.DB // pgsql数据库
tableName string // 日志表名
insideIp string // 内网ip
hostname string // 主机名
goVersion string // go版本
}
// NewGin 创建框架实例化
func NewGin(config *GinConfig) *Gin {
app := &Gin{}
if config.Db == nil {
panic("驱动不正常")
}
if config.TableName == "" {
panic("表名不能为空")
}
hostname, _ := os.Hostname()
app.db = config.Db
app.tableName = config.TableName
app.hostname = hostname
app.insideIp = goip.GetInsideIp()
app.goVersion = strings.TrimPrefix(runtime.Version(), "go")
app.AutoMigrate()
return app
}
// GinPostgresqlLog 结构体
type GinPostgresqlLog struct {
LogId uint `gorm:"primaryKey" json:"log_id"` //【记录】编号
TraceId string `gorm:"type:text" json:"trace_id"` //【系统】链编号
RequestTime TimeString `gorm:"index" json:"request_time"` //【请求】时间
RequestUri string `gorm:"type:text" json:"request_uri"` //【请求】请求链接 域名+路径+参数
RequestUrl string `gorm:"type:text" json:"request_url"` //【请求】请求链接 域名+路径
RequestApi string `gorm:"type:text;index" json:"request_api"` //【请求】请求接口 路径
RequestMethod string `gorm:"type:text;index" json:"request_method"` //【请求】请求方式
RequestProto string `gorm:"type:text" json:"request_proto"` //【请求】请求协议
RequestUa string `gorm:"type:text" json:"request_ua"` //【请求】请求UA
RequestReferer string `gorm:"type:text" json:"request_referer"` //【请求】请求referer
RequestBody datatypes.JSON `gorm:"type:jsonb" json:"request_body"` //【请求】请求主体
RequestUrlQuery datatypes.JSON `gorm:"type:jsonb" json:"request_url_query"` //【请求】请求URL参数
RequestIp string `gorm:"type:text" json:"request_ip"` //【请求】请求客户端Ip
RequestIpCountry string `gorm:"type:text" json:"request_ip_country"` //【请求】请求客户端城市
RequestIpRegion string `gorm:"type:text" json:"request_ip_region"` //【请求】请求客户端区域
RequestIpProvince string `gorm:"type:text" json:"request_ip_province"` //【请求】请求客户端省份
RequestIpCity string `gorm:"type:text" json:"request_ip_city"` //【请求】请求客户端城市
RequestIpIsp string `gorm:"type:text" json:"request_ip_isp"` //【请求】请求客户端运营商
RequestHeader datatypes.JSON `gorm:"type:jsonb" json:"request_header"` //【请求】请求头
ResponseTime TimeString `gorm:"index" json:"response_time"` //【返回】时间
ResponseCode int `gorm:"type:bigint" json:"response_code"` //【返回】状态码
ResponseMsg string `gorm:"type:text" json:"response_msg"` //【返回】描述
ResponseData datatypes.JSON `gorm:"type:jsonb" json:"response_data"` //【返回】数据
CostTime int64 `gorm:"type:bigint" json:"cost_time"` //【系统】花费时间
SystemHostName string `gorm:"type:text" json:"system_host_name"` //【系统】主机名
SystemInsideIp string `gorm:"type:text" json:"system_inside_ip"` //【系统】内网ip
GoVersion string `gorm:"type:text" json:"go_version"` //【程序】Go版本
}
// AutoMigrate 自动迁移
func (p *Gin) AutoMigrate() {
err := p.db.Table(p.tableName).AutoMigrate(&GinPostgresqlLog{})
if err != nil {
panic("创建表失败:" + err.Error())
}
}
// Record 记录日志
func (p *Gin) Record(content GinPostgresqlLog) *gorm.DB {
content.SystemHostName = p.hostname
if content.SystemInsideIp == "" {
content.SystemInsideIp = p.insideIp
}
content.GoVersion = p.goVersion
resp := p.db.Table(p.tableName).Create(&content)
if resp.RowsAffected == 0 {
log.Println("Gin", resp.Error)
}
return resp
}
// Query 查询
func (p *Gin) Query() *gorm.DB {
return p.db.Table(p.tableName)
}