فهرست منبع

更新日志记录函数和结构体

在 `server.go` 中添加了 `writer` 字段,并更新了日志记录方法的调用方式。同时,在 `logger.go` 和 `export.go` 中重构了日志记录函数,使其支持更多的日志级别和功能。删除了未使用的导入。
SongZihuan 3 ماه پیش
والد
کامیت
4e29fe85f0
4فایلهای تغییر یافته به همراه280 افزوده شده و 35 حذف شده
  1. 139 12
      src/logger/export.go
  2. 135 6
      src/logger/logger.go
  3. 3 2
      src/server/logger.go
  4. 3 15
      src/server/server.go

+ 139 - 12
src/logger/export.go

@@ -102,43 +102,170 @@ func Panic(args ...interface{}) {
 	globalLogger.Panic(args...)
 }
 
-func DebugWriter() io.Writer {
+func TagWrite(msg string) {
+	if !IsReady() {
+		return
+	}
+	globalLogger.TagSkip(1, msg)
+}
+
+func DebugWrite(msg string) {
+	if !IsReady() {
+		return
+	}
+	globalLogger.DebugWrite(msg)
+}
+
+func InfoWrite(msg string) {
+	if !IsReady() {
+		return
+	}
+	globalLogger.InfoWrite(msg)
+}
+
+func WarnWrite(msg string) {
+	if !IsReady() {
+		return
+	}
+	globalLogger.WarnWrite(msg)
+}
+
+func ErrorWrite(msg string) {
+	if !IsReady() {
+		return
+	}
+	globalLogger.ErrorWrite(msg)
+}
+
+func PanicWrite(msg string) {
+	if !IsReady() {
+		return
+	}
+	globalLogger.PanicWrite(msg)
+}
+
+func GetDebugWriter() io.Writer {
 	if !IsReady() {
 		return DefaultWarnWriter
 	}
-	return globalLogger.DebugWriter()
+	return globalLogger.GetDebugWriter()
 }
 
-func InfoWriter() io.Writer {
+func GetInfoWriter() io.Writer {
 	if !IsReady() {
 		return DefaultWarnWriter
 	}
-	return globalLogger.InfoWriter()
+	return globalLogger.GetInfoWriter()
 }
 
-func WarningWriter() io.Writer {
+func GetWarningWriter() io.Writer {
 	if !IsReady() {
 		return DefaultWarnWriter
 	}
-	return globalLogger.WarningWriter()
+	return globalLogger.GetWarningWriter()
 }
 
-func TagWriter() io.Writer {
+func GetTagWriter() io.Writer {
 	if !IsReady() {
 		return DefaultWarnWriter
 	}
-	return globalLogger.TagWriter()
+	return globalLogger.GetTagWriter()
 }
 
-func ErrorWriter() io.Writer {
+func GetErrorWriter() io.Writer {
 	if !IsReady() {
 		return DefaultWarnWriter
 	}
-	return globalLogger.ErrorWriter()
+	return globalLogger.GetErrorWriter()
 }
-func PanicWriter() io.Writer {
+
+func GetPanicWriter() io.Writer {
 	if !IsReady() {
 		return DefaultWarnWriter
 	}
-	return globalLogger.PanicWriter()
+	return globalLogger.GetPanicWriter()
+}
+
+func IsDebugTerm() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsDebugTerm()
+}
+
+func IsInfoTerm() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsDebugTerm()
+}
+
+func IsTagTerm() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsTagTerm()
+}
+
+func IsWarnTerm() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsWarnTerm()
+}
+
+func IsErrorTerm() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsErrorTerm()
+}
+
+func IsPanicTerm() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsPanicTerm()
+}
+
+func IsDebugTermNotDumb() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsDebugTerm()
+}
+
+func IsInfoTermNotDumb() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsInfoTermNotDumb()
+}
+
+func IsTagTermNotDumb() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsTagTermNotDumb()
+}
+
+func IsWarnTermNotDumb() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsWarnTermNotDumb()
+}
+
+func IsErrorTermNotDumb() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsErrorTermNotDumb()
+}
+
+func IsPanicTermNotDumb() bool {
+	if !IsReady() {
+		return false
+	}
+	return globalLogger.IsPanicTermNotDumb()
 }

+ 135 - 6
src/logger/logger.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"github.com/SongZihuan/huan-proxy/src/config"
 	"github.com/SongZihuan/huan-proxy/src/utils"
+	"github.com/mattn/go-isatty"
 	"io"
 	"os"
 )
@@ -224,25 +225,153 @@ func (l *Logger) Panic(args ...interface{}) {
 	_, _ = fmt.Fprintf(l.errWriter, "%s: %s\n", l.args0Name, str)
 }
 
