瀏覽代碼

refactor: use zap as logger ⚡

0xJacky 2 年之前
父節點
當前提交
f305701b30

+ 1 - 1
.air.toml

@@ -15,7 +15,7 @@ full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"
 # Watch these filename extensions.
 include_ext = ["go", "tpl", "tmpl", "html", "conf", "ini", "toml"]
 # Ignore these filename extensions or directories.
-exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules", "upload"]
+exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules", "upload", "docs", "resources"]
 # Watch these directories if you specified.
 include_dir = []
 # Exclude files.

+ 2 - 2
frontend/src/components/StdDataDisplay/StdCurd.vue

@@ -189,7 +189,7 @@ const selectedRowKeys = ref([])
 </template>
 
 <style lang="less" scoped>
-.before-edit {
-    margin-bottom: 20px;
+.before-edit:last-child {
+    margin-bottom: 10px;
 }
 </style>

+ 2 - 1
frontend/src/language/constants.ts

@@ -31,5 +31,6 @@ export const msg = [
     $gettext('Perform core upgrade error'),
     $gettext('Upgraded successfully'),
 
-    $gettext('File exists')
+    $gettext('File exists'),
+    $gettext('Requested with wrong parameters')
 ]

+ 4 - 0
frontend/src/language/en/app.po

@@ -1054,6 +1054,10 @@ msgstr ""
 msgid "Reloading nginx"
 msgstr ""
 
+#: src/language/constants.ts:35
+msgid "Requested with wrong parameters"
+msgstr ""
+
 #: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
 #: src/components/StdDataDisplay/StdTable.vue:9

+ 4 - 0
frontend/src/language/messages.pot

@@ -1089,6 +1089,10 @@ msgstr ""
 msgid "Reloading nginx"
 msgstr ""
 
+#: src/language/constants.ts:35
+msgid "Requested with wrong parameters"
+msgstr ""
+
 #: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
 #: src/components/StdDataDisplay/StdTable.vue:9

文件差異過大導致無法顯示
+ 0 - 0
frontend/src/language/translations.json


二進制
frontend/src/language/zh_CN/app.mo


+ 4 - 0
frontend/src/language/zh_CN/app.po

@@ -1030,6 +1030,10 @@ msgstr "重载中"
 msgid "Reloading nginx"
 msgstr "正在重载 Nginx"
 
+#: src/language/constants.ts:35
+msgid "Requested with wrong parameters"
+msgstr "请求参数错误"
+
 #: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
 #: src/components/StdDataDisplay/StdTable.vue:9

+ 4 - 0
frontend/src/language/zh_TW/app.po

@@ -1031,6 +1031,10 @@ msgstr "换弹中"
 msgid "Reloading nginx"
 msgstr "重载 Nginx"
 
+#: src/language/constants.ts:35
+msgid "Requested with wrong parameters"
+msgstr ""
+
 #: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
 #: src/components/StdDataDisplay/StdTable.vue:9

+ 5 - 0
go.mod

@@ -6,6 +6,7 @@ require (
 	github.com/BurntSushi/toml v1.2.1
 	github.com/creack/pty v1.1.18
 	github.com/dustin/go-humanize v1.0.1
+	github.com/fatih/color v1.13.0
 	github.com/gin-contrib/static v0.0.1
 	github.com/gin-gonic/gin v1.9.0
 	github.com/go-acme/lego/v4 v4.10.2
@@ -25,6 +26,7 @@ require (
 	github.com/spf13/cast v1.5.0
 	github.com/tufanbarisyildirim/gonginx v0.0.0-20230325082000-26dcb15a9df4
 	github.com/unknwon/com v1.0.1
+	go.uber.org/zap v1.24.0
 	golang.org/x/crypto v0.8.0
 	gopkg.in/ini.v1 v1.67.0
 	gorm.io/driver/sqlite v1.5.0
@@ -107,6 +109,7 @@ require (
 	github.com/liquidweb/liquidweb-cli v0.6.10 // indirect
 	github.com/liquidweb/liquidweb-go v1.6.3 // indirect
 	github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
 	github.com/mattn/go-isatty v0.0.18 // indirect
 	github.com/mattn/go-sqlite3 v1.14.16 // indirect
 	github.com/miekg/dns v1.1.53 // indirect
@@ -158,6 +161,8 @@ require (
 	github.com/yandex-cloud/go-sdk v0.0.0-20230403093608-cc5174142a48 // indirect
 	github.com/yusufpapurcu/wmi v1.2.2 // indirect
 	go.opencensus.io v0.24.0 // indirect
+	go.uber.org/atomic v1.11.0 // indirect
+	go.uber.org/multierr v1.11.0 // indirect
 	go.uber.org/ratelimit v0.2.0 // indirect
 	golang.org/x/arch v0.3.0 // indirect
 	golang.org/x/mod v0.10.0 // indirect

+ 14 - 1
go.sum

@@ -72,6 +72,7 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 github.com/aws/aws-sdk-go v1.44.242 h1:bb6Rqd7dxh1gTUoVXLJTNC2c+zNaHpLRlNKk0kGN3fc=
 github.com/aws/aws-sdk-go v1.44.242/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
+github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
@@ -144,6 +145,7 @@ github.com/exoscale/egoscale v0.90.0 h1:DZBXVU3iHqu5Ju5lQ5jWVlPo0IpI98SUo8Aa1UQV
 github.com/exoscale/egoscale v0.90.0/go.mod h1:wyXE5zrnFynMXA0jMhwQqSe24CfUhmBk2WI5wFZcq6Y=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
+github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
 github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
 github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
@@ -407,11 +409,15 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO
 github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 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.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
 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/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98=
 github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
@@ -661,12 +667,18 @@ go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
 go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
+go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
+go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
 go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA=
 go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
+go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
 golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
 golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
@@ -805,6 +817,7 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

+ 27 - 0
logger/color.go

@@ -0,0 +1,27 @@
+package logger
+
+import (
+	"github.com/fatih/color"
+	"go.uber.org/zap/zapcore"
+)
+
+func colorLevelEncoder(l zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
+	colorLevel := color.New()
+
+	switch l {
+	case zapcore.DebugLevel:
+		colorLevel.Add(color.FgCyan)
+	case zapcore.InfoLevel:
+		colorLevel.Add(color.FgGreen)
+	case zapcore.WarnLevel:
+		colorLevel.Add(color.FgYellow)
+	case zapcore.ErrorLevel, zapcore.DPanicLevel:
+		colorLevel.Add(color.FgHiRed)
+	case zapcore.PanicLevel, zapcore.FatalLevel:
+		colorLevel.Add(color.FgRed)
+	default:
+		colorLevel.Add(color.Reset)
+	}
+
+	enc.AppendString(colorLevel.Sprint(l.CapitalString()))
+}

+ 86 - 0
logger/logger.go

@@ -0,0 +1,86 @@
+package logger
+
+import (
+	"go.uber.org/zap"
+	"go.uber.org/zap/zapcore"
+	"os"
+)
+
+var logger *zap.SugaredLogger
+
+func init() {
+	// First, define our level-handling logic.
+	highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
+		return lvl >= zapcore.ErrorLevel
+	})
+	lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
+		return lvl < zapcore.ErrorLevel
+	})
+
+	// Directly output to stdout and stderr, and add caller information.
+	consoleDebugging := zapcore.Lock(os.Stdout)
+	consoleErrors := zapcore.Lock(os.Stderr)
+	encoderConfig := zap.NewDevelopmentEncoderConfig()
+	encoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
+	encoderConfig.ConsoleSeparator = " "
+	encoderConfig.EncodeLevel = colorLevelEncoder
+	consoleEncoder := zapcore.NewConsoleEncoder(encoderConfig)
+
+	// Join the outputs, encoders, and level-handling functions into
+	// zapcore.Cores, then tee the two cores together.
+	core := zapcore.NewTee(
+		zapcore.NewCore(consoleEncoder, consoleErrors, highPriority),
+		zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority),
+	)
+
+	// From a zapcore.Core, it's easy to construct a Logger.
+	logger = zap.New(core, zap.AddCaller()).WithOptions(zap.AddCallerSkip(1)).Sugar()
+}
+
+func Sync() {
+	_ = logger.Sync()
+}
+
+func GetLogger() *zap.SugaredLogger {
+	return logger
+}
+
+func Info(args ...interface{}) {
+	logger.Infoln(args...)
+}
+
+func Error(args ...interface{}) {
+	logger.Errorln(args...)
+}
+
+func Fatal(args ...interface{}) {
+	logger.Fatalln(args...)
+}
+
+func Warn(args ...interface{}) {
+	logger.Warnln(args...)
+}
+
+func Debug(args ...interface{}) {
+	logger.Debugln(args...)
+}
+
+func Infof(format string, args ...interface{}) {
+	logger.Infof(format, args...)
+}
+
+func Errorf(format string, args ...interface{}) {
+	logger.Errorf(format, args...)
+}
+
+func Fatalf(format string, args ...interface{}) {
+	logger.Fatalf(format, args...)
+}
+
+func Warnf(format string, args ...interface{}) {
+	logger.Warnf(format, args...)
+}
+
+func Debugf(format string, args ...interface{}) {
+	logger.Debugf(format, args...)
+}

