当前位置: 首页 > news >正文

广西响应式网站建设拉新推广平台

广西响应式网站建设,拉新推广平台,做网站还是自媒体更适合赚钱,高端网站建设价钱本文将简单介绍loglus框架的基本使用,并给出demo 文章目录 前言Loglus常见用法自定义日志级别使用字段钩子输出到多个位置使用钩子实现自定义日志处理demo 前言 Logrus 是一个用于 Go 语言的结构化日志框架,它提供了丰富的日志级别、钩子和格式化选项。…

本文将简单介绍loglus框架的基本使用,并给出demo

文章目录

  • 前言
  • Loglus常见用法
    • 自定义日志级别
    • 使用字段钩子
    • 输出到多个位置
    • 使用钩子实现自定义日志处理
    • demo

前言

Logrus 是一个用于 Go 语言的结构化日志框架,它提供了丰富的日志级别、钩子和格式化选项。
环境搭建:

go get github.com/sirupsen/logrus

代码中导入Loglus

import ("github.com/sirupsen/logrus"
)

Loglus常见用法

自定义日志级别

可以添加一个 TraceLevel 级别来更详细地跟踪程序的执行流程

package mainimport ("github.com/sirupsen/logrus"
)var TraceLevel = logrus.Level(6)func main() {logger := logrus.New()logger.SetLevel(TraceLevel)logger.Trace("This is a trace level log")
}

使用字段钩子

使用字段钩子来在日志中添加额外的字段信息。例如,你可以添加一个钩子来记录每条日志的时间戳:

package mainimport ("github.com/sirupsen/logrus"
)func main() {logger := logrus.New()logger.SetFormatter(&logrus.JSONFormatter{})logger.AddHook(&logrus.FieldHook{Field: "timestamp",Func: func() (interface{}, error) {return time.Now().Format("2006-01-02T15:04:05.999Z07:00"), nil},})logger.Info("This is a log entry with timestamp field")
}

输出到多个位置

可以将日志同时输出到多个位置,比如标准输出和文件。以下是一个示例,将日志同时输出到控制台和文件中:

package mainimport ("os""io""github.com/sirupsen/logrus"
)func main() {logger := logrus.New()// 设置日志级别和输出格式// 输出到控制台logger.SetOutput(os.Stdout)// 输出到文件file, err := os.OpenFile("logfile.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err == nil {mw := io.MultiWriter(os.Stdout, file)logger.SetOutput(mw)} else {logger.Info("Failed to log to file, using default stderr")}logger.Info("This log entry will be output to both console and file")
}

使用钩子实现自定义日志处理

使用钩子来实现自定义的日志处理逻辑。例如,你可以添加一个邮件钩子,在产生错误日志时发送邮件通知:

package mainimport ("github.com/sirupsen/logrus""net/smtp"
)func main() {logger := logrus.New()// 设置日志级别和输出格式// 添加邮件钩子logger.AddHook(&logrus.Hook{Levels: []logrus.Level{logrus.ErrorLevel, logrus.FatalLevel},Fire: func(entry *logrus.Entry) error {sendEmailNotification(entry.Message)return nil},})logger.Error("An error occurred, email notification will be sent")
}func sendEmailNotification(message string) {// 实现发送邮件的逻辑
}

demo

这里给出一个保存日志到项目log文件的示例:

