Преглед изворни кода

重构日志写入器并修复日期文件分割问题

将原有的 `warp_writer.go` 和 `warp_writer_closer.go` 文件移除,并引入新的 `wrapwriter` 和 `wrapwritercloser` 包来替代。同时,修正了 `DateFileWriter` 中打开文件时的权限设置和文件名格式问题,确保日志数据不会丢失。
SongZihuan пре 2 недеља
родитељ
комит
91e36e6d92

+ 7 - 3
CHANGELOG.md

@@ -7,14 +7,18 @@
 
 ## [未发行]
 
-### 新增功能
+### 新增
 
 - 新增版本号获取功能(仅输出版本号,不输出其他任何内容,不以字母v或V开头)。
 - 加入对 `Windows Console` 的支持。
 
+### 修复
+
+- 修复日志记录器中的按日期分割日志文件记录器丢失日志数据的问题。
+
 ## [0.2.0] - 2025-04-16
 
-### 新增功能
+### 新增
 
 - 获取构建时时间
 - 获取构建时`Git`信息(若有):当前`commit hash`、当前最新`tag`(若有)、以及`tag`(若有)对应的`commit hash`(若有)。
@@ -57,7 +61,7 @@
 
 ## [0.1.0] - 2025-04-03
 
-### 新增功能
+### 新增
 
 - 日志(支持投递到标准输出、文件、日期切割的文件、自定义输出、多输出合并)
 - 命令行参数(支持`string`、`bool`、`uint`、`int`)

+ 3 - 2
src/config/logger_writer_config.go