+ 27 - 24
main.go

@@ -1,36 +1,39 @@
 package main
 
 import (
-    "flag"
-    "fmt"
-    "github.com/0xJacky/Nginx-UI/server"
-    "github.com/0xJacky/Nginx-UI/server/service"
-    "github.com/0xJacky/Nginx-UI/server/settings"
-    "github.com/gin-gonic/gin"
-    "github.com/jpillora/overseer"
-    "github.com/jpillora/overseer/fetcher"
-    "log"
+	"flag"
+	"fmt"
+	"github.com/0xJacky/Nginx-UI/logger"
+	"github.com/0xJacky/Nginx-UI/server"
+	"github.com/0xJacky/Nginx-UI/server/service"
+	"github.com/0xJacky/Nginx-UI/server/settings"
+	"github.com/gin-gonic/gin"
+	"github.com/jpillora/overseer"
+	"github.com/jpillora/overseer/fetcher"
+	"log"
 )
 
 func main() {
-    var confPath string
-    flag.StringVar(&confPath, "config", "app.ini", "Specify the configuration file")
-    flag.Parse()
+	var confPath string
+	flag.StringVar(&confPath, "config", "app.ini", "Specify the configuration file")
+	flag.Parse()
 
-    settings.Init(confPath)
+	settings.Init(confPath)
 
-    gin.SetMode(settings.ServerSettings.RunMode)
+	gin.SetMode(settings.ServerSettings.RunMode)
 
-    r, err := service.GetRuntimeInfo()
+	r, err := service.GetRuntimeInfo()
 
-    if err != nil {
-        log.Fatalln(err)
-    }
+	defer logger.Sync()
 
-    overseer.Run(overseer.Config{
-        Program:          server.Program,
-        Address:          fmt.Sprintf(":%s", settings.ServerSettings.HttpPort),
-        Fetcher:          &fetcher.File{Path: r.ExPath},
-        TerminateTimeout: 0,
-    })
+	if err != nil {
+		log.Fatalln(err)
+	}
+
+	overseer.Run(overseer.Config{
+		Program:          server.Program,
+		Address:          fmt.Sprintf(":%s", settings.ServerSettings.HttpPort),
+		Fetcher:          &fetcher.File{Path: r.ExPath},
+		TerminateTimeout: 0,
+	})
 }