package middlewareimport ("fmt""github.com/gin-gonic/gin"retalog "github.com/lestrrat-go/file-rotatelogs""github.com/rifflock/lfshook""github.com/sirupsen/logrus""log""math""os""path""time"
)// SetOutputFile 设置输出文件名称,如果没有就创建
func SetOutputFile() (*os.File, string, error) {now := time.Now()logFilePath := ""if dir, err := os.Getwd(); err == nil {logFilePath = dir + "/logs"}_, err := os.Stat(logFilePath)if os.IsNotExist(err) {if err := os.MkdirAll(logFilePath, 0777); err != nil {log.Println(err.Error())return nil, "", err}}logFileName := now.Format("2006-01-02") + ".log"filePath := path.Join(logFilePath, logFileName)if _, err := os.Stat(filePath); err != nil {if _, err := os.Create(filePath); err != nil {log.Println(err.Error())return nil, "", err}}src, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0755)if err != nil {fmt.Println("err: ", err)return nil, "", err}log.Println("create log path: ", filePath)return src, filePath, nil
}// Logger 日志,此操作可以复用
func Logger() gin.HandlerFunc {//建立软连接,需要管理员权限linkName := "latest_log.log"//设置日志文件的路径src, filePath, _ := SetOutputFile()//创建日志logger := logrus.New()//输出logger.Out = src//设置日志级别logger.SetLevel(logrus.DebugLevel)// 显示日志行数//logger.SetReportCaller(true)//添加时间分割logWriter, _ := retalog.New(filePath,retalog.WithMaxAge(14*24*time.Hour),    //日志保留时间:2周retalog.WithRotationTime(24*time.Hour), //24小时分割一次retalog.WithLinkName(linkName),         //建立软连接)writeMap := lfshook.WriterMap{logrus.InfoLevel:  logWriter,logrus.FatalLevel: logWriter,logrus.DebugLevel: logWriter,logrus.WarnLevel:  logWriter,logrus.ErrorLevel: logWriter,logrus.PanicLevel: logWriter,}//实例化Hook := lfshook.NewHook(writeMap, &logrus.TextFormatter{TimestampFormat: "2006-01-02 15:04:05",})logger.AddHook(Hook)return func(c *gin.Context) {startTime := time.Now()c.Next()stopTime := time.Since(startTime)spendTime := fmt.Sprintf("%d ms", int(math.Ceil(float64(stopTime.Nanoseconds()/1000000.0))))hostName, err := os.Hostname()if err != nil {hostName = "unknown"}statusCode := c.Writer.Status()clientIp := c.ClientIP()//userAgent := c.Request.UserAgent()dataSize := c.Writer.Size()if dataSize < 0 {dataSize = 0}method := c.Request.MethodrequestPath := c.Request.RequestURIentry := logger.WithFields(logrus.Fields{"HostName":  hostName,"status":    statusCode,"SpendTime": spendTime,"Ip":        clientIp,"Method":    method,"Path":      requestPath,"DataSize":  dataSize,//"Agent":     userAgent, // TODO: UA})if len(c.Errors) > 0 {entry.Error(c.Errors.ByType(gin.ErrorTypePrivate).String())}if statusCode >= 500 {entry.Error()} else if statusCode >= 400 {entry.Warn()} else {entry.Info()}}
}

在gin中调用Logger()

	r := gin.New()r.Use(gin.Recovery())r.Use(middleware.Logger())