@@ -12,6 +12,7 @@ import (
 	"github.com/SongZihuan/BackendServerTemplate/src/logger/write/combiningwriter"
 	"github.com/SongZihuan/BackendServerTemplate/src/logger/write/datefilewriter"
 	"github.com/SongZihuan/BackendServerTemplate/src/logger/write/filewriter"
+	"github.com/SongZihuan/BackendServerTemplate/src/logger/write/wrapwriter"
 	"io"
 	"os"
 	"strings"
@@ -54,9 +55,9 @@ func (d *LoggerWriterConfig) process(c *configInfo, setter func(w io.Writer) (io
 
 	switch d.WriteToStd {
 	case "stdout":
-		writerList = append(writerList, write.ChangeToWriter(os.Stdout))
+		writerList = append(writerList, wrapwriter.WrapToWriter(os.Stdout))
 	case "stderr":
-		writerList = append(writerList, write.ChangeToWriter(os.Stderr))
+		writerList = append(writerList, wrapwriter.WrapToWriter(os.Stderr))
 	}
 
 	if d.WriteToFile != "" {

+ 3 - 3
src/logger/internal/init.go

@@ -7,7 +7,7 @@ package internal
 import (
 	"fmt"
 	"github.com/SongZihuan/BackendServerTemplate/src/logger/loglevel"
-	"github.com/SongZihuan/BackendServerTemplate/src/logger/write"
+	"github.com/SongZihuan/BackendServerTemplate/src/logger/write/wrapwriter"
 	"github.com/SongZihuan/BackendServerTemplate/src/utils/osutils"
 	"io"
 	"os"
@@ -20,11 +20,11 @@ func InitLogger(level loglevel.LoggerLevel, logTag bool, realPanic bool, warnWri
 	}
 
 	if warnWriter == nil {
-		warnWriter = write.ChangeToWriter(os.Stdout)
+		warnWriter = wrapwriter.WrapToWriter(os.Stdout)
 	}
 
 	if errWriter == nil {
-		errWriter = write.ChangeToWriter(os.Stderr)
+		errWriter = wrapwriter.WrapToWriter(os.Stderr)
 	}
 
 	logger := &Logger{

+ 3 - 2
src/logger/internal/set_method.go

@@ -8,6 +8,7 @@ import (
 	"fmt"
 	"github.com/SongZihuan/BackendServerTemplate/src/logger/loglevel"
 	"github.com/SongZihuan/BackendServerTemplate/src/logger/write"
+	"github.com/SongZihuan/BackendServerTemplate/src/logger/write/wrapwriter"
 	"os"
 )
 
@@ -46,7 +47,7 @@ func (l *Logger) SetArgs0Name(args0 string, args0Name string) error {
 
 func (l *Logger) SetWarnWriter(w write.Writer) (write.Writer, error) {
 	if w == nil {
-		w = write.ChangeToWriter(os.Stdout)
+		w = wrapwriter.WrapToWriter(os.Stdout)
 	}
 
 	last := l.warnWriter
@@ -56,7 +57,7 @@ func (l *Logger) SetWarnWriter(w write.Writer) (write.Writer, error) {
 
 func (l *Logger) SetErrWriter(w write.Writer) (write.Writer, error) {
 	if w == nil {
-		w = write.ChangeToWriter(os.Stderr)
+		w = wrapwriter.WrapToWriter(os.Stderr)
 	}
 
 	last := l.errWriter

+ 8 - 0
src/logger/write/combiningwriter/writer.go

@@ -85,3 +85,11 @@ func NewCombiningWriter(w ...write.Writer) *CombiningWriter {
 
 	return res
 }
+
+func _testCombiningWriter() {
+	var a write.WriteCloser
+	var b *CombiningWriter
+
+	a = b
+	_ = a
+}

+ 13 - 7
src/logger/write/datefilewriter/writer.go

@@ -30,7 +30,7 @@ func (f *DateFileWriter) Write(p []byte) (n int, err error) {
 	if suffix != f.filenameSuffix {
 		_ = f.closeFile()
 		err := f.openFile(suffix)
-		if err == nil {
+		if err != nil {
 			return 0, err
 		}
 	}
@@ -59,23 +59,20 @@ func (f *DateFileWriter) closeFile() error {
 }
 
 func (f *DateFileWriter) openFile(newSuffix string) error {
-	defer func() {
-		f.filenameSuffix = newSuffix
-	}()
-
 	if f.file != nil {
 		return fmt.Errorf("last file has not been closse")
 	}
 
-	filename := fmt.Sprintf("%s-%s", f.filenamePrefix, newSuffix)
+	filename := fmt.Sprintf("%s.%s.log", f.filenamePrefix, newSuffix)
 	filePath := path.Join(f.dirPath, filename)
 
-	file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
+	file, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
 	if err != nil {
 		return err
 	}
 
 	f.file = file
+	f.filenameSuffix = newSuffix
 
 	return nil
 }
@@ -109,6 +106,7 @@ func NewDateFileWriter(dirpath string, filenamePrefix string) (*DateFileWriter,
 		return nil, err
 	}
 
+	res.dirPath = dirpath
 	res.filenamePrefix = filenamePrefix
 	res.close = false
 
@@ -117,3 +115,11 @@ func NewDateFileWriter(dirpath string, filenamePrefix string) (*DateFileWriter,
 
 	return res, nil
 }
+
+func _testDateFileWriter() {
+	var a write.WriteCloser
+	var b *DateFileWriter
+
+	a = b
+	_ = a
+}

+ 0 - 29
src/logger/write/warp_writer.go

@@ -1,29 +0,0 @@
-// Copyright 2025 BackendServerTemplate Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package write
-
-import "io"
-
-type wrapperWriter struct {
-	writer io.Writer
-}
-
-func (w *wrapperWriter) Write(p []byte) (n int, err error) {
-	return w.writer.Write(p)
-}
-
-func ChangeToWriter(w io.Writer) Writer {
-	return &wrapperWriter{
-		writer: w,
-	}
-}
-
-func _testWarpWriter() {
-	var a *wrapperWriter
-	var b Writer
-
-	b = a
-	_ = b
-}

+ 0 - 47
src/logger/write/warp_writer_closer.go

@@ -1,47 +0,0 @@
-// Copyright 2025 BackendServerTemplate Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package write
-
-import "io"
-
-type wrapperWriterClose struct {
-	writer io.WriteCloser
-}
-
-func (w *wrapperWriterClose) Write(p []byte) (n int, err error) {
-	return w.writer.Write(p)
-}
-
-func (w *wrapperWriterClose) Close() (err error) {
-	if w.writer != nil {
-		return nil
-	}
-
-	defer func() {
-		if err == nil {
-			w.writer = nil
-		}
-	}()
-
-	return w.writer.Close()
-}
-
-func (w *wrapperWriterClose) ExitClose() error {
-	return w.Close()
-}
-
-func ChangeToWriteCloser(w io.WriteCloser) WriteCloser {
-	return &wrapperWriterClose{
-		writer: w,
-	}
-}
-
-func _testWarpWriteCloser() {
-	var a *wrapperWriterClose
-	var b WriteCloser
-
-	b = a
-	_ = b
-}

+ 32 - 0
src/logger/write/wrapwriter/wrap_writer.go

@@ -0,0 +1,32 @@
+// Copyright 2025 BackendServerTemplate Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package wrapwriter
+
+import (
+	"github.com/SongZihuan/BackendServerTemplate/src/logger/write"
+	"io"
+)
+
+type WrapWriter struct {
+	writer io.Writer
+}
+
+func (w *WrapWriter) Write(p []byte) (n int, err error) {
+	return w.writer.Write(p)
+}
+
+func WrapToWriter(w io.Writer) *WrapWriter {
+	return &WrapWriter{
+		writer: w,
+	}
+}
+
+func _testWrapWriter() {
+	var a write.Writer
+	var b *WrapWriter
+
+	a = b
+	_ = a
+}

+ 50 - 0
src/logger/write/wrapwritercloser/wrap_writer_closer.go

@@ -0,0 +1,50 @@
+// Copyright 2025 BackendServerTemplate Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package wrapwritercloser
+
+import (
+	"github.com/SongZihuan/BackendServerTemplate/src/logger/write"
+	"io"
+)
+
+type WrapperWriterClose struct {
+	writer io.WriteCloser
+}
+
+func (w *WrapperWriterClose) Write(p []byte) (n int, err error) {
+	return w.writer.Write(p)
+}
+
+func (w *WrapperWriterClose) Close() (err error) {
+	if w.writer != nil {
+		return nil
+	}
+
+	defer func() {
+		if err == nil {
+			w.writer = nil
+		}
+	}()
+
+	return w.writer.Close()
+}
+
+func (w *WrapperWriterClose) ExitClose() error {
+	return w.Close()
+}
+
+func WraToWriteCloser(w io.WriteCloser) *WrapperWriterClose {
+	return &WrapperWriterClose{
+		writer: w,
+	}
+}
+
+func _testWrapWriteCloser() {
+	var a write.WriteCloser
+	var b *WrapperWriterClose
+
+	a = b
+	_ = a
+}