Commit 691491e6 by wang

解决冲突后提交

parent 97e9c5e1
...@@ -53,7 +53,7 @@ func Error_Middleware() gin.HandlerFunc { ...@@ -53,7 +53,7 @@ func Error_Middleware() gin.HandlerFunc {
defer func() { defer func() {
if err:=recover(); err!=nil{ if err:=recover(); err!=nil{
errMsg:=fmt.Sprintf("%s",err) errMsg:=fmt.Sprintf("%s",err)
common.NResponse(errMsg,500).SetLogFilePre("saveSku").OpenRecordReuquest(ctx).OutPut() common.NResponse(errMsg).SetLogHandel(saveLogHandle).OutPut(ctx)
} }
}() }()
ctx.Next() ctx.Next()
......
...@@ -6,6 +6,7 @@ import ( ...@@ -6,6 +6,7 @@ import (
"go_sku_server/model/saveModel" "go_sku_server/model/saveModel"
"go_sku_server/pkg/common" "go_sku_server/pkg/common"
"go_sku_server/pkg/e" "go_sku_server/pkg/e"
"go_sku_server/pkg/logger"
"go_sku_server/service" "go_sku_server/service"
) )
...@@ -35,12 +36,14 @@ sku基本数据增加和修改 ...@@ -35,12 +36,14 @@ sku基本数据增加和修改
Attrs int `json:"attrs" ` Attrs int `json:"attrs" `
*/ */
func SaveSku(ctx *gin.Context) { func SaveSku(ctx *gin.Context) {
//参数验证 //参数验证
var lySaveRequest saveModel.LySaveRequest var lySaveRequest saveModel.LySaveRequest
if err := ctx.ShouldBindBodyWith(&lySaveRequest,binding.JSON); err != nil { if err := ctx.ShouldBindBodyWith(&lySaveRequest,binding.JSON); err != nil {
common.NResponse(err.Error()).SetLogFilePre("saveSku").OpenRecordReuquest(ctx).OutPut() common.NResponse(err.Error()).SetLogHandel(saveLogHandle).OutPut(ctx)
return return
} }
//执行skuSave //执行skuSave
...@@ -48,11 +51,13 @@ func SaveSku(ctx *gin.Context) { ...@@ -48,11 +51,13 @@ func SaveSku(ctx *gin.Context) {
serviceErr,skuId:=LySave.SaveSku(lySaveRequest,ctx) serviceErr,skuId:=LySave.SaveSku(lySaveRequest,ctx)
//错误处理 //错误处理
if(serviceErr!=nil){ if(serviceErr!=nil){
code:=10001
errMsg:=serviceErr.Error()
if err,ok:=serviceErr.(*e.ApiError);ok{ if err,ok:=serviceErr.(*e.ApiError);ok{
common.NResponse(err.Error(),err.Code).SetLogFilePre("saveSku").OpenRecordReuquest(ctx).OutPut() code=err.Code
}else{ errMsg=err.ErrMsg
common.NResponse(err.Error(),err.Code).SetLogFilePre("saveSku").OpenRecordReuquest(ctx).OutPut()
} }
common.NResponse(errMsg,code).SetLogHandel(saveLogHandle).OpenParamLog().OutPut(ctx)
}else {//执行成功 }else {//执行成功
res:=saveModel.LySaveResponse{0,"ok",skuId} res:=saveModel.LySaveResponse{0,"ok",skuId}
common.NResponse(&res).OutPut(ctx) common.NResponse(&res).OutPut(ctx)
...@@ -66,26 +71,32 @@ func SkuEdit(ctx *gin.Context) { ...@@ -66,26 +71,32 @@ func SkuEdit(ctx *gin.Context) {
//参数验证 //参数验证
var lyeditRequest saveModel.LyEditRequest var lyeditRequest saveModel.LyEditRequest
if err := ctx.ShouldBindBodyWith(&lyeditRequest,binding.JSON); err != nil { if err := ctx.ShouldBindBodyWith(&lyeditRequest,binding.JSON); err != nil {
common.NResponse(err.Error()).SetLogFilePre("editSku").OpenRecordReuquest(ctx).OutPut() common.NResponse(err.Error()).SetLogHandel(editLogHandle).OutPut(ctx)
return return
} }
//执行skuSave //执行skuSave
LySave:=service.LySaveService{} LySave:=service.LySaveService{}
serviceErr,skuId:=LySave.SkuEdit(lyeditRequest) serviceErr,skuId:=LySave.SkuEdit(lyeditRequest)
//错误处理 //错误处理
if(serviceErr!=nil){ if(serviceErr!=nil){
if err,ok:=serviceErr.(*e.ApiError);ok{ if err,ok:=serviceErr.(*e.ApiError);ok{
common.NResponse(err.Error(),err.Code).SetLogFilePre("saveSku").OpenRecordReuquest(ctx).OutPut() common.NResponse(err.Error()).SetLogHandel(editLogHandle).OutPut(ctx)
}else{ }else{
common.NResponse(err.Error(),err.Code).SetLogFilePre("saveSku").OpenRecordReuquest(ctx).OutPut() common.NResponse(err.Error()).SetLogHandel(editLogHandle).OutPut(ctx)
} }
}else {//执行成功 }else {//执行成功
res:=saveModel.LySaveResponse{0,"ok",skuId} res:=saveModel.LySaveResponse{0,"ok",skuId}
common.NResponse(&res).OutPut(ctx) common.NResponse(&res).OutPut(ctx)
} }
return return
}
func saveLogHandle(errMsg string) {
logger.Select("sku_save").Error(errMsg)
} }
func editLogHandle(errMsg string) {
logger.Select("sku_save").Error(errMsg)
}
### 日志
### 同步日志
#### 调用方法
不需要额外配置
```json
import ("go_sku_server/pkg/logger")
logger.SyncInsert("sku_save","记录一下日志",logger.LogLevelError) //记录错误日志
logger.SyncInsert("sku_save","记录一下日志",logger.LogLevelDebug) //记录debug日志
logger.SyncInsert("sku_save","记录一下日志") //默认记录info
```
### 异步日志
#### 配置文件
```ini
[log_config]
1=sku_save,5
2=sku_edit,5
```
比如 sku_save,5 路径 sku_save 即文件夹是 sku 文件名类似 是save_2020-12-10.log
#### 调用示例
```json
import ("go_sku_server/pkg/logger")
logger.Select("sku_save").Info(errMsg)
logger.Select("sku_save").Error(errMsg)
```
\ No newline at end of file
...@@ -3,13 +3,23 @@ package common ...@@ -3,13 +3,23 @@ package common
import ( import (
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"go_sku_server/pkg/logger"
"reflect" "reflect"
) )
/** /**
@author wangsong @author wangsong
输出工具,输出json 和输出日志(链式调用) 输出工具,输出json 和输出日志(链式调用)
一、输出json
1 输出json支持自定义传struct 和默认的输出格式
common.NResponse().OutPut(ctx) //输出正确
common.NResponse("错了",100).SetLogFilePre("sku").OutPut(ctx) //输出错误,并存日志到文件 ******_sku.txt
2.输出 自定义 struct
common.NResponse(&struct).SetLogFilePre("sku").OutPut(ctx)
二、单独输出日志
common.NResponse().SetLogContent("进来了").OutPutLog()
尚未完善的地方
1.输出日志渠道 文件,数据库,oss之类
2.可以多次设置输出对象的 code 和 errMsg,目前只有第一次设置
*/ */
//接口 //接口
type NewOutPut interface { type NewOutPut interface {
...@@ -17,21 +27,37 @@ type NewOutPut interface { ...@@ -17,21 +27,37 @@ type NewOutPut interface {
GetErrorMsg() string GetErrorMsg() string
} }
//输出类 //输出类
type NewResponse struct { type NewResponse struct {
LogDrive *logDrive logTool
OutPutData NewOutPut outPutData NewOutPut
ctx *gin.Context //gin http ctx *gin.Context //gin http
} }
//日志类 //日志类
type logDrive struct { type logTool struct {
openLog bool //开启记录log openLog bool //开启记录log
LogfilePre string //文件前缀 logPath string //文件前缀
isRecordReuquest bool //记录请求参数 openParamLog bool //记录请求参数
logContent string //日志内容,会与ErrorMesg一起记录 logContent string //日志内容,会与ErrorMesg一起记录
loghandleFunc func(string)
//logger.LogInterface
//logConfig map[string]string
//logDrive logger.LogInterface
} }
/*//日志类
type logTool struct {
openLog bool //开启记录log
LogfilePre string //文件前缀
openParamLog bool //记录请求参数
logContent string //日志内容,会与ErrorMesg一起记录
loghandleFunc func(logger.LogInterface,string)
}*/
//内部默认输出结构 //内部默认输出结构
type defaultOutPutDate struct { type defaultOutPutDate struct {
ErrCode int `json:"errcode"` ErrCode int `json:"errcode"`
...@@ -43,42 +69,42 @@ type defaultOutPutDate struct { ...@@ -43,42 +69,42 @@ type defaultOutPutDate struct {
func NResponse( opt...interface{}) *NewResponse { func NResponse( opt...interface{}) *NewResponse {
newResponse:=&NewResponse{} newResponse:=&NewResponse{}
newResponse.createOutPutData(opt) newResponse.createoutPutData(opt)
log:=&logDrive{} newResponse.logPath="logs"
newResponse.LogDrive=log
newResponse.LogDrive.LogfilePre="defaltLog"
return newResponse return newResponse
} }
//设置输出对象 //设置输出对象
func (NR *NewResponse) SetOutPutData(newOutPut NewOutPut) *NewResponse{ func (NR *NewResponse) SetoutPutData(newOutPut NewOutPut) *NewResponse{
NR.OutPutData=newOutPut NR.outPutData=newOutPut
return NR return NR
} }
//设置日志内容 //设置日志内容
func (NR *NewResponse) SetLogContent(logStr string) *NewResponse{ func (NR *NewResponse) SetLogContent(logStr string) *NewResponse{
NR.LogDrive.logContent=logStr NR.logContent=logStr
NR.LogDrive.openLog=true NR.openLog=true
return NR return NR
} }
//设置日志文件前缀 //设置日志路径
func (NR *NewResponse) SetLogFilePre(filePre string) *NewResponse{ /*func (NR *NewResponse) SetLogPath(filePre string) *NewResponse{
NR.LogDrive.openLog=true NR.logConfig["log_chan_size"]="10"
NR.LogDrive.LogfilePre=filePre NR.logConfig["log_path"] = filePre
log ,_:=logger.InitLogger("file",NR.logConfig)
log.Init()
NR.logDrive=log
return NR return NR
} }*/
/** /**
开启日志记录参数 开启日志记录参数
ctx 可以不传,传必须是ctx gin.Context ctx 可以不传,传必须是ctx gin.Context
*/ */
func (NR *NewResponse) OpenRecordReuquest(ctx...interface{}) *NewResponse{ func (NR *NewResponse) OpenParamLog() *NewResponse{
NR.setjudgeCtx(ctx) NR.openLog=true
NR.LogDrive.openLog=true NR.openParamLog=true
NR.LogDrive.isRecordReuquest=true
return NR return NR
} }
...@@ -90,7 +116,12 @@ func (NR *NewResponse) SetCtx(ctx *gin.Context) *NewResponse{ ...@@ -90,7 +116,12 @@ func (NR *NewResponse) SetCtx(ctx *gin.Context) *NewResponse{
//开启日志 //开启日志
func (NR *NewResponse) OpenLog() *NewResponse{ func (NR *NewResponse) OpenLog() *NewResponse{
NR.LogDrive.openLog=true NR.openLog=true
return NR
}
func (NR *NewResponse) SetLogHandel(a func(string)) *NewResponse {
NR.loghandleFunc=a
return NR return NR
} }
...@@ -98,42 +129,64 @@ func (NR *NewResponse) OpenLog() *NewResponse{ ...@@ -98,42 +129,64 @@ func (NR *NewResponse) OpenLog() *NewResponse{
/** /**
ctx gin.Context 只处理一个 ctx gin.Context 只处理一个
*/ */
func (NR *NewResponse) OutPut(ctx ...interface{}) { func (NR *NewResponse) OutPut(ctx *gin.Context) {
NR.setjudgeCtx(ctx) NR.SetCtx(ctx)
NR.logHandle()//日志处理 if(reflect.ValueOf(NR.loghandleFunc).IsZero()!=true){
if(reflect.ValueOf(NR.OutPutData).IsZero()==true){//没有输出对象,就用默认的 NR.loghandleFunc(NR.getLogErrorStr())//日志处理
NR.OutPutData=&defaultOutPutDate{0,"ok",nil}
} }
NR.ctx.JSONP(200,NR.OutPutData) if(reflect.ValueOf(NR.outPutData).IsZero()==true){//没有输出对象,就用默认的
NR.outPutData=&defaultOutPutDate{0,"ok",nil}
}
NR.ctx.JSONP(200,NR.outPutData)
}
/**
正确输出
*/
func (NR *NewResponse) SucessOutPut(ctx *gin.Context) {
NR.SetCtx(ctx)
NR.loghandleFunc(NR.getLogErrorStr())//日志处理//日志处理
NR.outPutData=&defaultOutPutDate{0,"ok",nil}
NR.ctx.JSONP(200,NR.outPutData)
} }
//仅输出日志(目前是存文件) /**
func (NR *NewResponse) OutPutLog() { 错误输出
NR.OpenLog() */
NR.logHandle()//日志处理 func (NR *NewResponse) ErrorOutPut(ctx *gin.Context,opt...interface{}) {
NR.SetCtx(ctx)
NR.createoutPutData(opt)
NR.loghandleFunc(NR.getLogErrorStr())//日志处理
NR.ctx.JSONP(200,NR.outPutData)
} }
//内部,日志处理(后续要改善 输出日志渠道 文件、oss、数据库,或者第三方) //输出日志
func (NR *NewResponse) logHandle() { func (NR *NewResponse) OutPutLog(ctx ...*gin.Context) {
NR.setjudgeCtx(ctx)
NR.loghandleFunc(NR.getLogErrorStr())//日志处理
}
if(NR.LogDrive.openLog){ //获取输出日志的Str
func (NR *NewResponse) getLogErrorStr() string{
if(NR.openLog){
errMsg:="" errMsg:=""
formDataStr1:="" formDataStr1:=""
if(NR.OutPutData!=nil){ if(NR.outPutData!=nil){
if(NR.OutPutData.GetErrorCode()!=0){ if(NR.outPutData.GetErrorCode()!=0){
errMsg="errMsg:" errMsg="errMsg:"
errMsg+=NR.OutPutData.GetErrorMsg() errMsg+=NR.outPutData.GetErrorMsg()
} }
} }
if(NR.LogDrive.isRecordReuquest){ if(NR.openParamLog){
if(reflect.ValueOf(NR.ctx).IsZero()!=true){ if(reflect.ValueOf(NR.ctx).IsZero()!=true){
formDataStr1="请求过来的参数:" formDataStr1="请求过来的参数:"
formDataStr1+=GetRequestParam(NR.ctx) str:=GetRequestParam(NR.ctx)
formDataStr1+=str
} }
} }
logstr:=errMsg+formDataStr1+NR.LogDrive.logContent logstr:=errMsg+formDataStr1+NR.logContent
logger.Log(logstr,NR.LogDrive.LogfilePre,1) return logstr
} }
return ""
} }
...@@ -145,12 +198,13 @@ func (L *defaultOutPutDate)GetErrorCode() int { ...@@ -145,12 +198,13 @@ func (L *defaultOutPutDate)GetErrorCode() int {
return L.ErrCode return L.ErrCode
} }
/** /**
创建 输出对象 创建 输出对象
如果 第一个参数是结构,输出对象就是此结构(就是自定义输出对象) 如果 第一个参数是结构,输出对象就是此结构(就是自定义输出对象)
否则输出对象就是 defaultOutPutDate;第一个参数 是msg 第二个是code ,第三个是data 否则输出对象就是 defaultOutPutDate;第一个参数 是msg 第二个是code ,第三个是data
*/ */
func (NR *NewResponse )createOutPutData(opt []interface{}) { func (NR *NewResponse )createoutPutData(opt []interface{}) {
if(len(opt)>0){ if(len(opt)>0){
errMsg:="ok" errMsg:="ok"
...@@ -164,7 +218,7 @@ func (NR *NewResponse )createOutPutData(opt []interface{}) { ...@@ -164,7 +218,7 @@ func (NR *NewResponse )createOutPutData(opt []interface{}) {
fmt.Print(a) fmt.Print(a)
if(valueR.Elem().Kind()==reflect.Struct){ if(valueR.Elem().Kind()==reflect.Struct){
if newOutPut,ok:=opt[0].(NewOutPut);ok{ if newOutPut,ok:=opt[0].(NewOutPut);ok{
NR.OutPutData=newOutPut NR.outPutData=newOutPut
}else{ }else{
panic("If it is a structure, it must inherit the interface newoutput") panic("If it is a structure, it must inherit the interface newoutput")
} }
...@@ -181,7 +235,7 @@ func (NR *NewResponse )createOutPutData(opt []interface{}) { ...@@ -181,7 +235,7 @@ func (NR *NewResponse )createOutPutData(opt []interface{}) {
if(len(opt)>=3){ if(len(opt)>=3){
data=opt[2] data=opt[2]
} }
NR.OutPutData=&defaultOutPutDate{errCode,errMsg,data} NR.outPutData=&defaultOutPutDate{errCode,errMsg,data}
} }
} }
...@@ -189,12 +243,10 @@ func (NR *NewResponse )createOutPutData(opt []interface{}) { ...@@ -189,12 +243,10 @@ func (NR *NewResponse )createOutPutData(opt []interface{}) {
NR.ctx 没有赋值就取opt[0] NR.ctx 没有赋值就取opt[0]
如果opt有参数,必须是*gin.Context,否则pannic 如果opt有参数,必须是*gin.Context,否则pannic
*/ */
func (NR *NewResponse ) setjudgeCtx(opt []interface{}) { func (NR *NewResponse ) setjudgeCtx(opt []*gin.Context) {
if(len(opt)>0){ if(len(opt)>0){
if(reflect.ValueOf(NR.ctx).IsZero()){ if(reflect.ValueOf(NR.ctx).IsZero()){
if ctx,ok:=opt[0].(*gin.Context);ok{ NR.SetCtx(opt[0])
NR.SetCtx(ctx)
}
}else{ }else{
panic("NewResponse.ctx No value ,Should be*gin.Context") panic("NewResponse.ctx No value ,Should be*gin.Context")
} }
......
...@@ -20,11 +20,7 @@ const ( ...@@ -20,11 +20,7 @@ const (
var ( var (
logD map[string]logger.LogInterface logD map[string]logger.LogInterface
) )
var once sync.Once var once sync.Once
func Loginit() { func Loginit() {
once.Do(func() { once.Do(func() {
fmt.Print("日志初始化开始") fmt.Print("日志初始化开始")
...@@ -37,16 +33,8 @@ func Loginit() { ...@@ -37,16 +33,8 @@ func Loginit() {
logD[sliceConfig[0]]=log logD[sliceConfig[0]]=log
} }
}) })
} }
/**
github.com/ichunt2019/log 参数说明
log_chan_size 最高5协程处理日志
log_path 日志路径 默认为logs
open_sync 开启同步(本项目不需要同步模式,允许使用 wait方法阻塞直至日志完全存入文件,一般用于一次性处理脚本)
*/
/** /**
初始化 log(github.com/ichunt2019/log) 初始化 log(github.com/ichunt2019/log)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment