Browse Source

更新依赖并移除终端输出相关代码

更新了项目的依赖,添加了 `github.com/mattn/go-isatty` 以检测终端类型,并移除了与终端输出相关的代码和配置,简化了日志处理逻辑。
SongZihuan 3 months ago
parent
commit
296413b08b
9 changed files with 114 additions and 58 deletions
  1. 2 0
      go.mod
  2. 5 0
      go.sum
  3. 0 17
      src/flagparser/data.go
  4. 0 4
      src/flagparser/getter.go
  5. 45 0
      src/logger/export.go
  6. 34 1
      src/logger/logger.go
  7. 2 1
      src/mainfunc/v1.go
  8. 4 25
      src/server/logger.go
  9. 22 10
      src/server/server.go

+ 2 - 0
go.mod

@@ -10,5 +10,7 @@ require (
 )
 
 require (
+	github.com/mattn/go-isatty v0.0.20 // indirect
 	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/sys v0.28.0 // indirect
 )

+ 5 - 0
go.sum

@@ -1,7 +1,12 @@
 github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA=
 github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
 golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 0 - 17
src/flagparser/data.go

@@ -35,9 +35,6 @@ type flagData struct {
 	ConfigFileData  string
 	ConfigFileName  string
 	ConfigFileUsage string
-	TermData        bool
-	TermName        string
-	TermUsage       string
 
 	Usage string
 }
@@ -63,9 +60,6 @@ func initData() {
 		ConfigFileData:  "config.yaml",
 		ConfigFileName:  "config",
 		ConfigFileUsage: fmt.Sprintf("%s", "The location of the running configuration file of the backend service. The option is a string, the default value is config.yaml in the running directory."),
-		TermData:        false,
-		TermName:        "term",
-		TermUsage:       "Terminal output mode. If you have this program running in the foreground terminal (standard output is the terminal), you can turn this option on to get formatted logs.",
 		Usage:           "",
 	}
 
@@ -174,9 +168,6 @@ func (d *flagData) setFlag() {
 	flag.StringVar(&d.ConfigFileData, data.ConfigFileName, data.ConfigFileData, data.ConfigFileUsage)
 	flag.StringVar(&d.ConfigFileData, data.ConfigFileName[0:1], data.ConfigFileData, data.ConfigFileUsage)
 
-	flag.BoolVar(&d.TermData, data.TermName, data.TermData, data.TermUsage)
-	flag.BoolVar(&d.TermData, data.TermName[0:1], data.TermData, data.TermUsage)
-
 	flag.Usage = func() {
 		_, _ = d.PrintUsage()
 	}
@@ -304,14 +295,6 @@ func (d *flagData) ConfigFile() string {
 	return d.ConfigFileData
 }
 
-func (d *flagData) Term() bool {
-	if !d.isReady() {
-		panic("flag not ready")
-	}
-
-	return d.TermData
-}
-
 func (d *flagData) SetOutput(writer io.Writer) {
 	flag.CommandLine.SetOutput(writer)
 }

+ 0 - 4
src/flagparser/getter.go

@@ -98,10 +98,6 @@ func ConfigFile() string {
 	return data.ConfigFile()
 }
 
-func Term() bool {
-	return data.Term()
-}
-
 func SetOutput(writer io.Writer) {
 	data.SetOutput(writer)
 }

+ 45 - 0
src/logger/export.go

@@ -1,5 +1,9 @@
 package logger
 
+import (
+	"io"
+)
+
 func Executablef(format string, args ...interface{}) string {
 	if !IsReady() {
 		return ""
@@ -97,3 +101,44 @@ func Panic(args ...interface{}) {
 	}
 	globalLogger.Panic(args...)
 }
+
+func DebugWriter() io.Writer {
+	if !IsReady() {
+		return DefaultWarnWriter
+	}
+	return globalLogger.DebugWriter()
+}
+
+func InfoWriter() io.Writer {
+	if !IsReady() {
+		return DefaultWarnWriter
+	}
+	return globalLogger.InfoWriter()
+}
+
+func WarningWriter() io.Writer {
+	if !IsReady() {
+		return DefaultWarnWriter
+	}
+	return globalLogger.WarningWriter()
+}
+
+func TagWriter() io.Writer {
+	if !IsReady() {
+		return DefaultWarnWriter
+	}
+	return globalLogger.TagWriter()
+}
+
+func ErrorWriter() io.Writer {
+	if !IsReady() {
+		return DefaultWarnWriter
+	}
+	return globalLogger.ErrorWriter()
+}
+func PanicWriter() io.Writer {
+	if !IsReady() {
+		return DefaultWarnWriter
+	}
+	return globalLogger.PanicWriter()
+}

+ 34 - 1
src/logger/logger.go

@@ -50,8 +50,10 @@ type Logger struct {
 }
 
 var globalLogger *Logger = nil
+var DefaultWarnWriter = os.Stdout
+var DefaultErrorWriter = os.Stderr
 
-func InitLogger() error {
+func InitLogger(warnWriter, errWriter io.Writer) error {
 	if !config.IsReady() {
 		panic("config is not ready")
 	}
@@ -62,6 +64,14 @@ func InitLogger() error {
 		return fmt.Errorf("invalid log level: %s", level)
 	}
 
+	if warnWriter == nil {
+		warnWriter = DefaultWarnWriter
+	}
+
+	if errWriter == nil {
+		errWriter = DefaultErrorWriter
+	}
+
 	logger := &Logger{
 		level:      level,
 		logLevel:   logLevel,
@@ -213,3 +223,26 @@ func (l *Logger) Panic(args ...interface{}) {
 	str := fmt.Sprint(args...)
 	_, _ = fmt.Fprintf(l.errWriter, "%s: %s\n", l.args0Name, str)
 }
+
+func (l *Logger) DebugWriter() io.Writer {
+	return l.warnWriter
+}
+
+func (l *Logger) InfoWriter() io.Writer {
+	return l.warnWriter
+}
+
+func (l *Logger) WarningWriter() io.Writer {
+	return l.warnWriter
+}
+
+func (l *Logger) TagWriter() io.Writer {
+	return l.warnWriter
+}
+
+func (l *Logger) ErrorWriter() io.Writer {
+	return l.errWriter
+}
+func (l *Logger) PanicWriter() io.Writer {
+	return l.errWriter
+}

+ 2 - 1
src/mainfunc/v1.go

@@ -7,6 +7,7 @@ import (
 	"github.com/SongZihuan/huan-proxy/src/logger"
 	"github.com/SongZihuan/huan-proxy/src/server"
 	"github.com/SongZihuan/huan-proxy/src/utils"
+	"os"
 )
 
 func MainV1() int {
@@ -39,7 +40,7 @@ func MainV1() int {
 
 	cfg := config.Config()
 
-	err = logger.InitLogger()
+	err = logger.InitLogger(os.Stdout, os.Stderr)
 	if err != nil {
 		return utils.ExitByError(err)
 	}

+ 4 - 25
src/server/logger.go

@@ -6,24 +6,12 @@ package server
 
 import (
 	"fmt"
-	"github.com/SongZihuan/huan-proxy/src/flagparser"
 	"github.com/SongZihuan/huan-proxy/src/logger"
 	"io"
 	"net/http"
-	"os"
 	"time"
 )
 
-type consoleColorModeValue int
-
-var DefaultWriter io.Writer = os.Stdout
-
-const (
-	autoColor consoleColorModeValue = iota
-	disableColor
-	forceColor
-)
-
 const (
 	green   = "\033[97;42m"
 	white   = "\033[90;47m"
@@ -35,8 +23,6 @@ const (
 	reset   = "\033[0m"
 )
 
-var consoleColorMode = autoColor
-
 // LoggerConfig defines the config for Logger middleware.
 type LoggerConfig struct {
 	// Optional. Default value is gin.defaultLogFormatter
@@ -125,15 +111,9 @@ func (p *LogFormatterParams) ResetColor() string {
 	return reset
 }
 
-// IsOutputColor indicates whether can colors be outputted to the log.
-func (p *LogFormatterParams) IsOutputColor() bool {
-	return consoleColorMode == forceColor || (consoleColorMode == autoColor && p.isTerm)
-}
-
-// defaultLogFormatter is the default log format function Logger middleware uses.
-var defaultLogFormatter = func(param LogFormatterParams) string {
+func (s *HTTPServer) Formatter(param LogFormatterParams) string {
 	var statusColor, methodColor, resetColor string
-	if param.IsOutputColor() {
+	if s.isTerm {
 		statusColor = param.StatusCodeColor()
 		methodColor = param.MethodColor()
 		resetColor = param.ResetColor()
@@ -152,7 +132,6 @@ var defaultLogFormatter = func(param LogFormatterParams) string {
 	)
 }
 
-// LoggerWithConfig instance a Logger middleware with config.
 func (s *HTTPServer) LoggerServerHTTP(_w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
 	// Start timer
 	start := time.Now()
@@ -166,7 +145,7 @@ func (s *HTTPServer) LoggerServerHTTP(_w http.ResponseWriter, r *http.Request, n
 
 	param := LogFormatterParams{
 		Request: r,
-		isTerm:  flagparser.Term(),
+		isTerm:  s.isTerm,
 		Keys:    make(map[string]any),
 	}
 
@@ -185,5 +164,5 @@ func (s *HTTPServer) LoggerServerHTTP(_w http.ResponseWriter, r *http.Request, n
 
 	param.Path = path
 
-	logger.Info(s.formatter(param))
+	logger.Info(s.Formatter(param))
 }

+ 22 - 10
src/server/server.go

@@ -7,18 +7,19 @@ import (
 	"github.com/SongZihuan/huan-proxy/src/flagparser"
 	"github.com/SongZihuan/huan-proxy/src/logger"
 	"github.com/SongZihuan/huan-proxy/src/utils"
+	"github.com/mattn/go-isatty"
 	"net/http"
+	"os"
 	"strings"
 )
 
 var ServerStop = fmt.Errorf("server stop")
 
 type HTTPServer struct {
-	address   string
-	cfg       *config.ConfigStruct
-	formatter func(param LogFormatterParams) string
-	skip      map[string]struct{}
-	isTerm    bool
+	address string
+	cfg     *config.ConfigStruct
+	skip    map[string]struct{}
+	isTerm  bool
 }
 
 func NewServer() *HTTPServer {
@@ -26,14 +27,25 @@ func NewServer() *HTTPServer {
 		panic("not ready")
 	}
 
-	var formatter = defaultLogFormatter
 	var skip = make(map[string]struct{}, 10)
+	var isTerm = true
+	var out = logger.InfoWriter()
+
+	w, ok := out.(*os.File)
+	if !ok {
+		isTerm = false
+	} else if !isatty.IsTerminal(w.Fd()) && !isatty.IsCygwinTerminal(w.Fd()) { // 非终端
+		isTerm = false
+	} else if os.Getenv("TERM") == "dumb" {
+		// TERM为dump表示终端为基础模式,不支持高级显示
+		isTerm = false
+	}
 
 	return &HTTPServer{
-		address:   config.Config().Yaml.Http.Address,
-		cfg:       config.Config(),
-		formatter: formatter,
-		skip:      skip,
+		address: config.Config().Yaml.Http.Address,
+		cfg:     config.Config(),
+		skip:    skip,
+		isTerm:  isTerm,
 	}
 }