Tui 模块开发完成,数据正常写入数据库
This commit is contained in:
@@ -80,6 +80,72 @@ type LogConfig struct {
|
||||
ShowColor bool `mapstructure:"show_color" yaml:"show_color"`
|
||||
}
|
||||
|
||||
type LevelFilterWriter struct {
|
||||
writer io.Writer
|
||||
maxLevel logrus.Level // 控制台: 只输出 <= 该级别
|
||||
minLevel logrus.Level // 文件: 只输出 >= 该级别
|
||||
isConsole bool // 是否是控制台输出
|
||||
}
|
||||
|
||||
// Write 实现io.Writer接口,核心过滤逻辑
|
||||
func (f *LevelFilterWriter) Write(p []byte) (n int, err error) {
|
||||
// 解析日志级别(适配logrus默认格式和CustomFormatter)
|
||||
logLevel := parseLogLevelFromContent(p)
|
||||
|
||||
// 控制台:只输出 Info 及以下级别(Trace/Debug/Info)
|
||||
if f.isConsole {
|
||||
if logLevel <= f.maxLevel {
|
||||
return f.writer.Write(p)
|
||||
}
|
||||
return len(p), nil // 过滤掉,返回长度避免Writer报错
|
||||
}
|
||||
|
||||
// 文件:只输出 Warn 及以上级别(Warn/Error/Fatal/Panic)
|
||||
if logLevel >= f.minLevel {
|
||||
return f.writer.Write(p)
|
||||
}
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
// parseLogLevelFromContent 解析日志内容中的级别(兼容自定义格式)
|
||||
func parseLogLevelFromContent(p []byte) logrus.Level {
|
||||
content := string(p)
|
||||
// 适配常见的级别关键字(兼容你的CustomFormatter)
|
||||
switch {
|
||||
case contains(content, "TRACE"):
|
||||
return logrus.TraceLevel
|
||||
case contains(content, "DEBUG"):
|
||||
return logrus.DebugLevel
|
||||
case contains(content, "INFO"):
|
||||
return logrus.InfoLevel
|
||||
case contains(content, "WARN") || contains(content, "WARNING"):
|
||||
return logrus.WarnLevel
|
||||
case contains(content, "ERROR"):
|
||||
return logrus.ErrorLevel
|
||||
case contains(content, "FATAL"):
|
||||
return logrus.FatalLevel
|
||||
case contains(content, "PANIC"):
|
||||
return logrus.PanicLevel
|
||||
default:
|
||||
return logrus.InfoLevel // 解析失败默认Info级别
|
||||
}
|
||||
}
|
||||
|
||||
// contains 辅助函数:判断字符串是否包含子串
|
||||
func contains(s, substr string) bool {
|
||||
return len(s) >= len(substr) && indexOf(s, substr) != -1
|
||||
}
|
||||
|
||||
// indexOf 简易字符串查找(避免依赖额外库)
|
||||
func indexOf(s, substr string) int {
|
||||
for i := 0; i <= len(s)-len(substr); i++ {
|
||||
if s[i:i+len(substr)] == substr {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
// 默认配置
|
||||
var defaultConfig = LogConfig{
|
||||
Level: "info",
|
||||
@@ -216,34 +282,7 @@ func Init(cfg LogConfig) {
|
||||
// 1. 创建logrus实例
|
||||
logrusInst := logrus.New()
|
||||
|
||||
// 2. 配置输出(控制台 + 文件,可选)
|
||||
var outputs []io.Writer
|
||||
outputs = append(outputs, os.Stdout) // 控制台输出
|
||||
|
||||
// 如果配置了日志文件,添加文件输出
|
||||
if cfg.LogFile != "" {
|
||||
// 确保日志目录存在
|
||||
dir := filepath.Dir(cfg.LogFile)
|
||||
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||
// 目录创建失败,只输出警告,不影响程序运行
|
||||
logrusInst.Warnf("创建日志目录失败: %v,仅输出到控制台", err)
|
||||
} else {
|
||||
file, err := os.OpenFile(cfg.LogFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||||
if err == nil {
|
||||
outputs = append(outputs, file)
|
||||
} else {
|
||||
logrusInst.Warnf("打开日志文件失败: %v,仅输出到控制台", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
logrusInst.SetOutput(io.MultiWriter(outputs...))
|
||||
|
||||
// 3. 配置格式
|
||||
logrusInst.SetFormatter(&CustomFormatter{
|
||||
ShowColor: cfg.ShowColor,
|
||||
})
|
||||
|
||||
// 4. 配置日志级别
|
||||
// 2. 先配置日志级别(总开关,必须在输出配置前)
|
||||
lvl, err := logrus.ParseLevel(cfg.Level)
|
||||
if err != nil {
|
||||
lvl = logrus.InfoLevel // 解析失败默认Info级别
|
||||
@@ -257,6 +296,45 @@ func Init(cfg LogConfig) {
|
||||
// 启用文件行号(必须开启,否则getCallerInfo拿不到数据)
|
||||
logrusInst.SetReportCaller(true)
|
||||
|
||||
// 3. 配置输出(控制台 + 文件,可选)
|
||||
var outputs []io.Writer
|
||||
|
||||
// 控制台输出: 只输出 Info 及以下级别
|
||||
consoleWriter := &LevelFilterWriter{
|
||||
writer: os.Stdout,
|
||||
minLevel: logrus.InfoLevel,
|
||||
isConsole: true,
|
||||
}
|
||||
outputs = append(outputs, consoleWriter)
|
||||
|
||||
// 如果配置了日志文件,添加文件输出
|
||||
if cfg.LogFile != "" {
|
||||
// 确保日志目录存在
|
||||
dir := filepath.Dir(cfg.LogFile)
|
||||
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||
// 目录创建失败,只输出警告,不影响程序运行
|
||||
logrusInst.Warnf("创建日志目录失败: %v,仅输出到控制台", err)
|
||||
} else {
|
||||
file, err := os.OpenFile(cfg.LogFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||||
if err == nil {
|
||||
fileWriter := &LevelFilterWriter{
|
||||
writer: file,
|
||||
minLevel: logrus.WarnLevel,
|
||||
isConsole: false,
|
||||
}
|
||||
outputs = append(outputs, fileWriter)
|
||||
} else {
|
||||
logrusInst.Warnf("打开日志文件失败: %v,仅输出到控制台", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
logrusInst.SetOutput(io.MultiWriter(outputs...))
|
||||
|
||||
// 4. 配置格式
|
||||
logrusInst.SetFormatter(&CustomFormatter{
|
||||
ShowColor: cfg.ShowColor,
|
||||
})
|
||||
|
||||
// 5. 赋值给全局默认实例
|
||||
DefaultLogger = &logrusLogger{logrusInst}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user