- update zap

master v1.0.52
李光春 2 years ago
parent 5eaaf329a8
commit 0cbf7efddc

@ -14,6 +14,7 @@ import (
type ApiClient struct {
gormClient *dorm.GormClient // 数据库驱动
mongoClient *dorm.MongoClient // 数据库驱动
zapLog ZapLog // 日志服务
gormConfig struct {
tableName string // 表名
insideIp string // 内网ip
@ -49,6 +50,7 @@ type ApiClientConfig struct {
GormClientFun apiGormClientFun // 日志配置
MongoClientFun apiMongoClientFun // 日志配置
Debug bool // 日志开关
ZapLog ZapLog // 日志服务
}
// NewApiClient 创建接口实例化
@ -60,6 +62,8 @@ func NewApiClient(config *ApiClientConfig) (*ApiClient, error) {
c := &ApiClient{}
c.zapLog = config.ZapLog
gormClient, gormTableName := config.GormClientFun()
mongoClient, mongoDatabaseName, mongoCollectionName := config.MongoClientFun()

@ -10,7 +10,6 @@ import (
"go.dtapp.net/gourl"
"gorm.io/datatypes"
"gorm.io/gorm"
"log"
"os"
"runtime"
"time"
@ -21,6 +20,7 @@ import (
type ApiGormClientConfig struct {
GormClientFun apiGormClientFun // 日志配置
Debug bool // 日志开关
ZapLog ZapLog // 日志服务
}
// NewApiGormClient 创建接口实例化
@ -32,6 +32,8 @@ func NewApiGormClient(config *ApiGormClientConfig) (*ApiClient, error) {
c := &ApiClient{}
c.zapLog = config.ZapLog
client, tableName := config.GormClientFun()
if client == nil || client.Db == nil {
@ -47,7 +49,7 @@ func NewApiGormClient(config *ApiGormClientConfig) (*ApiClient, error) {
c.gormConfig.debug = config.Debug
err := c.gormClient.Db.Table(c.gormConfig.tableName).AutoMigrate(&apiPostgresqlLog{})
err := c.gormAutoMigrate()
if err != nil {
return nil, errors.New("创建表失败:" + err.Error())
}
@ -63,6 +65,11 @@ func NewApiGormClient(config *ApiGormClientConfig) (*ApiClient, error) {
return c, nil
}
// 创建模型
func (c *ApiClient) gormAutoMigrate() error {
return c.gormClient.Db.Table(c.gormConfig.tableName).AutoMigrate(&apiPostgresqlLog{})
}
// 模型结构体
type apiPostgresqlLog struct {
LogId uint `gorm:"primaryKey;comment:【记录】编号" json:"log_id,omitempty"` //【记录】编号
@ -125,17 +132,17 @@ func (c *ApiClient) GormMiddleware(ctx context.Context, request gorequest.Respon
SdkVersion: sdkVersion, //【程序】Sdk版本
}
if request.HeaderIsImg() {
log.Printf("[log.GormMiddleware]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.GormMiddleware]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
} else {
if len(dorm.JsonDecodeNoError(request.ResponseBody)) > 0 {
data.ResponseBody = request.ResponseBody //【返回】内容
} else {
log.Printf("[log.GormMiddleware]%s %s\n", data.RequestUri, request.ResponseBody)
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.GormMiddleware]%s %s\n", data.RequestUri, request.ResponseBody)
}
}
err := c.gormRecord(ctx, data)
if err != nil {
log.Printf("[log.GormMiddleware]%s\n", err.Error())
c.zapLog.WithTraceId(ctx).Sugar().Errorf("[log.GormMiddleware]%s\n", err.Error())
}
}
@ -156,17 +163,17 @@ func (c *ApiClient) GormMiddlewareXml(ctx context.Context, request gorequest.Res
SdkVersion: sdkVersion, //【程序】Sdk版本
}
if request.HeaderIsImg() {
log.Printf("[log.GormMiddlewareXml]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.GormMiddlewareXml]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
} else {
if len(dorm.XmlDecodeNoError(request.ResponseBody)) > 0 {
data.ResponseBody = datatypes.JSON(dorm.JsonEncodeNoError(dorm.XmlDecodeNoError(request.ResponseBody))) //【返回】内容
} else {
log.Printf("[log.GormMiddlewareXml]%s %s\n", data.RequestUri, request.ResponseBody)
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.GormMiddlewareXml]%s %s\n", data.RequestUri, request.ResponseBody)
}
}
err := c.gormRecord(ctx, data)
if err != nil {
log.Printf("[log.GormMiddlewareXml]%s\n", err.Error())
c.zapLog.WithTraceId(ctx).Sugar().Errorf("[log.GormMiddlewareXml]%s\n", err.Error())
}
}
@ -187,16 +194,16 @@ func (c *ApiClient) GormMiddlewareCustom(ctx context.Context, api string, reques
SdkVersion: sdkVersion, //【程序】Sdk版本
}
if request.HeaderIsImg() {
log.Printf("[log.GormMiddlewareCustom]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.GormMiddlewareCustom]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
} else {
if len(dorm.JsonDecodeNoError(request.ResponseBody)) > 0 {
data.ResponseBody = request.ResponseBody //【返回】内容
} else {
log.Printf("[log.GormMiddlewareCustom]%s %s\n", data.RequestUri, request.ResponseBody)
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.GormMiddlewareCustom]%s %s\n", data.RequestUri, request.ResponseBody)
}
}
err := c.gormRecord(ctx, data)
if err != nil {
log.Printf("[log.GormMiddlewareCustom]%s\n", err.Error())
c.zapLog.WithTraceId(ctx).Sugar().Errorf("[log.GormMiddlewareCustom]%s\n", err.Error())
}
}

@ -21,6 +21,7 @@ import (
type ApiMongoClientConfig struct {
MongoClientFun apiMongoClientFun // 日志配置
Debug bool // 日志开关
ZapLog ZapLog // 日志服务
}
// NewApiMongoClient 创建接口实例化
@ -33,6 +34,8 @@ func NewApiMongoClient(config *ApiMongoClientConfig) (*ApiClient, error) {
c := &ApiClient{}
c.zapLog = config.ZapLog
client, databaseName, collectionName := config.MongoClientFun()
if client == nil || client.Db == nil {
@ -179,17 +182,17 @@ func (c *ApiClient) MongoMiddleware(ctx context.Context, request gorequest.Respo
SdkVersion: sdkVersion, //【程序】Sdk版本
}
if request.ResponseHeader.Get("Content-Type") == "image/jpeg" || request.ResponseHeader.Get("Content-Type") == "image/png" || request.ResponseHeader.Get("Content-Type") == "image/jpg" {
log.Printf("[log.MongoMiddleware]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.MongoMiddleware]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
} else {
if len(dorm.JsonDecodeNoError(request.ResponseBody)) > 0 {
data.ResponseBody = dorm.JsonDecodeNoError(request.ResponseBody) //【返回】内容
} else {
log.Printf("[log.MongoMiddleware]%s %s\n", data.RequestUri, request.ResponseBody)
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.MongoMiddleware]%s %s\n", data.RequestUri, request.ResponseBody)
}
}
err := c.mongoRecord(ctx, data)
if err != nil {
log.Printf("[log.MongoMiddleware]%s\n", err.Error())
c.zapLog.WithTraceId(ctx).Sugar().Errorf("[log.MongoMiddleware]%s\n", err.Error())
}
}
@ -210,17 +213,17 @@ func (c *ApiClient) MongoMiddlewareXml(ctx context.Context, request gorequest.Re
SdkVersion: sdkVersion, //【程序】Sdk版本
}
if request.ResponseHeader.Get("Content-Type") == "image/jpeg" || request.ResponseHeader.Get("Content-Type") == "image/png" || request.ResponseHeader.Get("Content-Type") == "image/jpg" {
log.Printf("[log.MongoMiddlewareXml]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.MongoMiddlewareXml]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
} else {
if len(dorm.XmlDecodeNoError(request.ResponseBody)) > 0 {
data.ResponseBody = dorm.XmlDecodeNoError(request.ResponseBody) //【返回】内容
} else {
log.Printf("[log.MongoMiddlewareXml]%s %s\n", data.RequestUri, request.ResponseBody)
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.MongoMiddlewareXml]%s %s\n", data.RequestUri, request.ResponseBody)
}
}
err := c.mongoRecord(ctx, data)
if err != nil {
log.Printf("[log.MongoMiddlewareXml]%s\n", err.Error())
c.zapLog.WithTraceId(ctx).Sugar().Errorf("[log.MongoMiddlewareXml]%s\n", err.Error())
}
}
@ -241,16 +244,16 @@ func (c *ApiClient) MongoMiddlewareCustom(ctx context.Context, api string, reque
SdkVersion: sdkVersion, //【程序】Sdk版本
}
if request.ResponseHeader.Get("Content-Type") == "image/jpeg" || request.ResponseHeader.Get("Content-Type") == "image/png" || request.ResponseHeader.Get("Content-Type") == "image/jpg" {
log.Printf("[log.MongoMiddlewareCustom]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.MongoMiddlewareCustom]%s %s\n", data.RequestUri, request.ResponseHeader.Get("Content-Type"))
} else {
if len(dorm.JsonDecodeNoError(request.ResponseBody)) > 0 {
data.ResponseBody = dorm.JsonDecodeNoError(request.ResponseBody) //【返回】内容
} else {
log.Printf("[log.MongoMiddlewareCustom]%s %s\n", data.RequestUri, request.ResponseBody)
c.zapLog.WithTraceId(ctx).Sugar().Infof("[log.MongoMiddlewareCustom]%s %s\n", data.RequestUri, request.ResponseBody)
}
}
err := c.mongoRecord(ctx, data)
if err != nil {
log.Printf("[log.MongoMiddlewareCustom]%s\n", err.Error())
c.zapLog.WithTraceId(ctx).Sugar().Errorf("[log.MongoMiddlewareCustom]%s\n", err.Error())
}
}

@ -1,5 +1,5 @@
package golog
const (
Version = "1.0.51"
Version = "1.0.52"
)

@ -23,6 +23,7 @@ type GinClient struct {
gormClient *dorm.GormClient // 数据库驱动
mongoClient *dorm.MongoClient // 数据库驱动
ipService *goip.Client // ip服务
zapLog ZapLog // 日志服务
gormConfig struct {
tableName string // 表名
insideIp string // 内网ip
@ -59,6 +60,7 @@ type GinClientConfig struct {
GormClientFun ginGormClientFun // 日志配置
MongoClientFun apiMongoClientFun // 日志配置
Debug bool // 日志开关
ZapLog ZapLog // 日志服务
}
// NewGinClient 创建框架实例化
@ -71,6 +73,8 @@ func NewGinClient(config *GinClientConfig) (*GinClient, error) {
c := &GinClient{}
c.zapLog = config.ZapLog
gormClient, gormTableName := config.GormClientFun()
mongoClient, mongoDatabaseName, mongoCollectionName := config.MongoClientFun()

@ -16,7 +16,6 @@ import (
"gorm.io/datatypes"
"gorm.io/gorm"
"io/ioutil"
"log"
"net"
"os"
"runtime"
@ -28,6 +27,7 @@ type GinGormClientConfig struct {
IpService *goip.Client // ip服务
GormClientFun ginGormClientFun // 日志配置
Debug bool // 日志开关
ZapLog ZapLog // 日志服务
}
// NewGinGormClient 创建框架实例化
@ -40,6 +40,8 @@ func NewGinGormClient(config *GinGormClientConfig) (*GinClient, error) {
c := &GinClient{}
c.zapLog = config.ZapLog
client, tableName := config.GormClientFun()
if client == nil || client.Db == nil {
@ -57,7 +59,7 @@ func NewGinGormClient(config *GinGormClientConfig) (*GinClient, error) {
c.ipService = config.IpService
err := c.gormClient.Db.Table(c.gormConfig.tableName).AutoMigrate(&ginPostgresqlLog{})
err := c.gormAutoMigrate()
if err != nil {
return nil, errors.New("创建表失败:" + err.Error())
}
@ -73,6 +75,11 @@ func NewGinGormClient(config *GinGormClientConfig) (*GinClient, error) {
return c, nil
}
// 创建模型
func (c *GinClient) gormAutoMigrate() error {
return c.gormClient.Db.Table(c.gormConfig.tableName).AutoMigrate(&ginPostgresqlLog{})
}
// 模型结构体
type ginPostgresqlLog struct {
LogId uint `gorm:"primaryKey;comment:【记录】编号" json:"log_id,omitempty"` //【记录】编号
@ -151,12 +158,12 @@ func (c *GinClient) gormRecordJson(ginCtx *gin.Context, traceId string, requestT
if len(dorm.JsonEncodeNoError(requestBody)) > 0 {
data.RequestBody = datatypes.JSON(dorm.JsonEncodeNoError(requestBody)) //【请求】请求主体
} else {
log.Printf("[log.gormRecordJson]%s %s\n", data.RequestUri, requestBody)
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[log.gormRecordJson]%s %s\n", data.RequestUri, requestBody)
}
err := c.gormRecord(data)
if err != nil {
log.Printf("[golog.gormRecordJson]%s\n", err)
c.zapLog.WithTraceIdStr(traceId).Sugar().Errorf("[golog.gormRecordJson]%s\n", err)
}
}
@ -192,12 +199,12 @@ func (c *GinClient) gormRecordXml(ginCtx *gin.Context, traceId string, requestTi
if len(dorm.JsonEncodeNoError(requestBody)) > 0 {
data.RequestBody = datatypes.JSON(dorm.JsonEncodeNoError(requestBody)) //【请求】请求主体
} else {
log.Printf("[log.gormRecordXml]%s %s\n", data.RequestUri, requestBody)
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[log.gormRecordXml]%s %s\n", data.RequestUri, requestBody)
}
err := c.gormRecord(data)
if err != nil {
log.Printf("[golog.gormRecordXml]%s\n", err)
c.zapLog.WithTraceIdStr(traceId).Sugar().Errorf("[golog.gormRecordXml]%s\n", err)
}
}
@ -218,7 +225,7 @@ func (c *GinClient) GormMiddleware() gin.HandlerFunc {
data, _ := ioutil.ReadAll(ginCtx.Request.Body)
if c.gormConfig.debug {
log.Printf("[golog.GormMiddleware] %s\n", data)
c.zapLog.WithLogger().Sugar().Infof("[golog.GormMiddleware] %s\n", data)
}
// 复用
@ -254,12 +261,12 @@ func (c *GinClient) GormMiddleware() gin.HandlerFunc {
}
if c.gormConfig.debug {
log.Printf("[golog.GormMiddleware.len(jsonBody)] %v\n", len(jsonBody))
c.zapLog.WithLogger().Sugar().Infof("[golog.GormMiddleware.len(jsonBody)] %v\n", len(jsonBody))
}
if err != nil {
if c.gormConfig.debug {
log.Printf("[golog.GormMiddleware.json.Unmarshal] %s %s\n", jsonBody, err)
c.zapLog.WithLogger().Sugar().Infof("[golog.GormMiddleware.json.Unmarshal] %s %s\n", jsonBody, err)
}
dataJson = false
xmlBody = goxml.XmlDecode(string(data))
@ -267,8 +274,8 @@ func (c *GinClient) GormMiddleware() gin.HandlerFunc {
}
if c.gormConfig.debug {
log.Printf("[golog.GormMiddleware.xmlBody] %s\n", xmlBody)
log.Printf("[golog.GormMiddleware.jsonBody] %s\n", jsonBody)
c.zapLog.WithLogger().Sugar().Infof("[golog.GormMiddleware.xmlBody] %s\n", xmlBody)
c.zapLog.WithLogger().Sugar().Infof("[golog.GormMiddleware.jsonBody] %s\n", jsonBody)
}
clientIp := gorequest.ClientIp(ginCtx.Request)
@ -299,16 +306,16 @@ func (c *GinClient) GormMiddleware() gin.HandlerFunc {
if dataJson {
if c.gormConfig.debug {
log.Printf("[golog.GormMiddleware.gormRecord.json.request_body] %s\n", jsonBody)
log.Printf("[golog.GormMiddleware.gormRecord.json.request_body] %s\n", dorm.JsonEncodeNoError(jsonBody))
log.Printf("[golog.GormMiddleware.gormRecord.json.request_body] %s\n", datatypes.JSON(dorm.JsonEncodeNoError(jsonBody)))
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[golog.GormMiddleware.gormRecord.json.request_body] %s\n", jsonBody)
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[golog.GormMiddleware.gormRecord.json.request_body] %s\n", dorm.JsonEncodeNoError(jsonBody))
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[golog.GormMiddleware.gormRecord.json.request_body] %s\n", datatypes.JSON(dorm.JsonEncodeNoError(jsonBody)))
}
c.gormRecordJson(ginCtx, traceId, requestTime, jsonBody, responseCode, responseBody, startTime, endTime, clientIp, requestClientIpCountry, requestClientIpRegion, requestClientIpProvince, requestClientIpCity, requestClientIpIsp)
} else {
if c.gormConfig.debug {
log.Printf("[golog.GormMiddleware.gormRecord.xml.request_body] %s\n", xmlBody)
log.Printf("[golog.GormMiddleware.gormRecord.xml.request_body] %s\n", dorm.JsonEncodeNoError(xmlBody))
log.Printf("[golog.GormMiddleware.gormRecord.xml.request_body] %s\n", datatypes.JSON(dorm.JsonEncodeNoError(xmlBody)))
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[golog.GormMiddleware.gormRecord.xml.request_body] %s\n", xmlBody)
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[golog.GormMiddleware.gormRecord.xml.request_body] %s\n", dorm.JsonEncodeNoError(xmlBody))
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[golog.GormMiddleware.gormRecord.xml.request_body] %s\n", datatypes.JSON(dorm.JsonEncodeNoError(xmlBody)))
}
c.gormRecordXml(ginCtx, traceId, requestTime, xmlBody, responseCode, responseBody, startTime, endTime, clientIp, requestClientIpCountry, requestClientIpRegion, requestClientIpProvince, requestClientIpCity, requestClientIpIsp)
}

@ -18,7 +18,6 @@ import (
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"io/ioutil"
"log"
"net"
"os"
"runtime"
@ -30,6 +29,7 @@ type GinMongoClientConfig struct {
IpService *goip.Client // ip服务
MongoClientFun ginMongoClientFun // 日志配置
Debug bool // 日志开关
ZapLog ZapLog // 日志服务
}
// NewGinMongoClient 创建框架实例化
@ -43,6 +43,8 @@ func NewGinMongoClient(config *GinMongoClientConfig) (*GinClient, error) {
c := &GinClient{}
c.zapLog = config.ZapLog
client, databaseName, collectionName := config.MongoClientFun()
if client == nil || client.Db == nil {
@ -89,78 +91,78 @@ func (c *GinClient) mongoCreateCollection() {
"listCollections", 1,
}}).Decode(&commandResult)
if commandErr != nil {
log.Println("检查时间序列集合:", commandErr)
c.zapLog.WithLogger().Sugar().Error("检查时间序列集合:", commandErr)
} else {
err := c.mongoClient.Db.Database(c.mongoConfig.databaseName).CreateCollection(context.TODO(), c.mongoConfig.collectionName, options.CreateCollection().SetTimeSeriesOptions(options.TimeSeries().SetTimeField("request_time")))
if err != nil {
log.Println("创建时间序列集合:", err)
c.zapLog.WithLogger().Sugar().Error("创建时间序列集合:", err)
}
}
}
// 创建索引
func (c *GinClient) mongoCreateIndexes() {
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"trace_id", 1},
}}))
log.Printf(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"request_time", -1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"request_method", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"request_proto", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"request_ip", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"request_ip_country", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"request_ip_region", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"request_ip_province", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"request_ip_city", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"request_ip_isp", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"response_time", -1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"response_code", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"system_host_name", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"system_inside_ip", 1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"go_version", -1},
}}))
log.Println(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
c.zapLog.WithLogger().Sugar().Infof(c.mongoClient.Db.Database(c.mongoConfig.databaseName).Collection(c.mongoConfig.collectionName).Indexes().CreateOne(context.TODO(), mongo.IndexModel{
Keys: bson.D{
{"sdk_version", -1},
}}))
@ -248,12 +250,12 @@ func (c *GinClient) mongoRecordJson(ginCtx *gin.Context, traceId string, request
if len(dorm.JsonEncodeNoError(requestBody)) > 0 {
data.RequestBody = requestBody //【请求】请求主体
} else {
log.Printf("[log.mongoRecordJson]%s %s\n", data.RequestUri, requestBody)
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[log.mongoRecordJson]%s %s\n", data.RequestUri, requestBody)
}
err := c.mongoRecord(data)
if err != nil {
log.Printf("[golog.mongoRecordJson]%s\n", err)
c.zapLog.WithTraceIdStr(traceId).Sugar().Errorf("[golog.mongoRecordJson]%s\n", err)
}
}
@ -289,12 +291,12 @@ func (c *GinClient) mongoRecordXml(ginCtx *gin.Context, traceId string, requestT
if len(dorm.JsonEncodeNoError(requestBody)) > 0 {
data.RequestBody = requestBody //【请求】请求主体
} else {
log.Printf("[log.mongoRecordXml]%s %s\n", data.RequestUri, requestBody)
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[log.mongoRecordXml]%s %s\n", data.RequestUri, requestBody)
}
err := c.mongoRecord(data)
if err != nil {
log.Printf("[golog.mongoRecordXml]%s\n", err)
c.zapLog.WithTraceIdStr(traceId).Sugar().Errorf("[golog.mongoRecordXml]%s\n", err)
}
}
@ -315,7 +317,7 @@ func (c *GinClient) MongoMiddleware() gin.HandlerFunc {
data, _ := ioutil.ReadAll(ginCtx.Request.Body)
if c.mongoConfig.debug {
log.Printf("[golog.MongoMiddleware] %s\n", data)
c.zapLog.WithLogger().Sugar().Infof("[golog.MongoMiddleware] %s\n", data)
}
// 复用
@ -351,12 +353,12 @@ func (c *GinClient) MongoMiddleware() gin.HandlerFunc {
}
if c.mongoConfig.debug {
log.Printf("[golog.MongoMiddleware.len(jsonBody)] %v\n", len(jsonBody))
c.zapLog.WithLogger().Sugar().Infof("[golog.MongoMiddleware.len(jsonBody)] %v\n", len(jsonBody))
}
if err != nil {
if c.mongoConfig.debug {
log.Printf("[golog.MongoMiddleware.json.Unmarshal] %s %s\n", jsonBody, err)
c.zapLog.WithLogger().Sugar().Infof("[golog.MongoMiddleware.json.Unmarshal] %s %s\n", jsonBody, err)
}
dataJson = false
xmlBody = goxml.XmlDecode(string(data))
@ -364,8 +366,8 @@ func (c *GinClient) MongoMiddleware() gin.HandlerFunc {
}
if c.mongoConfig.debug {
log.Printf("[golog.MongoMiddleware.xmlBody] %s\n", xmlBody)
log.Printf("[golog.MongoMiddleware.jsonBody] %s\n", jsonBody)
c.zapLog.WithLogger().Sugar().Infof("[golog.MongoMiddleware.xmlBody] %s\n", xmlBody)
c.zapLog.WithLogger().Sugar().Infof("[golog.MongoMiddleware.jsonBody] %s\n", jsonBody)
}
clientIp := gorequest.ClientIp(ginCtx.Request)
@ -396,12 +398,12 @@ func (c *GinClient) MongoMiddleware() gin.HandlerFunc {
if dataJson {
if c.mongoConfig.debug {
log.Printf("[golog.MongoMiddleware.mongoRecord.json.request_body] %s\n", jsonBody)
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[golog.MongoMiddleware.mongoRecord.json.request_body] %s\n", jsonBody)
}
c.mongoRecordJson(ginCtx, traceId, requestTime, jsonBody, responseCode, responseBody, startTime, endTime, clientIp, requestClientIpCountry, requestClientIpRegion, requestClientIpProvince, requestClientIpCity, requestClientIpIsp)
} else {
if c.mongoConfig.debug {
log.Printf("[golog.MongoMiddleware.mongoRecord.xml.request_body] %s\n", xmlBody)
c.zapLog.WithTraceIdStr(traceId).Sugar().Infof("[golog.MongoMiddleware.mongoRecord.xml.request_body] %s\n", xmlBody)
}
c.mongoRecordXml(ginCtx, traceId, requestTime, xmlBody, responseCode, responseBody, startTime, endTime, clientIp, requestClientIpCountry, requestClientIpRegion, requestClientIpProvince, requestClientIpCity, requestClientIpIsp)
}

@ -5,8 +5,6 @@ go 1.19
require (
github.com/gin-gonic/gin v1.8.1
github.com/natefinch/lumberjack v2.0.0+incompatible
github.com/rs/zerolog v1.28.0
github.com/sirupsen/logrus v1.9.0
go.dtapp.net/dorm v1.0.30
go.dtapp.net/goip v1.0.28
go.dtapp.net/gorequest v1.0.28
@ -49,7 +47,6 @@ require (
github.com/klauspost/compress v1.15.9 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/lib/pq v1.10.6 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
@ -59,6 +56,7 @@ require (
github.com/saracen/go7z v0.0.0-20191010121135-9c09b6bd7fda // indirect
github.com/saracen/solidblock v0.0.0-20190426153529-45df20abab6f // indirect
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect
github.com/ugorji/go/codec v1.2.7 // indirect
@ -95,5 +93,5 @@ require (
modernc.org/libc v1.16.19 // indirect
modernc.org/sqlite v1.18.0 // indirect
xorm.io/builder v0.3.12 // indirect
xorm.io/xorm v1.3.1 // indirect
xorm.io/xorm v1.3.2 // indirect
)

@ -54,7 +54,6 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
@ -114,7 +113,6 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
github.com/goccy/go-json v0.8.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
@ -316,9 +314,6 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
@ -326,7 +321,6 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
@ -425,11 +419,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
@ -661,7 +652,6 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@ -909,5 +899,5 @@ sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1
xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE=
xorm.io/builder v0.3.12 h1:ASZYX7fQmy+o8UJdhlLHSW57JDOkM8DNhcAF5d0LiJM=
xorm.io/builder v0.3.12/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE=
xorm.io/xorm v1.3.1 h1:z5egKrDoOLqZFhMjcGF4FBHiTmE5/feQoHclfhNidfM=
xorm.io/xorm v1.3.1/go.mod h1:9NbjqdnjX6eyjRRhh01GHm64r6N9shTb/8Ak3YRt8Nw=
xorm.io/xorm v1.3.2 h1:uTRRKF2jYzbZ5nsofXVUx6ncMaek+SHjWYtCXyZo1oM=
xorm.io/xorm v1.3.2/go.mod h1:9NbjqdnjX6eyjRRhh01GHm64r6N9shTb/8Ak3YRt8Nw=

@ -1,35 +0,0 @@
package golog
import (
"context"
"github.com/sirupsen/logrus"
"go.dtapp.net/gotime"
"go.dtapp.net/gotrace_id"
)
type LogRusConsole struct {
logger *logrus.Logger // 日志服务
entry *logrus.Entry // 日志
}
// NewLogRusConsole 初始化控制台
func NewLogRusConsole() *LogRusConsole {
lrc := &LogRusConsole{}
lrc.logger = logrus.New()
// 设置文件名和方法信息
lrc.logger.SetReportCaller(true)
lrc.logger.SetFormatter(&logrus.TextFormatter{
ForceColors: true,
TimestampFormat: gotime.DateTimeFormat,
})
return lrc
}
// WithTraceId 跟踪编号
func (lrc *LogRusConsole) WithTraceId(ctx context.Context) *logrus.Entry {
return lrc.logger.WithField("trace_id", gotrace_id.GetTraceIdContext(ctx))
}

@ -1,208 +0,0 @@
package golog
import (
"context"
"fmt"
"github.com/sirupsen/logrus"
"go.dtapp.net/gotime"
"go.dtapp.net/gotrace_id"
"io"
"log"
"os"
"path"
)
type LogRusLogConfig struct {
LogPath string // 日志文件路径
LogInConsole bool // 是否同时输出到控制台
}
type LogRusLog struct {
config *LogRusLogConfig // 配置
logger *logrus.Logger // 日志服务
entry *logrus.Entry // 日志
level logrus.Level // 日志等级
}
func NewLogRusLog(config *LogRusLogConfig) *LogRusLog {
lr := &LogRusLog{config: config}
lr.logger = logrus.New()
// 设置为json格式
lr.logger.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: gotime.DateTimeFormat,
})
// 需要保存到文件
if lr.config.LogPath != "" {
lr.logger.SetReportCaller(true)
}
return lr
}
// 跟踪编号
func (lr *LogRusLog) withTraceId(ctx context.Context) *LogRusLog {
lr.entry = lr.logger.WithField("trace_id", gotrace_id.GetTraceIdContext(ctx))
return lr
}
// Print 打印
func (lr *LogRusLog) Print(ctx context.Context, args ...interface{}) {
lr.withTraceId(ctx)
lr.entry.Print(args...)
}
// Printf 打印
func (lr *LogRusLog) Printf(ctx context.Context, format string, args ...interface{}) {
lr.withTraceId(ctx)
lr.entry.Printf(format, args...)
}
// Println 打印
func (lr *LogRusLog) Println(ctx context.Context, args ...interface{}) {
lr.withTraceId(ctx)
lr.entry.Println(args...)
}
// Panic 记录日志然后panic
func (lr *LogRusLog) Panic(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Panic(args...)
}
// Panicf 记录日志然后panic
func (lr *LogRusLog) Panicf(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Panicf(format, args...)
}
// Fatal 有致命性错误,导致程序崩溃,记录日志,然后退出
func (lr *LogRusLog) Fatal(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Fatal(args...)
}
// Fatalf 有致命性错误,导致程序崩溃,记录日志,然后退出
func (lr *LogRusLog) Fatalf(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Fatalf(format, args...)
}
// Error 错误日志
func (lr *LogRusLog) Error(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Error(args...)
}
// Errorf 错误日志
func (lr *LogRusLog) Errorf(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Errorf(format, args...)
}
// Warn 警告日志
func (lr *LogRusLog) Warn(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Warn(args...)
}
// Warnf 警告日志
func (lr *LogRusLog) Warnf(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Warnf(format, args...)
}
// Info 核心流程日志
func (lr *LogRusLog) Info(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Info(args...)
}
// Infof 核心流程日志
func (lr *LogRusLog) Infof(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Infof(format, args...)
}
// Debug debug日志调试日志
func (lr *LogRusLog) Debug(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Debug(args...)
}
// Debugf debug日志调试日志
func (lr *LogRusLog) Debugf(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Debugf(format, args...)
}
// Trace 粒度超细的,一般情况下我们使用不上
func (lr *LogRusLog) Trace(ctx context.Context, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Debug(args...)
}
// Tracef 粒度超细的,一般情况下我们使用不上
func (lr *LogRusLog) Tracef(ctx context.Context, format string, args ...interface{}) {
lr.setOutPutFile()
lr.withTraceId(ctx)
lr.entry.Tracef(format, args...)
}
// https://www.fushengwushi.com/archives/1397
// https://blog.csdn.net/oscarun/article/details/114295955
// https://juejin.cn/post/6974353191974469668
func (lr *LogRusLog) setOutPutFile() {
// 是否保存到文件
if lr.config.LogPath == "" {
return
}
// 判断文件夹
if _, err := os.Stat(lr.config.LogPath); os.IsNotExist(err) {
err = os.MkdirAll(lr.config.LogPath, 0777)
if err != nil {
panic(fmt.Errorf("create log dir '%s' error: %s", lr.config.LogPath, err))
}
}
// 日志名
fileName := path.Join(lr.config.LogPath, "logrus."+gotime.Current().SetFormat(gotime.ShortDateFormat)+".log")
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
// 是否同时输出到控制台
if lr.config.LogInConsole {
lr.logger.SetOutput(os.Stdout)
writers := []io.Writer{
file,
os.Stdout,
}
fileAndStdoutWriter := io.MultiWriter(writers...)
if err == nil {
lr.logger.SetOutput(fileAndStdoutWriter)
} else {
log.Printf("无法记录到文件 %s\n", fileName)
}
} else {
lr.logger.SetOutput(file)
}
return
}

@ -1,46 +0,0 @@
package golog
import (
"context"
"go.dtapp.net/gotrace_id"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
)
type ZapConsole struct {
logger *zap.Logger // 日志服务
}
func NewZapConsole() *ZapConsole {
zc := &ZapConsole{}
zc.logger = zap.New(zapcore.NewCore(
zapcore.NewConsoleEncoder(zapcore.EncoderConfig{}),
zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout)),
zap.InfoLevel,
))
return zc
}
// 跟踪编号
func (zc *ZapConsole) getTraceId(ctx context.Context) zap.Field {
traceId := gotrace_id.GetTraceIdContext(ctx)
if traceId == "" {
return zap.Field{}
} else {
return zap.String("trace_id", traceId)
}
}
// Print 打印
func (zc *ZapConsole) Print(ctx context.Context, args ...interface{}) {
zc.logger.Sugar().Info(args, zc.getTraceId(ctx))
}
// Printf 打印
func (zc *ZapConsole) Printf(ctx context.Context, template string, args ...interface{}) {
zc.logger.Sugar().Infof(template, args, zc.getTraceId(ctx))
}

191
zap.go

@ -3,6 +3,8 @@ package golog
import (
"context"
"github.com/natefinch/lumberjack"
"go.dtapp.net/gotime"
"go.dtapp.net/gotrace_id"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
@ -12,63 +14,39 @@ import (
type ZapLogConfig struct {
LogPath string // 日志文件路径
LogName string // 日志文件名
LogLevel string // 日志级别 debug/info/warn/errordebug输出debug/info/warn/error日志。 info输出info/warn/error日志。 warn输出warn/error日志。 error输出error日志。
MaxSize int // 单个文件大小,MB
MaxBackups int // 保存的文件个数
MaxAge int // 保存的天数 0=不删除
Compress bool // 压缩
MaxSize int // 单位为MB,默认为512MB
MaxBackups int // 保留旧文件的最大个数
MaxAge int // 文件最多保存多少天 0=不删除
LocalTime bool // 采用本地时间
Compress bool // 是否压缩日志
EnableColor bool // level大写染色编码器
JsonFormat bool // 是否输出为json格式
ShowLine bool // 显示代码行
LogInConsole bool // 是否同时输出到控制台
}
type ZapLog struct {
config *ZapLogConfig
logger *zap.Logger
config *ZapLogConfig
logger *zap.Logger
zapCore zapcore.Core
}
func NewZapLog(config *ZapLogConfig) *ZapLog {
zl := &ZapLog{config: config}
// 设置日志级别
var level zapcore.Level
switch zl.config.LogLevel {
case "debug":
level = zap.DebugLevel
case "info":
level = zap.InfoLevel
case "warn":
level = zap.WarnLevel
case "error":
level = zap.ErrorLevel
default:
level = zap.InfoLevel
}
var (
syncer zapcore.WriteSyncer
// 自定义时间输出格式
customTimeEncoder = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}
// 自定义日志级别显示
customLevelEncoder = func(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(level.CapitalString())
}
)
var syncer zapcore.WriteSyncer
// 定义日志切割配置
hook := lumberjack.Logger{
Filename: zl.config.LogPath + zl.config.LogName, // 日志文件的位置
MaxSize: zl.config.MaxSize, // 在进行切割之前日志文件的最大大小以MB为单位
Filename: zl.config.LogPath + zl.config.LogName, // ⽇志⽂件路径
MaxSize: zl.config.MaxSize, // 单位为MB,默认为512MB
MaxBackups: zl.config.MaxBackups, // 保留旧文件的最大个数
Compress: zl.config.Compress, // 是否压缩 disabled by default
LocalTime: zl.config.LocalTime, // 采用本地时间
Compress: zl.config.Compress, // 是否压缩日志
}
if zl.config.MaxAge > 0 {
hook.MaxAge = zl.config.MaxAge // days
hook.MaxAge = zl.config.MaxAge // 文件最多保存多少天
}
// 判断是否控制台输出日志
@ -78,13 +56,23 @@ func NewZapLog(config *ZapLogConfig) *ZapLog {
syncer = zapcore.AddSync(&hook)
}
// 自定义时间输出格式
customTimeEncoder := func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format(gotime.DateTimeFormat))
}
// 自定义日志级别显示
customLevelEncoder := func(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(level.CapitalString())
}
// 定义zap配置信息
encoderConfig := zapcore.EncoderConfig{
encoderConf := zapcore.EncoderConfig{
CallerKey: "caller_line", // 打印文件名和行数
LevelKey: "level_name",
MessageKey: "msg",
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "line",
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeTime: customTimeEncoder, // 自定义时间格式
@ -94,92 +82,51 @@ func NewZapLog(config *ZapLogConfig) *ZapLog {
EncodeName: zapcore.FullNameEncoder,
}
var encoder zapcore.Encoder
// 判断是否json格式输出
if zl.config.JsonFormat {
encoder = zapcore.NewJSONEncoder(encoderConfig)
zl.zapCore = zapcore.NewCore(zapcore.NewJSONEncoder(encoderConf),
syncer, zap.NewAtomicLevelAt(zapcore.InfoLevel))
} else {
encoder = zapcore.NewConsoleEncoder(encoderConfig)
zl.zapCore = zapcore.NewCore(zapcore.NewConsoleEncoder(encoderConf),
syncer, zap.NewAtomicLevelAt(zapcore.InfoLevel))
}
core := zapcore.NewCore(
encoder,
syncer,
level,
)
zl.logger = zap.New(core)
// 判断是否显示代码行号
if zl.config.ShowLine {
zl.logger = zl.logger.WithOptions(zap.AddCaller())
}
zl.logger = zl.withShowLine(zap.New(zl.zapCore))
return zl
}
// Panic 记录日志然后panic
func (zl *ZapLog) Panic(ctx context.Context, args ...interface{}) {
zl.logger.Sugar().Panic(args...)
}
// Panicf 记录日志然后panic
func (zl *ZapLog) Panicf(ctx context.Context, template string, args ...interface{}) {
zl.logger.Sugar().Panicf(template, args...)
}
// Fatal 有致命性错误,导致程序崩溃,记录日志,然后退出
func (zl *ZapLog) Fatal(ctx context.Context, args ...interface{}) {
zl.logger.Sugar().Fatal(args...)
}
// Fatalf 有致命性错误,导致程序崩溃,记录日志,然后退出
func (zl *ZapLog) Fatalf(ctx context.Context, template string, args ...interface{}) {
zl.logger.Sugar().Fatalf(template, args...)
}
// Error 错误日志
func (zl *ZapLog) Error(ctx context.Context, args ...interface{}) {
zl.logger.Sugar().Error(args...)
}
// Errorf 错误日志
func (zl *ZapLog) Errorf(ctx context.Context, template string, args ...interface{}) {
zl.logger.Sugar().Errorf(template, args...)
}
// Warn 警告日志
func (zl *ZapLog) Warn(ctx context.Context, args ...interface{}) {
zl.logger.Sugar().Warn(args...)
}
// Warnf 警告日志
func (zl *ZapLog) Warnf(ctx context.Context, template string, args ...interface{}) {
zl.logger.Sugar().Warnf(template, args...)
}
// Info 核心流程日志
func (zl *ZapLog) Info(ctx context.Context, args ...interface{}) {
zl.logger.Sugar().Info(args...)
}
// Infof 核心流程日志
func (zl *ZapLog) Infof(ctx context.Context, template string, args ...interface{}) {
zl.logger.Sugar().Infof(template, args...)
}
// Debug debug日志调试日志
func (zl *ZapLog) Debug(ctx context.Context, args ...interface{}) {
zl.logger.Sugar().Debug(args...)
}
// Debugf debug日志调试日志
func (zl *ZapLog) Debugf(ctx context.Context, template string, args ...interface{}) {
zl.logger.Sugar().Debugf(template, args...)
}
// Trace 粒度超细的,一般情况下我们使用不上
func (zl *ZapLog) Trace(ctx context.Context, args ...interface{}) {
zl.logger.Sugar().Debug(args...)
// 判断是否显示代码行号
func (zl *ZapLog) withShowLine(logger *zap.Logger) *zap.Logger {
if zl.config.ShowLine {
logger = logger.WithOptions(zap.AddCaller())
}
return logger
}
// WithLogger 跟踪编号
func (zl *ZapLog) WithLogger() *zap.Logger {
return zl.logger
}
// WithTraceId 跟踪编号
func (zl *ZapLog) WithTraceId(ctx context.Context) *zap.Logger {
logger := zl.logger
logger = logger.With(zapcore.Field{
Key: "trace_id",
Type: zapcore.StringType,
String: gotrace_id.GetTraceIdContext(ctx),
})
return logger
}
// WithTraceIdStr 跟踪编号
func (zl *ZapLog) WithTraceIdStr(traceId string) *zap.Logger {
logger := zl.logger
logger = logger.With(zapcore.Field{
Key: "trace_id",
Type: zapcore.StringType,
String: traceId,
})
return logger
}

@ -1,46 +0,0 @@
package golog
import (
"context"
"github.com/rs/zerolog"
"go.dtapp.net/gotime"
"go.dtapp.net/gotrace_id"
)
type ZeroLogConsole struct {
logger zerolog.Logger // 日志服务
w zerolog.ConsoleWriter // 日志
}
// NewZeroLogConsole 初始化控制台
func NewZeroLogConsole() *ZeroLogConsole {
zlc := &ZeroLogConsole{}
zlc.w = zerolog.NewConsoleWriter()
zlc.w.TimeFormat = gotime.DateTimeFormat
return zlc
}
// 跟踪编号
func (zlc *ZeroLogConsole) withTraceId(ctx context.Context) {
traceId := gotrace_id.GetTraceIdContext(ctx)
if traceId == "" {
zlc.logger = zerolog.New(zlc.w).With().Timestamp().Logger()
} else {
zlc.logger = zerolog.New(zlc.w).With().Str("trace_id", gotrace_id.GetTraceIdContext(ctx)).Timestamp().Logger()
}
}
// Print 打印
func (zlc *ZeroLogConsole) Print(ctx context.Context, v ...interface{}) {
zlc.withTraceId(ctx)
zlc.logger.Print(v...)
}
// Printf 打印
func (zlc *ZeroLogConsole) Printf(ctx context.Context, format string, v ...interface{}) {
zlc.withTraceId(ctx)
zlc.logger.Printf(format, v...)
}

@ -1,88 +0,0 @@
package golog
import (
"github.com/natefinch/lumberjack"
"github.com/rs/zerolog"
"io"
"time"
)
type ZeroLogLog struct {
}
type (
Logger = *zerolog.Logger
Level = zerolog.Level
)
var (
DebugLevel = zerolog.DebugLevel
InfoLevel = zerolog.InfoLevel
WarnLevel = zerolog.WarnLevel
ErrorLevel = zerolog.ErrorLevel
)
// Config 可用在配置文件中
type Config struct {
Filename string // 日志文件
MaxSize int // megabytes
MaxBackups int // MaxBackups
MaxAge int // days
Fields map[string]string // slog的初始化字段(session)
IsJSON bool // 默认是非json格式
}
// New 日常使用的log, 建议使用json效率更高
func New(c Config) Logger {
// init zerolog format
zerolog.TimeFieldFormat = "2006-01-02T15:04:05.000"
zerolog.DurationFieldInteger = true
zerolog.TimestampFieldName = "timestamp"
zerolog.DurationFieldUnit = time.Millisecond
out := &lumberjack.Logger{
Filename: c.Filename,
MaxSize: c.MaxSize, // megabytes
MaxBackups: c.MaxBackups, // MaxBackups
MaxAge: c.MaxAge, // days
LocalTime: true, // 这个需要设置, 不然日志文件的名字就是UTC时间
}
var zout io.Writer
if c.IsJSON {
zout = out
} else {
w := zerolog.NewConsoleWriter()
w.TimeFormat = "2006-01-02T15:04:05.000"
w.NoColor = true
w.FormatLevel = formatLevel
w.Out = out
zout = w
}
zc := zerolog.New(zout).With().Timestamp()
for k, v := range c.Fields {
zc = zc.Str(k, v)
}
slog := zc.Logger()
return &slog
}
// NewConsole 创建终端日志格式
func NewConsole() Logger {
w := zerolog.NewConsoleWriter()
w.TimeFormat = "01-02T15:04:05"
w.NoColor = true
w.FormatLevel = formatLevel
log := zerolog.New(w).With().Timestamp().Logger()
return &log
}
// formatLevel 不用默认的, 用比较直观的
// 参考: https://github.com/rs/zerolog/blob/master/console.go#L315
func formatLevel(i interface{}) string {
if ll, ok := i.(string); ok {
return ll
}
return "" // 异常时候, level为空
}
Loading…
Cancel
Save