servcvgen/logs.go

144 lines
3.9 KiB
Go

package main
import (
"fmt"
"net"
"net/http"
"os"
"strings"
"time"
"github.com/gin-gonic/gin"
cfg "github.com/jesusperez/cfgsrv"
utils "github.com/jesusperez/datautils"
log "github.com/sirupsen/logrus"
)
func setReqLog(cfg *cfg.Config) {
todayLog := fmt.Sprintf("%s/%s.json",cfg.RequestOut,time.Now().Format("2006_01_02"))
if todayLog == PathReqLog {
return
} else {
PathReqLog = todayLog
}
err := utils.CheckDirPath(fmt.Sprintf("%s",cfg.RequestOut))
if err != nil {
log.Fatalf("setReqLog path %s: %v",cfg.RequestOut,err)
}
reqOut, err := os.OpenFile(PathReqLog, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
log.Fatalf("setReqLog: %v", err)
}
ReqLog = log.New()
ReqLog.SetOutput(reqOut)
ReqLog.SetFormatter(&log.JSONFormatter{
PrettyPrint: false,
})
}
func setLog(cfg *cfg.Config) {
environment := os.Getenv("ENVIRONMENT")
if environment == "production" {
log.SetFormatter(&log.JSONFormatter{})
file, err := os.OpenFile(cfg.LogOut, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
log.Fatalf("Open LogOut: %v", err)
}
log.SetOutput(file)
// Only log the warning severity or above.
log.SetLevel(log.WarnLevel)
} else {
// The TextFormatter is default, you don't actually have to do this.
log.SetFormatter(&log.TextFormatter{})
log.SetOutput(os.Stdout)
}
log.SetFormatter(&log.TextFormatter{
DisableColors: false,
FullTimestamp: true,
})
}
func getIP(r *http.Request,show bool) (string, error) {
//Get IP from X-FORWARDED-FOR header
ips := r.Header.Get("X-FORWARDED-FOR")
if show {
fmt.Println("X-Forwarded-For : ", ips)
ipreal := r.Header.Get("X-REAL-IP")
fmt.Println("X-REAL-IP : ", ipreal)
iprem, _, _ := net.SplitHostPort(r.RemoteAddr)
fmt.Println("RemoteAddr : ", iprem)
}
splitIps := strings.Split(ips, ",")
for _, ip := range splitIps {
netIP := net.ParseIP(ip)
if netIP != nil {
return ip, nil
}
}
//Get IP from RemoteAddr
ip, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
return "", err
}
netIP := net.ParseIP(ip)
if netIP != nil {
return ip, nil
}
//Get IP from the X-REAL-IP header
ip = r.Header.Get("X-REAL-IP")
netIP = net.ParseIP(ip)
if netIP != nil {
return ip, nil
}
return "", fmt.Errorf("No valid ip found")
}
func logRequest(c *gin.Context, rtenv *RouteEnv, run string, route string, info string, infoReq string, tkn string) {
accept_langs := strings.Split(c.Request.Header.Get("Accept-Language"),";")
langs := strings.Split(accept_langs[0], ",")
ip, _ := getIP(c.Request,false)
// header, _ := ioutil.ReadAll(c.Request.Header)
//println(string(c.header))
// println(c.Header)
// ipp := c.Request.RemoteAddr
// xforward := c.Request.Header.Get("X-Forwarded-For")
// fm.Println("IP : ", ipp)
// fmt.Println("X-Forwarded-For : ", xforward)
// fmt.Println("IP : ", ip)
// // if err != nil {
// dt := time.Now()
// fmt.Println("Current date and time is: ", dt.String())
// fmt.Println(dt.Format("01-02-2006 15:04:05"))
// fmt.Println(dt.Format(time.RFC3339Nano))
if len(info) > 0 {
setReqLog(rtenv.Cfg)
ReqLog.WithFields(log.Fields{
"run": run,
"route": route,
"lang": fmt.Sprintf("%+v",langs),
"agent": fmt.Sprintf("%+v",c.Request.UserAgent()),
"ip": ip,
"tkn": tkn,
}).Info(info)
}
if len(infoReq) > 0 {
log.WithFields(log.Fields{
"run": "route",
"route": "/",
"ip": ip,
"tkn": tkn,
}).Info(infoReq)
}
}
func requestInfo(c *gin.Context, rtenv *RouteEnv, run string, route string, tkn string) LogInfo {
accept_langs := strings.Split(c.Request.Header.Get("Accept-Language"),";")
langs := strings.Split(accept_langs[0], ",")
ip, _ := getIP(c.Request,false)
return LogInfo{
Run: run,
Route: route,
Lang: fmt.Sprintf("%+v",langs),
Agent: fmt.Sprintf("%+v",c.Request.UserAgent()),
Ip: ip,
Tkn: tkn,
}
}