gookit/slog

如何配置日志清理

SHOWufei opened this issue · 9 comments

作者您好:
默认安装是 github.com/gookit/slog v0.2.1,日志清理是在哪一个版本实现的,如何配置日志自动清理?

最好使用最新发布的版本。

https://github.com/gookit/slog/blob/master/README.zh-CN.md#%E6%A0%B9%E6%8D%AE%E9%85%8D%E7%BD%AE%E5%BF%AB%E9%80%9F%E5%88%9B%E5%BB%BAhandler%E5%AE%9E%E4%BE%8B

示例:

	testFile := "testdata/error.log"

	h := handler.NewEmptyConfig().
		With(
			handler.WithLogfile(testFile),
			handler.WithBuffSize(1024*8),
			handler.WithLogLevels(slog.DangerLevels),
			handler.WithBuffMode(handler.BuffModeBite),
			handler.WithBackupNum(10), // 保留数量
		).
		CreateHandler()

	l := slog.NewWithHandlers(h)

当前是这么封装调用的,应该如何调整?
示例:

var Slog =  struct {
	Logger *slog.Logger
}{}

func Setup(channel string) {
	// 获取日志配置信息
	var logPath string = app.SystemLog.LogPath
	var logFormatter string = app.SystemLog.LogFormatter
	var rt uint8 = app.SystemLog.RotateTime

	// 日志文件,默认 application
	logfileErr := fmt.Sprintf("%s/%s.wf.log", logPath, channel)
	logfileInf := fmt.Sprintf("%s/%s.log", logPath, channel)

	// 自定义 channel 名称
	slog.DefaultChannelName = channel

	// 自定义 Handler
	var hErr, hInf *handler.TimeRotateFileHandler
	// 输出日志到指定文件,并且自定义按时间分割文件,默认启用 buffer 缓冲写入
	switch rt {
	case 0:
		hErr = handler.MustTimeRotateFile(logfileErr, handler.EveryDay)
		hInf = handler.MustTimeRotateFile(logfileInf, handler.EveryDay)
	case 1:
		hErr = handler.MustTimeRotateFile(logfileErr, handler.EveryHour)
		hInf = handler.MustTimeRotateFile(logfileInf, handler.EveryHour)
	case 2:
		hErr = handler.MustTimeRotateFile(logfileErr, handler.Every30Minutes)
		hInf = handler.MustTimeRotateFile(logfileInf, handler.Every30Minutes)
	case 3:
		hErr = handler.MustTimeRotateFile(logfileErr, handler.Every15Minutes)
		hInf = handler.MustTimeRotateFile(logfileInf, handler.Every15Minutes)
	case 4:
		hErr = handler.MustTimeRotateFile(logfileErr, handler.EveryMinute)
		hInf = handler.MustTimeRotateFile(logfileInf, handler.EveryMinute)
	case 5:
		hErr = handler.MustTimeRotateFile(logfileErr, handler.EverySecond)
		hInf = handler.MustTimeRotateFile(logfileInf, handler.EverySecond)
	}

	// 使用 JSON 格式
	if logFormatter == "json" {
		hErr.SetFormatter(slog.NewJSONFormatter())
		hInf.SetFormatter(slog.NewJSONFormatter())
	}

	// 自定义日志标准
	hErr.Levels = slog.Levels{slog.PanicLevel, slog.ErrorLevel, slog.WarnLevel, slog.FatalLevel}
	hInf.Levels = slog.Levels{slog.InfoLevel, slog.NoticeLevel, slog.DebugLevel, slog.TraceLevel}

	// 禁用 buffer 缓冲写入
	hErr.NoBuffer = true
	hInf.NoBuffer = true

	// 创建一个全新的 slog.Logger 实例
	Slog.Logger = slog.New()
	// 为新的 slog.Logger 实例添加日志处理器
	Slog.Logger.AddHandler(hErr)
	Slog.Logger.AddHandler(hInf)
}
func Test() {
	Setup("solar")
	Slog.Logger.Error("test error")
}
func Test() {
	Setup("solar")
	Slog.Logger.Error("test error")
}

建议使用新版本,创建 handler 更简单和灵活。

	options := []handler.ConfigFn{
		handler.WithLogLevels(slog.DangerLevels),
		handler.WithBuffSize(128),
		handler.WithBackupNum(12),
	}

    // 新版切割时间是秒为单位,方便使用。 handler.EveryDay = timex.OneDaySec
	hErr := handler.MustTimeRotateFile(logfile, handler.EveryDay, options...)

好的好的,非常感谢 Thanks♪(・ω・)ノ

作者您好。

go get -u github.com/gookit/slog@master
// 当前版本 github.com/gookit/slog v0.4.1-0.20230104170320-400f636a1d0f

没有 WithBackupNum() 函数,更没有自定义 BackupTime 的函数。

好像没加这个快捷方法,下个版本加下。

可以直接这样:

options := []handler.ConfigFn{
		handler.WithLogLevels(slog.DangerLevels),
		handler.WithBuffSize(128),
	    func(c *handler.Config) {
			c.BackupNum = 12
			// more setting ...
		},
}

赞👍🏻