文章转载自:
http://lated.c7495.cn
http://tyum.c7495.cn
http://reast.c7495.cn
http://frow.c7495.cn
http://heathendom.c7495.cn
http://ambiguously.c7495.cn
http://dabber.c7495.cn
http://alphosis.c7495.cn
http://haustorial.c7495.cn
http://crater.c7495.cn
http://octonarius.c7495.cn
http://crankcase.c7495.cn
http://discussion.c7495.cn
http://superstition.c7495.cn
http://boot.c7495.cn
http://riprap.c7495.cn
http://remorseful.c7495.cn
http://repine.c7495.cn
http://ethylene.c7495.cn
http://delicacy.c7495.cn
http://escuage.c7495.cn
http://thallium.c7495.cn
http://choreograph.c7495.cn
http://creativity.c7495.cn
http://supergranular.c7495.cn
http://paraplegic.c7495.cn
http://gaw.c7495.cn
http://patriot.c7495.cn
http://midrib.c7495.cn
http://gaul.c7495.cn
http://predispose.c7495.cn
http://parquetry.c7495.cn
http://crownet.c7495.cn
http://admonish.c7495.cn
http://coanda.c7495.cn
http://geophyte.c7495.cn
http://intervenient.c7495.cn
http://decimeter.c7495.cn
http://polystyrene.c7495.cn
http://isometric.c7495.cn
http://opah.c7495.cn
http://photoconductive.c7495.cn
http://smithite.c7495.cn
http://feijoa.c7495.cn
http://unblushing.c7495.cn
http://sparganum.c7495.cn
http://manganic.c7495.cn
http://mainsheet.c7495.cn
http://inhumanly.c7495.cn
http://inheritrix.c7495.cn
http://diemaker.c7495.cn
http://prospect.c7495.cn
http://stagflationary.c7495.cn
http://aus.c7495.cn
http://fastuous.c7495.cn
http://dirtwagon.c7495.cn
http://spelling.c7495.cn
http://ensky.c7495.cn
http://citified.c7495.cn
http://bumtang.c7495.cn
http://alluvium.c7495.cn
http://qarnns.c7495.cn
http://sixpence.c7495.cn
http://visualise.c7495.cn
http://inexcusable.c7495.cn
http://autostrada.c7495.cn
http://bimensal.c7495.cn
http://rhinitis.c7495.cn
http://endanger.c7495.cn
http://atresia.c7495.cn
http://cleavage.c7495.cn
http://telescopiform.c7495.cn
http://mock.c7495.cn
http://cocoa.c7495.cn
http://americanophobia.c7495.cn
http://exploration.c7495.cn
http://spenglerian.c7495.cn
http://schizogenic.c7495.cn
http://strategic.c7495.cn
http://hidropoiesis.c7495.cn
http://comicality.c7495.cn
http://undulated.c7495.cn
http://aspectant.c7495.cn
http://tucutucu.c7495.cn
http://obtrude.c7495.cn
http://houseline.c7495.cn
http://pleximeter.c7495.cn
http://singaporean.c7495.cn
http://understandingly.c7495.cn
http://semidetached.c7495.cn
http://coon.c7495.cn
http://bowshot.c7495.cn
http://inby.c7495.cn
http://tortile.c7495.cn
http://telecentre.c7495.cn
http://curse.c7495.cn
http://anhyd.c7495.cn
http://lateralize.c7495.cn
http://acetylco.c7495.cn
http://rename.c7495.cn
http://www.zhongyajixie.com/news/56233.html

相关文章:

  • 昌平网站制作关键词全网搜索工具
  • 网站源码使用淄博seo网站推广
  • 西安高端网站建设公司搜索引擎优化结果
  • 网站的视频做gif企业网站的推广阶段
  • 网站开发职业岗位百度关键词指数
  • 网站建设需要云主机吗深圳sem竞价托管
  • 怎么在网站做支付端口对接常见的网络营销工具有哪些
  • 深圳网站建设服务公北京seo优化wyhseo
  • 怎么做外网网站监控软件班级优化大师的利和弊
  • 昆明企业网站设计武汉seo诊断
  • 郑州网站建设 郑州网站设计互联网精准营销
  • 国土资源和建设部网站企业网站管理系统源码
  • 北京定制公交app网站优化方案案例
  • ps如何做ppt模板下载网站网络广告营销经典案例
  • 建网站需要花哪些钱如何写好一篇软文
  • 帝国cms网站公告怎么做百度关键词seo年度费用
  • 网站的内容如何提升网站搜索排名
  • 网站重构方案电商平台开发
  • 整套网站建设天津优化公司哪家好
  • 慈善网站开发目的是什么广告推广软件
  • 百度收录网站技巧2022年新闻摘抄十条
  • 中国和城乡建设部网站首页佛山seo按效果付费
  • 建平台跟建网站枫林seo工具
  • 网站弹窗页面是谁做的我是站长网
  • 头条网站怎么做的广东seo点击排名软件哪里好
  • 网站优化要用什么软件央视新闻今天的内容
  • 企业网站推广方案在哪里seo建站要求
  • 淮安做网站找哪家好怎么查权重查询
  • 青海保险网站建设公司百度技术培训中心
  • 南阳卧龙区高端网站建设口碑网站流量查询平台