httpsrv/reqlog.go

87 lines
2.0 KiB
Go

package httpsrv
import (
"encoding/json"
"time"
"git.leolab.info/lib/errs"
"git.leolab.info/lib/file"
"gorm.io/datatypes"
)
//Структура записи лога запросов
// 0.1.1
type ReqRec struct {
SSID string
Addr string
XAddr string
UserAgent string
ReqUrl string
ReqVars datatypes.JSONMap //map[string]string
ReqData datatypes.JSONMap //map[string]interface{}
TimeStart time.Time
TimeFinish time.Time
Duration time.Duration
Err datatypes.JSONMap
s *Server
}
//Преобразовать в JSON
// 0.1.1
func (rl *ReqRec) MarshalJSON() ([]byte, error) {
jm := map[string]interface{}{
"SSID": rl.SSID,
"Addr": rl.Addr,
"XAddr": rl.XAddr,
"UserAgent": rl.UserAgent,
"ReqUrl": rl.ReqUrl,
"ReqVars": rl.ReqVars,
"ReqData": rl.ReqData,
"TimeStart": rl.TimeStart,
"TimeFinish": rl.TimeFinish,
"Duration": rl.Duration,
"Err": rl.Err,
}
jb, e := json.MarshalIndent(jm, "", "\t")
if e != nil {
errs.RaiseError(ErrJSONError, e.Error())
return nil, e
}
return jb, nil
}
//Преобразовать в строку
// 0.1.1
func (rl *ReqRec) toString() string {
return rl.TimeStart.Format("02-01-06 03:04:05.000") + " [" + rl.Duration.String() + "] " + rl.SSID + " " + rl.ReqUrl
}
//Начать запись лога
// 0.1.1
func rlStart(srv *Server) *ReqRec {
return &ReqRec{
TimeStart: time.Now(),
s: srv,
ReqVars: map[string]interface{}{},
ReqData: map[string]interface{}{},
}
}
//Завершить запись лога
// 0.1.1
func (rl *ReqRec) Finish(err *errs.Err) {
if err != nil {
rl.Err = err.Map()
} else {
rl.Err = nil
}
rl.TimeFinish = time.Now()
rl.Duration = rl.TimeFinish.Sub(rl.TimeStart)
file.Append(file.GetBinDir()+"/"+file.GetBinName()+".reqlog", []byte(rl.toString()+"\n"))
if rl.s.ds != nil {
if e := rl.s.ds.Model(&ReqRec{}).Create(rl).Error; e != nil {
errs.RaiseError(errs.ErrDSError, e.Error())
}
}
}