您的位置:首页 > 科技 > 能源 > 关键词排名seo_广州网站制作怎么做_谷歌广告联盟怎么做_推广普通话心得体会

关键词排名seo_广州网站制作怎么做_谷歌广告联盟怎么做_推广普通话心得体会

2024/12/28 2:15:59 来源:https://blog.csdn.net/weixin_42073635/article/details/144274641  浏览:    关键词:关键词排名seo_广州网站制作怎么做_谷歌广告联盟怎么做_推广普通话心得体会
关键词排名seo_广州网站制作怎么做_谷歌广告联盟怎么做_推广普通话心得体会

原文地址:golang实现单例日志对象 – 无敌牛

欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等

介绍

golang有很多日志包,通过设置和修改都能实现日志轮转和自定义日志格式。例如:log、zap、golog、slog、log4go 等等。

本次给出的示例使用 logrus 和 lumberjack 两个库实现日志轮转和自定义日志格式。

代码

总共涉及到4个文件:

  • go.mod 模块命名;
  • tlog.go 包含主函数,用来测试;
  • tlog1.go 实现了单例模式返回日志对象;
  • tlog2.go 用来测试在别的代码文件中的使用。

go.mod

module tlogrus

tlog.go

package mainimport ("time")func main() {// 获取日志记录器的单例实例log := GetLogger("")// 使用日志记录器记录不同级别的日志log.Debug("This is a debug message.")log.Info("This is an info message.")log.Warn("This is a warning message.")time.Sleep(time.Second)log.Error("This is an error message.")Test()// 下边这行输出将导致程序退出log.Fatal("This is a fatal message.") 
}

tlog1.go

package mainimport ("os""bytes""runtime""fmt""strings""time""path/filepath""github.com/sirupsen/logrus""github.com/natefinch/lumberjack"
)// Logger 单例模式的 logger 结构体
var logger  *logrus.Logger = nil// 自定义格式化结构
type CustomFormatter struct{}// 自定义格式化结构成员函数,用于格式化日志输出的内容
func (f *CustomFormatter) Format(entry * logrus.Entry)([]byte, error) {// 申请日志缓冲空间b := &bytes.Buffer{}// 1、初始化日期输出格式timestamp := entry.Time.Format(time.DateTime)// 2、日志级别格式化level := strings.ToUpper(entry.Level.String())fmt.Fprintf(b, "%s %s ", timestamp, level)// 3、获取进程号fmt.Fprintf(b, "pid=%d ",os.Getpid())// 4、获取运行时程序调用的相关信息  调用文件 和 所在行号_, file, line, ok := runtime.Caller(6)if !ok {// 没获取到,给出默认值file = "???"line = 0 }fmt.Fprintf(b, "%s:%d : ", filepath.Base(file), line)// 5、获取调用函数信息if pc, ok := entry.Data["caller"]; ok {funcName := runtime.FuncForPC(pc.(uintptr)).Name()fmt.Fprintf(b, "%s ", funcName )}fmt.Fprintf(b, "%s\n", entry.Message)    return b.Bytes(), nil
}// GetLogger 创建或返回日志记录器的唯一实例
func GetLogger(logFileName string) *logrus.Logger {if logger != nil {return logger}// 1、创建 logger 对象logger = logrus.New()// 2、使用 lumberjack 进行日志轮转, 并添加到 logrus.Outlogger.Out = &lumberjack.Logger{Filename:   func (logFileName string) string { if logFileName == "" { return "logs/tlogrus.log" ; } else { return logFileName ;} }  (logFileName) ,MaxSize:    1,         // MBMaxBackups: 3,MaxAge:     28,        // daysCompress:   true,}// 3、设置日志格式为 自定义的格式logger.SetFormatter(&CustomFormatter{})// 4、设置日志级别 Debuglogger.SetLevel(logrus.DebugLevel)return logger
}

tlog2.go

package mainimport ("time")func Test() {llog := GetLogger("xxxx.log")for { llog.Debug("This is a debug message.=====")llog.Info("This is an info message.")llog.Warn("This is a warning message.")llog.Error("This is an error message.")time.Sleep(time.Microsecond)}
}

测试

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com