-func (l *Logger) DebugWriter() io.Writer {
+func (l *Logger) TagWrite(msg string) {
+	l.TagSkipWrite(1, msg)
+}
+
+func (l *Logger) TagSkipWrite(skip int, msg string) {
+	if !l.logTag {
+		return
+	}
+
+	funcName, file, _, line := utils.GetCallingFunctionInfo(skip + 1)
+
+	_, _ = fmt.Fprintf(l.warnWriter, "%s: TAG %s %s %s:%d\n", l.args0Name, msg, funcName, file, line)
+}
+
+func (l *Logger) DebugWrite(msg string) {
+	if l.logLevel > levelDebug {
+		return
+	}
+
+	_, _ = fmt.Fprintf(l.warnWriter, "%s: %s\n", l.args0Name, msg)
+}
+
+func (l *Logger) InfoWrite(msg string) {
+	if l.logLevel > levelInfo {
+		return
+	}
+
+	_, _ = fmt.Fprintf(l.warnWriter, "%s: %s\n", l.args0Name, msg)
+}
+
+func (l *Logger) WarnWrite(msg string) {
+	if l.logLevel > levelWarn {
+		return
+	}
+
+	_, _ = fmt.Fprintf(l.warnWriter, "%s: %\ns", l.args0Name, msg)
+}
+
+func (l *Logger) ErrorWrite(msg string) {
+	if l.logLevel > levelError {
+		return
+	}
+
+	_, _ = fmt.Fprintf(l.errWriter, "%s: %s\n", l.args0Name, msg)
+}
+
+func (l *Logger) PanicWrite(msg string) {
+	if l.logLevel > levelPanic {
+		return
+	}
+
+	_, _ = fmt.Fprintf(l.errWriter, "%s: %s\n", l.args0Name, msg)
+}
+
+func (l *Logger) GetDebugWriter() io.Writer {
 	return l.warnWriter
 }
 
-func (l *Logger) InfoWriter() io.Writer {
+func (l *Logger) GetInfoWriter() io.Writer {
 	return l.warnWriter
 }
 
-func (l *Logger) WarningWriter() io.Writer {
+func (l *Logger) GetWarningWriter() io.Writer {
 	return l.warnWriter
 }
 
-func (l *Logger) TagWriter() io.Writer {
+func (l *Logger) GetTagWriter() io.Writer {
 	return l.warnWriter
 }
 
-func (l *Logger) ErrorWriter() io.Writer {
+func (l *Logger) GetErrorWriter() io.Writer {
 	return l.errWriter
 }
-func (l *Logger) PanicWriter() io.Writer {
+
+func (l *Logger) GetPanicWriter() io.Writer {
 	return l.errWriter
 }
+
+func (l *Logger) isWarnWriterTerm() bool {
+	w, ok := l.warnWriter.(*os.File)
+	if !ok {
+		return false
+	} else if !isatty.IsTerminal(w.Fd()) && !isatty.IsCygwinTerminal(w.Fd()) { // 非终端
+		return false
+	}
+	return true
+}
+
+func (l *Logger) isErrWriterTerm() bool {
+	w, ok := l.errWriter.(*os.File)
+	if !ok {
+		return false
+	} else if !isatty.IsTerminal(w.Fd()) && !isatty.IsCygwinTerminal(w.Fd()) { // 非终端
+		return false
+	}
+	return true
+}
+
+func (l *Logger) isTermDump() bool {
+	// TERM为dump表示终端为基础模式,不支持高级显示
+	return os.Getenv("TERM") == "dumb"
+}
+
+func (l *Logger) IsDebugTerm() bool {
+	return l.isWarnWriterTerm()
+}
+
+func (l *Logger) IsInfoTerm() bool {
+	return l.isWarnWriterTerm()
+}
+
+func (l *Logger) IsWarnTerm() bool {
+	return l.isWarnWriterTerm()
+}
+
+func (l *Logger) IsTagTerm() bool {
+	return l.isWarnWriterTerm()
+}
+
+func (l *Logger) IsErrorTerm() bool {
+	return l.isErrWriterTerm()
+}
+
+func (l *Logger) IsPanicTerm() bool {
+	return l.isErrWriterTerm()
+}
+
+func (l *Logger) IsDebugTermNotDumb() bool {
+	return l.isWarnWriterTerm() && !l.isTermDump()
+}
+
+func (l *Logger) IsInfoTermNotDumb() bool {
+	return l.isWarnWriterTerm() && !l.isTermDump()
+}
+
+func (l *Logger) IsWarnTermNotDumb() bool {
+	return l.isWarnWriterTerm() && !l.isTermDump()
+}
+
+func (l *Logger) IsTagTermNotDumb() bool {
+	return l.isWarnWriterTerm() && !l.isTermDump()
+}
+
+func (l *Logger) IsErrorTermNotDumb() bool {
+	return l.isErrWriterTerm() && !l.isTermDump()
+}
+
+func (l *Logger) IsPanicTermNotDumb() bool {
+	return l.isErrWriterTerm() && !l.isTermDump()
+}

+ 3 - 2
src/server/logger.go

@@ -6,7 +6,6 @@ package server
 
 import (
 	"fmt"
-	"github.com/SongZihuan/huan-proxy/src/logger"
 	"io"
 	"net/http"
 	"time"
@@ -164,5 +163,7 @@ func (s *HTTPServer) LoggerServerHTTP(_w http.ResponseWriter, r *http.Request, n
 
 	param.Path = path
 
-	logger.Info(s.Formatter(param))
+	if s.writer != nil {
+		s.writer(s.Formatter(param))
+	}
 }

+ 3 - 15
src/server/server.go

@@ -7,9 +7,7 @@ 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"
 )
 
@@ -20,6 +18,7 @@ type HTTPServer struct {
 	cfg     *config.ConfigStruct
 	skip    map[string]struct{}
 	isTerm  bool
+	writer  func(msg string)
 }
 
 func NewServer() *HTTPServer {
@@ -28,24 +27,13 @@ func NewServer() *HTTPServer {
 	}
 
 	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(),
 		skip:    skip,
-		isTerm:  isTerm,
+		isTerm:  logger.IsInfoTermNotDumb(),
+		writer:  logger.InfoWrite,
 	}
 }