refactor: use zap as logger

This commit is contained in:
0xJacky 2023-05-06 21:09:22 +08:00
parent 2831208de3
commit f305701b30
No known key found for this signature in database
GPG key ID: B6E4A6E4A561BAF0
34 changed files with 327 additions and 175 deletions

View file

@ -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.

View file

@ -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>

View file

@ -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')
]

View file

@ -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

View file

@ -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

File diff suppressed because one or more lines are too long

Binary file not shown.

View file

@ -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

View file

@ -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
go.mod
View file

@ -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

15
go.sum
View file

@ -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
logger/color.go Normal file
View file

@ -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
logger/logger.go Normal file
View file

@ -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...)
}

51
main.go
View file

@ -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,
})
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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

View file

@ -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

View file

@ -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
}

View file

@ -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
}

View file

@ -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

View file

@ -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
}
}

View file

@ -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.

View file

@ -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
}

View file

@ -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")
}

View file

@ -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)
}
}()

View file

@ -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
}

View file

@ -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]

View file

@ -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)
}
}

View file

@ -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

View file

@ -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
}

View file

@ -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")
}

View file

@ -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
}

View file

@ -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")