From 7f1603cbbc8d6ef482dd0a3d5e1919ab0fc67413 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Sun, 10 Apr 2022 15:58:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9C=AC=E5=9C=B0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/apps/log_writer.go | 91 ++++++++++++++++++++++++------ internal/utils/sizes/sizes.go | 10 ++++ internal/utils/sizes/sizes_test.go | 17 ++++++ 3 files changed, 101 insertions(+), 17 deletions(-) create mode 100644 internal/utils/sizes/sizes.go create mode 100644 internal/utils/sizes/sizes_test.go diff --git a/internal/apps/log_writer.go b/internal/apps/log_writer.go index ac45c5a7..91283059 100644 --- a/internal/apps/log_writer.go +++ b/internal/apps/log_writer.go @@ -1,51 +1,108 @@ package apps import ( + "github.com/TeaOSLab/EdgeAdmin/internal/goman" + "github.com/TeaOSLab/EdgeAdmin/internal/utils/sizes" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/files" - "github.com/iwind/TeaGo/logs" - "github.com/iwind/TeaGo/utils/time" + timeutil "github.com/iwind/TeaGo/utils/time" "log" + "os" + "runtime" + "strconv" + "strings" ) type LogWriter struct { - fileAppender *files.Appender + fp *os.File + c chan string } func (this *LogWriter) Init() { // 创建目录 - dir := files.NewFile(Tea.LogDir()) + var dir = files.NewFile(Tea.LogDir()) if !dir.Exists() { err := dir.Mkdir() if err != nil { - log.Println("[error]" + err.Error()) + log.Println("[LOG]create log dir failed: " + err.Error()) } } - logFile := files.NewFile(Tea.LogFile("run.log")) - // 打开要写入的日志文件 - appender, err := logFile.Appender() + var logPath = Tea.LogFile("run.log") + fp, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { - logs.Error(err) + log.Println("[LOG]open log file failed: " + err.Error()) } else { - this.fileAppender = appender + this.fp = fp + } + + this.c = make(chan string, 1024) + + // 异步写入文件 + var maxFileSize = 2 * sizes.G // 文件最大尺寸,超出此尺寸则清空 + if fp != nil { + goman.New(func() { + var totalSize int64 = 0 + stat, err := fp.Stat() + if err == nil { + totalSize = stat.Size() + } + + for message := range this.c { + totalSize += int64(len(message)) + _, err := fp.WriteString(timeutil.Format("Y/m/d H:i:s ") + message + "\n") + if err != nil { + log.Println("[LOG]write log failed: " + err.Error()) + } else { + // 如果太大则Truncate + if totalSize > maxFileSize { + _ = fp.Truncate(0) + totalSize = 0 + } + } + } + }) } } func (this *LogWriter) Write(message string) { - log.Println(message) + backgroundEnv, _ := os.LookupEnv("EdgeBackground") + if backgroundEnv != "on" { + // 文件和行号 + var file string + var line int + if Tea.IsTesting() { + var callDepth = 3 + var ok bool + _, file, line, ok = runtime.Caller(callDepth) + if ok { + file = this.packagePath(file) + } + } - if this.fileAppender != nil { - _, err := this.fileAppender.AppendString(timeutil.Format("Y/m/d H:i:s ") + message + "\n") - if err != nil { - log.Println("[error]" + err.Error()) + if len(file) > 0 { + log.Println(message + " (" + file + ":" + strconv.Itoa(line) + ")") + } else { + log.Println(message) } } + + this.c <- message } func (this *LogWriter) Close() { - if this.fileAppender != nil { - _ = this.fileAppender.Close() + if this.fp != nil { + _ = this.fp.Close() } + + close(this.c) +} + +func (this *LogWriter) packagePath(path string) string { + var pieces = strings.Split(path, "/") + if len(pieces) >= 2 { + return strings.Join(pieces[len(pieces)-2:], "/") + } + return path } diff --git a/internal/utils/sizes/sizes.go b/internal/utils/sizes/sizes.go new file mode 100644 index 00000000..c0bb3ffa --- /dev/null +++ b/internal/utils/sizes/sizes.go @@ -0,0 +1,10 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package sizes + +const ( + K int64 = 1024 + M = 1024 * K + G = 1024 * M + T = 1024 * G +) diff --git a/internal/utils/sizes/sizes_test.go b/internal/utils/sizes/sizes_test.go new file mode 100644 index 00000000..35334f50 --- /dev/null +++ b/internal/utils/sizes/sizes_test.go @@ -0,0 +1,17 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package sizes_test + +import ( + "github.com/TeaOSLab/EdgeNode/internal/utils/sizes" + "github.com/iwind/TeaGo/assert" + "testing" +) + +func TestSizes(t *testing.T) { + var a = assert.NewAssertion(t) + a.IsTrue(sizes.K == 1024) + a.IsTrue(sizes.M == 1024*1024) + a.IsTrue(sizes.G == 1024*1024*1024) + a.IsTrue(sizes.T == 1024*1024*1024*1024) +}