+ 7 - 7
server/api/analytic.go

@@ -2,6 +2,7 @@ package api
 
 import (
 	"fmt"
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/internal/analytic"
 	"github.com/pkg/errors"
 	"github.com/shirou/gopsutil/v3/cpu"
@@ -11,7 +12,6 @@ import (
 	"github.com/shirou/gopsutil/v3/mem"
 	"github.com/shirou/gopsutil/v3/net"
 	"github.com/spf13/cast"
-	"log"
 	"math"
 	"net/http"
 	"runtime"
@@ -102,7 +102,7 @@ func Analytic(c *gin.Context) {
 	// upgrade http to websocket
 	ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
 	if err != nil {
-		log.Println("[Error] Analytic Upgrade", err)
+		logger.Error(err)
 		return
 	}
 
@@ -114,7 +114,7 @@ func Analytic(c *gin.Context) {
 		stat.Memory, err = getMemoryStat()
 
 		if err != nil {
-			log.Println(err)
+			logger.Error(err)
 			return
 		}
 
@@ -139,7 +139,7 @@ func Analytic(c *gin.Context) {
 		stat.Disk, err = getDiskStat()
 
 		if err != nil {
-			log.Println(err)
+			logger.Error(err)
 			return
 		}
 
@@ -152,7 +152,7 @@ func Analytic(c *gin.Context) {
 		// write
 		err = ws.WriteJSON(stat)
 		if err != nil {
-			log.Println("[Error] analytic WriteJSON", err)
+			logger.Error(err)
 			break
 		}
 		time.Sleep(800 * time.Microsecond)
@@ -166,14 +166,14 @@ func GetAnalyticInit(c *gin.Context) {
 	memory, err := getMemoryStat()
 
 	if err != nil {
-		log.Println(err)
+		logger.Error(err)
 		return
 	}
 
 	diskStat, err := getDiskStat()
 
 	if err != nil {
-		log.Println(err)
+		logger.Error(err)
 		return
 	}
 

+ 49 - 49
server/api/api.go

@@ -1,68 +1,68 @@
 package api
 
 import (
-	"github.com/gin-gonic/gin"
-	"github.com/gin-gonic/gin/binding"
-	"github.com/go-playground/locales/zh"
-	ut "github.com/go-playground/universal-translator"
-	val "github.com/go-playground/validator/v10"
-	zhTranslations "github.com/go-playground/validator/v10/translations/zh"
-	"log"
-	"net/http"
-	"reflect"
+    "github.com/0xJacky/Nginx-UI/logger"
+    "github.com/gin-gonic/gin"
+    "github.com/gin-gonic/gin/binding"
+    "github.com/go-playground/locales/zh"
+    ut "github.com/go-playground/universal-translator"
+    val "github.com/go-playground/validator/v10"
+    zhTranslations "github.com/go-playground/validator/v10/translations/zh"
+    "net/http"
+    "reflect"
 )
 
 func ErrHandler(c *gin.Context, err error) {
-	log.Println(err)
-	c.JSON(http.StatusInternalServerError, gin.H{
-		"message": err.Error(),
-	})
+    logger.GetLogger().Errorln(err)
+    c.JSON(http.StatusInternalServerError, gin.H{
+        "message": err.Error(),
+    })
 }
 
 type ValidError struct {
-	Key     string
-	Message string
+    Key     string
+    Message string
 }
 
 func BindAndValid(c *gin.Context, target interface{}) bool {
-	errs := make(map[string]string)
-	err := c.ShouldBindJSON(target)
-	if err != nil {
-		log.Println("raw err", err)
-		uni := ut.New(zh.New())
-		trans, _ := uni.GetTranslator("zh")
-		v, ok := binding.Validator.Engine().(*val.Validate)
-		if ok {
-			_ = zhTranslations.RegisterDefaultTranslations(v, trans)
-		}
+    errs := make(map[string]string)
+    err := c.ShouldBindJSON(target)
+    if err != nil {
+        logger.Error("bind err", err)
+        uni := ut.New(zh.New())
+        trans, _ := uni.GetTranslator("zh")
+        v, ok := binding.Validator.Engine().(*val.Validate)
+        if ok {
+            _ = zhTranslations.RegisterDefaultTranslations(v, trans)
+        }
 
-		verrs, ok := err.(val.ValidationErrors)
+        verrs, ok := err.(val.ValidationErrors)
 
-		if !ok {
-			log.Println("verrs", verrs)
-			c.JSON(http.StatusNotAcceptable, gin.H{
-				"message": "Requested with wrong parameters",
-				"code":    http.StatusNotAcceptable,
-				"error":   verrs,
-			})
-			return false
-		}
+        if !ok {
+            logger.Error("valid err", verrs)
+            c.JSON(http.StatusNotAcceptable, gin.H{
+                "message": "Requested with wrong parameters",
+                "code":    http.StatusNotAcceptable,
+                "error":   verrs,
+            })
+            return false
+        }
 
-		for _, value := range verrs {
-			t := reflect.ValueOf(target)
-			realType := t.Type().Elem()
-			field, _ := realType.FieldByName(value.StructField())
-			errs[field.Tag.Get("json")] = value.Translate(trans)
-		}
+        for _, value := range verrs {
+            t := reflect.ValueOf(target)
+            realType := t.Type().Elem()
+            field, _ := realType.FieldByName(value.StructField())
+            errs[field.Tag.Get("json")] = value.Translate(trans)
+        }
 
-		c.JSON(http.StatusNotAcceptable, gin.H{
-			"errors":  errs,
-			"message": "Requested with wrong parameters",
-			"code":    http.StatusNotAcceptable,
-		})
+        c.JSON(http.StatusNotAcceptable, gin.H{
+            "errors":  errs,
+            "message": "Requested with wrong parameters",
+            "code":    http.StatusNotAcceptable,
+        })
 
-		return false
-	}
+        return false
+    }
 
-	return true
+    return true
 }

+ 12 - 14
server/api/cert.go

@@ -1,6 +1,7 @@
 package api
 
 import (
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/internal/cert"
 	"github.com/0xJacky/Nginx-UI/server/internal/cert/dns"
 	"github.com/0xJacky/Nginx-UI/server/internal/nginx"
@@ -8,7 +9,6 @@ import (
 	"github.com/gin-gonic/gin"
 	"github.com/gorilla/websocket"
 	"github.com/spf13/cast"
-	"log"
 	"net/http"
 	"os"
 	"path/filepath"
@@ -31,7 +31,7 @@ type IssueCertResponse struct {
 func handleIssueCertLogChan(conn *websocket.Conn, logChan chan string) {
 	defer func() {
 		if err := recover(); err != nil {
-			log.Println("api.handleIssueCertLogChan recover", err)
+			logger.Error(err)
 		}
 	}()
 
@@ -43,7 +43,7 @@ func handleIssueCertLogChan(conn *websocket.Conn, logChan chan string) {
 		})
 
 		if err != nil {
-			log.Println("Error handleIssueCertLogChan", err)
+			logger.Error(err)
 			return
 		}
 
@@ -60,15 +60,12 @@ func IssueCert(c *gin.Context) {
 	// upgrade http to websocket
 	ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
 	if err != nil {
-		log.Println(err)
+		logger.Error(err)
 		return
 	}
 
 	defer func(ws *websocket.Conn) {
-		err := ws.Close()
-		if err != nil {
-			log.Println("defer websocket close err", err)
-		}
+		_ = ws.Close()
 	}(ws)
 
 	// read
@@ -77,14 +74,15 @@ func IssueCert(c *gin.Context) {
 	err = ws.ReadJSON(buffer)
 
 	if err != nil {
-		log.Println(err)
+		logger.Error(err)
 		return
 	}
 
 	certModel, err := model.FirstOrCreateCert(c.Param("name"))
 
 	if err != nil {
-		log.Println(err)
+		logger.Error(err)
+		return
 	}
 
 	logChan := make(chan string, 1)
@@ -106,7 +104,7 @@ func IssueCert(c *gin.Context) {
 		})
 
 		if err != nil {
-			log.Println("Error WriteJSON", err)
+			logger.Error(err)
 			return
 		}
 
@@ -124,7 +122,7 @@ func IssueCert(c *gin.Context) {
 	})
 
 	if err != nil {
-		log.Println(err)
+		logger.Error(err)
 		err = ws.WriteJSON(IssueCertResponse{
 			Status:  Error,
 			Message: err.Error(),
@@ -142,7 +140,7 @@ func IssueCert(c *gin.Context) {
 	})
 
 	if err != nil {
-		log.Println(err)
+		logger.Error(err)
 		return
 	}
 
@@ -268,7 +266,6 @@ func AddCert(c *gin.Context) {
 
 func ModifyCert(c *gin.Context) {
 	id := cast.ToInt(c.Param("id"))
-	certModel, err := model.FirstCertByID(id)
 
 	var json struct {
 		Name                  string `json:"name"`
@@ -282,6 +279,7 @@ func ModifyCert(c *gin.Context) {
 		return
 	}
 
+	certModel, err := model.FirstCertByID(id)
 	if err != nil {
 		ErrHandler(c, err)
 		return

+ 3 - 3
server/api/config.go

@@ -1,11 +1,11 @@
 package api
 
 import (
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/internal/config_list"
 	"github.com/0xJacky/Nginx-UI/server/internal/nginx"
 	"github.com/0xJacky/Nginx-UI/server/query"
 	"github.com/gin-gonic/gin"
-	"log"
 	"net/http"
 	"os"
 )
@@ -43,14 +43,14 @@ func GetConfigs(c *gin.Context) {
 			var targetPath string
 			targetPath, err = os.Readlink(nginx.GetConfPath(file.Name()))
 			if err != nil {
-				log.Println("GetConfigs Read Symlink Error", targetPath, err)
+				logger.Error("Read Symlink Error", targetPath, err)
 				continue
 			}
 
 			var targetInfo os.FileInfo
 			targetInfo, err = os.Stat(targetPath)
 			if err != nil {
-				log.Println("GetConfigs Stat Error", targetPath, err)
+				logger.Error("Stat Error", targetPath, err)
 				continue
 			}
 			// but target file is not a dir

+ 2 - 2
server/api/domain.go

@@ -1,6 +1,7 @@
 package api
 
 import (
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/internal/cert"
 	"github.com/0xJacky/Nginx-UI/server/internal/config_list"
 	"github.com/0xJacky/Nginx-UI/server/internal/helper"
@@ -8,7 +9,6 @@ import (
 	"github.com/0xJacky/Nginx-UI/server/model"
 	"github.com/0xJacky/Nginx-UI/server/query"
 	"github.com/gin-gonic/gin"
-	"log"
 	"net/http"
 	"os"
 	"strings"
@@ -148,7 +148,7 @@ func GetDomain(c *gin.Context) {
 				pubKey, err := cert.GetCertInfo(directive.Params)
 
 				if err != nil {
-					log.Println("Failed to get certificate information", err)
+					logger.Error("Failed to get certificate information", err)
 					break
 				}
 

+ 10 - 10
server/api/nginx_log.go

@@ -2,6 +2,7 @@ package api
 
 import (
 	"encoding/json"
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/internal/helper"
 	"github.com/0xJacky/Nginx-UI/server/internal/nginx"
 	"github.com/0xJacky/Nginx-UI/server/settings"
@@ -11,7 +12,6 @@ import (
 	"github.com/pkg/errors"
 	"github.com/spf13/cast"
 	"io"
-	"log"
 	"net/http"
 	"os"
 )
@@ -46,7 +46,7 @@ func GetNginxLogPage(c *gin.Context) {
 	logPath, err := getLogPath(&control)
 
 	if err != nil {
-		log.Println("error GetNginxLogPage", err)
+		logger.Error(err)
 		return
 	}
 
@@ -54,7 +54,7 @@ func GetNginxLogPage(c *gin.Context) {
 
 	if err != nil {
 		c.JSON(http.StatusOK, nginxLogPageResp{})
-		log.Println("error GetNginxLogPage open file", err)
+		logger.Error(err)
 		return
 	}
 
@@ -62,7 +62,7 @@ func GetNginxLogPage(c *gin.Context) {
 
 	if err != nil {
 		c.JSON(http.StatusOK, nginxLogPageResp{})
-		log.Println("error GetNginxLogPage stat", err)
+		logger.Error(err)
 		return
 	}
 
@@ -85,7 +85,7 @@ func GetNginxLogPage(c *gin.Context) {
 	_, err = f.Seek(offset, io.SeekStart)
 	if err != nil && err != io.EOF {
 		c.JSON(http.StatusOK, nginxLogPageResp{})
-		log.Println("error GetNginxLogPage seek", err)
+		logger.Error(err)
 		return
 	}
 
@@ -93,7 +93,7 @@ func GetNginxLogPage(c *gin.Context) {
 
 	if err != nil && err != io.EOF {
 		c.JSON(http.StatusOK, nginxLogPageResp{})
-		log.Println("error GetNginxLogPage read buf", err)
+		logger.Error(err)
 		return
 	}
 
@@ -163,7 +163,7 @@ func getLogPath(control *controlStruct) (logPath string, err error) {
 func tailNginxLog(ws *websocket.Conn, controlChan chan controlStruct, errChan chan error) {
 	defer func() {
 		if err := recover(); err != nil {
-			log.Println("tailNginxLog recovery", err)
+			logger.Error(err)
 			return
 		}
 	}()
@@ -226,7 +226,7 @@ func tailNginxLog(ws *websocket.Conn, controlChan chan controlStruct, errChan ch
 func handleLogControl(ws *websocket.Conn, controlChan chan controlStruct, errChan chan error) {
 	defer func() {
 		if err := recover(); err != nil {
-			log.Println("handleLogControl recovery", err)
+			logger.Error(err)
 			return
 		}
 	}()
@@ -262,7 +262,7 @@ func NginxLog(c *gin.Context) {
 	// upgrade http to websocket
 	ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
 	if err != nil {
-		log.Println("[Error] NginxLog Upgrade", err)
+		logger.Error(err)
 		return
 	}
 
@@ -275,7 +275,7 @@ func NginxLog(c *gin.Context) {
 	go handleLogControl(ws, controlChan, errChan)
 
 	if err = <-errChan; err != nil {
-		log.Println(err)
+		logger.Error(err)
 		_ = ws.WriteMessage(websocket.TextMessage, []byte(err.Error()))
 		return
 	}

+ 6 - 5
server/api/pty.go

@@ -1,10 +1,10 @@
 package api
 
 import (
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/internal/pty"
 	"github.com/gin-gonic/gin"
 	"github.com/gorilla/websocket"
-	"log"
 	"net/http"
 )
 
@@ -17,7 +17,7 @@ func Pty(c *gin.Context) {
 	// upgrade http to websocket
 	ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
 	if err != nil {
-		log.Println("pty ws upgrade error", err)
+		logger.Error(err)
 		return
 	}
 
@@ -26,7 +26,7 @@ func Pty(c *gin.Context) {
 	p, err := pty.NewPipeLine(ws)
 
 	if err != nil {
-		log.Println("pty.NewPipLine error", err)
+		logger.Error(err)
 		return
 	}
 
@@ -38,8 +38,9 @@ func Pty(c *gin.Context) {
 
 	err = <-errorChan
 
-	if err != nil {
-		log.Println(err)
+	if err != nil && websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseNoStatusReceived,
+		websocket.CloseNormalClosure) {
+		logger.Error(err)
 	}
 
 	return

+ 6 - 6
server/api/upgrade.go

@@ -1,10 +1,10 @@
 package api
 
 import (
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/service"
 	"github.com/gin-gonic/gin"
 	"github.com/gorilla/websocket"
-	"log"
 	"net/http"
 	"os"
 )
@@ -48,7 +48,7 @@ func PerformCoreUpgrade(c *gin.Context) {
 	// upgrade http to websocket
 	ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
 	if err != nil {
-		log.Println("[Error] PerformCoreUpgrade Upgrade", err)
+		logger.Error(err)
 		return
 	}
 	defer ws.Close()
@@ -61,7 +61,7 @@ func PerformCoreUpgrade(c *gin.Context) {
 	err = ws.ReadJSON(&control)
 
 	if err != nil {
-		log.Println("[Error] PerformCoreUpgrade ws.ReadJSON(&control)", err)
+		logger.Error(err)
 		return
 	}
 
@@ -81,7 +81,7 @@ func PerformCoreUpgrade(c *gin.Context) {
 			"status":  "error",
 			"message": err.Error(),
 		})
-		log.Println("[Error] PerformCoreUpgrade service.NewUpgrader()", err)
+		logger.Error(err)
 		return
 	}
 	_ = ws.WriteJSON(gin.H{
@@ -109,7 +109,7 @@ func PerformCoreUpgrade(c *gin.Context) {
 			"status":  "error",
 			"message": err.Error(),
 		})
-		log.Println("[Error] PerformCoreUpgrade DownloadLatestRelease", err)
+		logger.Error(err)
 		return
 	}
 
@@ -138,7 +138,7 @@ func PerformCoreUpgrade(c *gin.Context) {
 			"status":  "error",
 			"message": err.Error(),
 		})
-		log.Println("[Error] PerformCoreUpgrade", err)
+		logger.Error(err)
 		return
 	}
 }

+ 2 - 2
server/internal/analytic/analytic.go

@@ -1,8 +1,8 @@
 package analytic
 
 import (
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/shirou/gopsutil/v3/net"
-	"log"
 	"time"
 )
 
@@ -48,7 +48,7 @@ func init() {
 }
 
 func RecordServerAnalytic() {
-	log.Println("[Nginx UI] RecordServerAnalytic Started")
+	logger.Info("RecordServerAnalytic Started")
 	for {
 		now := time.Now()
 		recordCpu(now) // this func will spend more than 1 second.

+ 5 - 5
server/internal/analytic/record.go

@@ -1,7 +1,7 @@
 package analytic
 
 import (
-	"github.com/go-acme/lego/v4/log"
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/shirou/gopsutil/v3/cpu"
 	"github.com/shirou/gopsutil/v3/disk"
 	"github.com/shirou/gopsutil/v3/net"
@@ -12,7 +12,7 @@ import (
 func getTotalDiskIO() (read, write uint64) {
 	diskIOCounters, err := disk.IOCounters()
 	if err != nil {
-		log.Println("getTotalDiskIO: get diskIOCounters err", err)
+		logger.Error(err.Error())
 		return
 	}
 	for _, v := range diskIOCounters {
@@ -25,13 +25,13 @@ func getTotalDiskIO() (read, write uint64) {
 func recordCpu(now time.Time) {
 	cpuTimesBefore, err := cpu.Times(false)
 	if err != nil {
-		log.Println("recordCpu: get cpuTimesBefore err", err)
+		logger.Error(err.Error())
 		return
 	}
 	time.Sleep(1000 * time.Millisecond)
 	cpuTimesAfter, err := cpu.Times(false)
 	if err != nil {
-		log.Println("recordCpu: get cpuTimesAfter err", err)
+		logger.Error(err.Error())
 		return
 	}
 	threadNum := runtime.GOMAXPROCS(0)
@@ -68,7 +68,7 @@ func recordNetwork(now time.Time) {
 	network, err := net.IOCounters(false)
 
 	if err != nil {
-		log.Println("recordNetwork: get network err", err)
+		logger.Error(err.Error())
 		return
 	}
 

+ 8 - 8
server/internal/cert/auto_cert.go

@@ -2,21 +2,21 @@ package cert
 
 import (
 	"fmt"
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/model"
 	"github.com/pkg/errors"
-	"log"
 	"time"
 )
 
 func handleIssueCertLogChan(logChan chan string) {
 	defer func() {
 		if err := recover(); err != nil {
-			log.Println("[Auto Cert] handleIssueCertLogChan", err)
+			logger.Error(err)
 		}
 	}()
 
 	for logString := range logChan {
-		log.Println("[Auto Cert] Info", logString)
+		logger.Info("Auto Cert", logString)
 	}
 }
 
@@ -31,12 +31,12 @@ func (t *AutoCertErrorLog) SetCertModel(cert *model.Cert) {
 
 func (t *AutoCertErrorLog) Push(text string, err error) {
 	t.buffer = append(t.buffer, text+" "+err.Error())
-	log.Println("[AutoCert Error]", text, err)
+	logger.Error("AutoCert", text, err)
 }
 
 func (t *AutoCertErrorLog) Exit(text string, err error) {
 	t.buffer = append(t.buffer, text+" "+err.Error())
-	log.Println("[AutoCert Error]", text, err)
+	logger.Error("AutoCert", text, err)
 
 	if t.cert == nil {
 		return
@@ -59,10 +59,10 @@ func (t *AutoCertErrorLog) ToString() (content string) {
 func AutoObtain() {
 	defer func() {
 		if err := recover(); err != nil {
-			log.Println("[AutoCert] Recover", err)
+			logger.Error("AutoCert Recover", err)
 		}
 	}()
-	log.Println("[AutoCert] Start")
+	logger.Info("AutoCert Worker Started")
 	autoCertList := model.GetAutoCertList()
 	for _, certModel := range autoCertList {
 		confName := certModel.Filename
@@ -124,5 +124,5 @@ func AutoObtain() {
 
 		close(logChan)
 	}
-	log.Println("[AutoCert] End")
+	logger.Info("AutoCert Worker End")
 }

+ 2 - 2
server/internal/cert/cert.go

@@ -6,6 +6,7 @@ import (
 	"crypto/elliptic"
 	"crypto/rand"
 	"crypto/tls"
+	"github.com/0xJacky/Nginx-UI/logger"
 	dns2 "github.com/0xJacky/Nginx-UI/server/internal/cert/dns"
 	"github.com/0xJacky/Nginx-UI/server/internal/nginx"
 	"github.com/0xJacky/Nginx-UI/server/query"
@@ -17,7 +18,6 @@ import (
 	"github.com/go-acme/lego/v4/providers/dns"
 	"github.com/go-acme/lego/v4/registration"
 	"github.com/pkg/errors"
-	"log"
 	"net/http"
 	"os"
 	"path/filepath"
@@ -55,7 +55,7 @@ type ConfigPayload struct {
 func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error) {
 	defer func() {
 		if err := recover(); err != nil {
-			log.Println("Issue Cert recover", err)
+			logger.Error(err)
 		}
 	}()
 

+ 3 - 3
server/internal/helper/hash.go

@@ -3,15 +3,15 @@ package helper
 import (
 	"crypto/sha512"
 	"fmt"
+	"github.com/0xJacky/Nginx-UI/logger"
 	"io"
-	"log"
 	"os"
 )
 
 func DigestSHA512(filepath string) (hashString string) {
 	file, err := os.Open(filepath)
 	if err != nil {
-		log.Println("DigestSHA512 open file error")
+		logger.Error(err)
 		return
 	}
 	defer file.Close()
@@ -20,7 +20,7 @@ func DigestSHA512(filepath string) (hashString string) {
 
 	_, err = io.Copy(hash, file)
 	if err != nil {
-		log.Println("DigestSHA512 io.Copy error")
+		logger.Error(err)
 		return
 	}
 

+ 8 - 8
server/internal/nginx/nginx.go

@@ -1,8 +1,8 @@
 package nginx
 
 import (
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/settings"
-	"log"
 	"os/exec"
 	"path/filepath"
 	"regexp"
@@ -11,7 +11,7 @@ import (
 func TestConf() string {
 	out, err := exec.Command("nginx", "-t").CombinedOutput()
 	if err != nil {
-		log.Println("[error] nginx.TestConf", err)
+		logger.Error(err)
 	}
 
 	return string(out)
@@ -21,7 +21,7 @@ func Reload() string {
 	out, err := exec.Command("nginx", "-s", "reload").CombinedOutput()
 
 	if err != nil {
-		log.Println("[error] nginx.Reload", err)
+		logger.Error(err)
 	}
 
 	return string(out)
@@ -31,7 +31,7 @@ func Restart() string {
 	out, err := exec.Command("nginx", "-s", "reopen").CombinedOutput()
 
 	if err != nil {
-		log.Println("[error] nginx.Restart", err)
+		logger.Error(err)
 	}
 
 	return string(out)
@@ -43,13 +43,13 @@ func GetConfPath(dir ...string) string {
 	if settings.ServerSettings.NginxConfigDir == "" {
 		out, err := exec.Command("nginx", "-V").CombinedOutput()
 		if err != nil {
-			log.Println("nginx.GetConfPath exec.Command error", err)
+			logger.Error(err)
 			return ""
 		}
 		r, _ := regexp.Compile("--conf-path=(.*)/(.*.conf)")
 		match := r.FindStringSubmatch(string(out))
 		if len(match) < 1 {
-			log.Println("nginx.GetConfPath len(match) < 1")
+			logger.Error("nginx.GetConfPath len(match) < 1")
 			return ""
 		}
 		confPath = r.FindStringSubmatch(string(out))[1]
@@ -66,13 +66,13 @@ func GetNginxPIDPath() string {
 	if settings.ServerSettings.NginxPIDPath == "" {
 		out, err := exec.Command("nginx", "-V").CombinedOutput()
 		if err != nil {
-			log.Println("nginx.GetNginxPIDPath exec.Command error", err)
+			logger.Error(err)
 			return ""
 		}
 		r, _ := regexp.Compile("--pid-path=(.*.pid)")
 		match := r.FindStringSubmatch(string(out))
 		if len(match) < 1 {
-			log.Println("nginx.GetNginxPIDPath len(match) < 1")
+			logger.Error("nginx.GetNginxPIDPath len(match) < 1")
 			return ""
 		}
 		confPath = r.FindStringSubmatch(string(out))[1]

+ 5 - 5
server/model/config_backup.go

@@ -1,9 +1,9 @@
 package model
 
 import (
-	"log"
-	"os"
-	"path/filepath"
+    "github.com/0xJacky/Nginx-UI/logger"
+    "os"
+    "path/filepath"
 )
 
 type ConfigBackup struct {
@@ -38,12 +38,12 @@ func GetBackup(id int) (config ConfigBackup) {
 func CreateBackup(path string) {
 	content, err := os.ReadFile(path)
 	if err != nil {
-		log.Println(err)
+        logger.Error(err)
 	}
 
 	config := ConfigBackup{Name: filepath.Base(path), FilePath: path, Content: string(content)}
 	result := db.Create(&config)
 	if result.Error != nil {
-		log.Println(result.Error)
+        logger.Error(result.Error)
 	}
 }

+ 5 - 5
server/model/model.go

@@ -2,14 +2,14 @@ package model
 
 import (
 	"fmt"
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/settings"
 	"github.com/gin-gonic/gin"
 	"github.com/spf13/cast"
 	"gorm.io/driver/sqlite"
 	"gorm.io/gen"
 	"gorm.io/gorm"
-	"gorm.io/gorm/logger"
-	"log"
+	gormlogger "gorm.io/gorm/logger"
 	"path"
 	"time"
 )
@@ -40,19 +40,19 @@ func Init() *gorm.DB {
 
 	var err error
 	db, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{
-		Logger:                                   logger.Default.LogMode(logger.Info),
+		Logger:                                   gormlogger.Default.LogMode(gormlogger.Info),
 		PrepareStmt:                              true,
 		DisableForeignKeyConstraintWhenMigrating: true,
 	})
 
 	if err != nil {
-		log.Println(err)
+		logger.Fatal(err.Error())
 	}
 
 	// Migrate the schema
 	err = db.AutoMigrate(GenerateAllModel()...)
 	if err != nil {
-		log.Fatal(err)
+		logger.Fatal(err.Error())
 	}
 
 	return db

+ 3 - 3
server/router/middleware.go

@@ -3,13 +3,13 @@ package router
 import (
 	"encoding/base64"
 	"github.com/0xJacky/Nginx-UI/frontend"
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/model"
 	"github.com/0xJacky/Nginx-UI/server/settings"
 	"github.com/gin-contrib/static"
 	"github.com/gin-gonic/gin"
 	"github.com/spf13/cast"
 	"io/fs"
-	"log"
 	"net/http"
 	"path"
 	"strings"
@@ -26,7 +26,7 @@ func recovery() gin.HandlerFunc {
 						errorAction = errorActionMsg
 					}
 				}
-				log.Println(err.(error).Error())
+				logger.Error(err)
 				c.JSON(http.StatusInternalServerError, gin.H{
 					"message": err.(error).Error(),
 					"error":   errorAction,
@@ -83,7 +83,7 @@ func mustFS(dir string) (serverFileSystem static.ServeFileSystem) {
 	sub, err := fs.Sub(frontend.DistFS, path.Join("dist", dir))
 
 	if err != nil {
-		log.Println(err)
+		logger.Error(err)
 		return
 	}
 

+ 5 - 3
server/server.go

@@ -1,6 +1,7 @@
 package server
 
 import (
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/internal/analytic"
 	"github.com/0xJacky/Nginx-UI/server/internal/cert"
 	"github.com/0xJacky/Nginx-UI/server/internal/nginx"
@@ -21,7 +22,8 @@ func Program(state overseer.State) {
 	// See https://github.com/golang/go/issues/32350
 	_ = mime.AddExtensionType(".js", "text/javascript; charset=utf-8")
 
-	log.Printf("Nginx config dir path: %s", nginx.GetConfPath())
+	logger.Info("Nginx config dir path: " + nginx.GetConfPath())
+
 	if "" != settings.ServerSettings.JwtSecret {
 		db := model.Init()
 		query.Init(db)
@@ -31,7 +33,7 @@ func Program(state overseer.State) {
 	job, err := s.Every(30).Minute().SingletonMode().Do(cert.AutoObtain)
 
 	if err != nil {
-		log.Fatalf("AutoCert Job: %v, Err: %v\n", job, err)
+		logger.Fatalf("AutoCert Job: %v, Err: %v\n", job, err)
 	}
 
 	s.StartAsync()
@@ -42,5 +44,5 @@ func Program(state overseer.State) {
 	if err != nil {
 		log.Fatalln(err)
 	}
-	log.Println("[Nginx UI] server exiting")
+	logger.Info("Server exiting")
 }

+ 2 - 2
server/service/template.go

@@ -3,6 +3,7 @@ package service
 import (
 	"bufio"
 	"bytes"
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/internal/nginx"
 	"github.com/0xJacky/Nginx-UI/server/settings"
 	templ "github.com/0xJacky/Nginx-UI/template"
@@ -11,7 +12,6 @@ import (
 	"github.com/pkg/errors"
 	"github.com/tufanbarisyildirim/gonginx/parser"
 	"io"
-	"log"
 	"path/filepath"
 	"strings"
 	"text/template"
@@ -64,7 +64,7 @@ func GetTemplateInfo(path, name string) (configListItem ConfigInfoItem) {
 
 	_, err = toml.Decode(content, &configListItem)
 	if err != nil {
-		log.Println("toml.Decode", err.Error())
+		logger.Error(err)
 	}
 	return
 }

+ 3 - 3
server/service/upgrade.go

@@ -5,11 +5,11 @@ import (
 	"fmt"
 	_github "github.com/0xJacky/Nginx-UI/.github"
 	"github.com/0xJacky/Nginx-UI/frontend"
+	"github.com/0xJacky/Nginx-UI/logger"
 	"github.com/0xJacky/Nginx-UI/server/internal/helper"
 	"github.com/0xJacky/Nginx-UI/server/settings"
 	"github.com/pkg/errors"
 	"io"
-	"log"
 	"net/http"
 	"net/url"
 	"os"
@@ -322,8 +322,8 @@ func (u *Upgrader) DownloadLatestRelease(progressChan chan float64) (tarName str
 
 	digestFileContent := strings.TrimSpace(string(digestFileBytes))
 
-	log.Println("DownloadLatestRelease tar digest", helper.DigestSHA512(tarName))
-	log.Println("DownloadLatestRelease digestFileContent", digestFileContent)
+	logger.Debug("DownloadLatestRelease tar digest", helper.DigestSHA512(tarName))
+	logger.Debug("DownloadLatestRelease digestFileContent", digestFileContent)
 
 	if digestFileContent != helper.DigestSHA512(tarName) {
 		err = errors.Wrap(err, "digest not equal")

部分文件因文件數量過多而無法顯示