add web log

This commit is contained in:
YouROK
2021-04-27 10:52:32 +03:00
parent 5f4b702a1a
commit df1d2e4d2f
4 changed files with 97 additions and 16 deletions

View File

@@ -17,13 +17,14 @@ import (
) )
type args struct { type args struct {
Port string `arg:"-p" help:"web server port"` Port string `arg:"-p" help:"web server port"`
Path string `arg:"-d" help:"database path"` Path string `arg:"-d" help:"database path"`
LogPath string `arg:"-l" help:"log path"` LogPath string `arg:"-l" help:"log path"`
RDB bool `arg:"-r" help:"start in read-only DB mode"` WebLogPath string `arg:"-w" help:"web log path"`
HttpAuth bool `arg:"-a" help:"http auth on all requests"` RDB bool `arg:"-r" help:"start in read-only DB mode"`
DontKill bool `arg:"-k" help:"dont kill server on signal"` HttpAuth bool `arg:"-a" help:"http auth on all requests"`
UI bool `arg:"-u" help:"run page torrserver in browser"` DontKill bool `arg:"-k" help:"dont kill server on signal"`
UI bool `arg:"-u" help:"run page torrserver in browser"`
} }
func (args) Version() string { func (args) Version() string {
@@ -45,7 +46,7 @@ func main() {
settings.Path = params.Path settings.Path = params.Path
settings.HttpAuth = params.HttpAuth settings.HttpAuth = params.HttpAuth
log.Init(params.LogPath) log.Init(params.LogPath, params.WebLogPath)
dnsResolve() dnsResolve()
Preconfig(params.DontKill) Preconfig(params.DontKill)
@@ -59,6 +60,7 @@ func main() {
server.Start(params.Port, params.RDB) server.Start(params.Port, params.RDB)
log.TLogln(server.WaitServer()) log.TLogln(server.WaitServer())
log.Close()
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)
os.Exit(0) os.Exit(0)
} }

View File

@@ -1,24 +1,100 @@
package log package log
import ( import (
"bytes"
"fmt"
"io/ioutil"
"log" "log"
"os" "os"
"github.com/gin-gonic/gin"
) )
func Init(path string) { var logPath = ""
var webLogPath = ""
var webLog *log.Logger
var logFile *os.File
var webLogFile *os.File
func Init(path, webpath string) {
webLogPath = webpath
logPath = path
if webpath != "" {
ff, err := os.OpenFile(webLogPath, os.O_RDWR|os.O_CREATE, 0666)
if err != nil {
TLogln("Error create web log file:", err)
} else {
webLogFile = ff
webLog = log.New(ff, " ", log.LstdFlags)
}
}
if path != "" { if path != "" {
ff, err := os.Create(path) if fi, err := os.Lstat(path); err == nil {
if fi.Size() >= 1*1024*1024*1024 {
os.Remove(path)
}
}
ff, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0666)
if err != nil { if err != nil {
TLogln("Error create log file:", err) TLogln("Error create log file:", err)
return return
} }
logFile = ff
os.Stdout = ff os.Stdout = ff
os.Stderr = ff os.Stderr = ff
log.SetOutput(ff) log.SetOutput(ff)
} }
} }
func Close() {
if logFile != nil {
logFile.Close()
}
if webLogFile != nil {
webLogFile.Close()
}
}
func TLogln(v ...interface{}) { func TLogln(v ...interface{}) {
log.Println(v...) log.Println(v...)
} }
func WebLogln(v ...interface{}) {
if webLog != nil {
webLog.Println(v...)
}
}
func WebLogger() gin.HandlerFunc {
return func(c *gin.Context) {
if webLog == nil {
c.Next()
return
}
body, _ := ioutil.ReadAll(c.Request.Body)
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body))
c.Next()
statusCode := c.Writer.Status()
clientIP := c.ClientIP()
method := c.Request.Method
path := c.Request.URL.Path
raw := c.Request.URL.RawQuery
if raw != "" {
path = path + "?" + raw
}
logStr := fmt.Sprintf("%3d | %12s | %-7s %#v %v",
statusCode,
clientIP,
method,
path,
string(body),
)
WebLogln(logStr)
}
}

View File

@@ -41,7 +41,7 @@ func Blocker() gin.HandlerFunc {
minifyIP(&ip) minifyIP(&ip)
if whiteIpList.NumRanges() > 0 { if whiteIpList.NumRanges() > 0 {
if _, ok := whiteIpList.Lookup(ip); !ok { if _, ok := whiteIpList.Lookup(ip); !ok {
log.TLogln("Block ip, not in white list", ip.String()) log.WebLogln("Block ip, not in white list", ip.String())
c.String(http.StatusTeapot, "Banned") c.String(http.StatusTeapot, "Banned")
c.Abort() c.Abort()
return return
@@ -49,7 +49,7 @@ func Blocker() gin.HandlerFunc {
} }
if blackIpList.NumRanges() > 0 { if blackIpList.NumRanges() > 0 {
if r, ok := blackIpList.Lookup(ip); ok { if r, ok := blackIpList.Lookup(ip); ok {
log.TLogln("Block ip, in black list:", ip.String(), "in range", r.Description, ":", r.First, "-", r.Last) log.WebLogln("Block ip, in black list:", ip.String(), "in range", r.Description, ":", r.First, "-", r.Last)
c.String(http.StatusTeapot, "Banned") c.String(http.StatusTeapot, "Banned")
c.Abort() c.Abort()
return return

View File

@@ -3,8 +3,6 @@ package web
import ( import (
"net" "net"
"server/web/blocker"
"github.com/gin-contrib/cors" "github.com/gin-contrib/cors"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -13,6 +11,7 @@ import (
"server/version" "server/version"
"server/web/api" "server/web/api"
"server/web/auth" "server/web/auth"
"server/web/blocker"
"server/web/pages" "server/web/pages"
) )
@@ -34,8 +33,12 @@ func Start(port string) {
} }
gin.SetMode(gin.ReleaseMode) gin.SetMode(gin.ReleaseMode)
corsCfg := cors.DefaultConfig()
corsCfg.AllowAllOrigins = true
corsCfg.AllowHeaders = []string{"Origin", "Content-Length", "Content-Type", "X-Requested-With", "Accept", "Authorization"}
route := gin.New() route := gin.New()
route.Use(gin.Recovery(), cors.Default(), blocker.Blocker()) route.Use(log.WebLogger(), blocker.Blocker(), gin.Recovery(), cors.New(corsCfg))
route.GET("/echo", echo) route.GET("/echo", echo)