分享
  1. 首页
  2. 文章

golang日志框架logrus

yiduyangyi · · 22110 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang自带日志框架功能比较简单,仅提供print、panic、fatal三个方法,对于常规的日志切割等功能并未提供支持。
这里推荐使用sirupsen/logrus日志库。

logrus feature

  • 结构化、可插拔的日志模块
  • 完全兼容官方log库接口
  • Field机制
  • 可扩展的HOOK机制
  • TEXT与JSON两种可选格式

简单使用示例

std Logger

与官方log类似,logrus也提供了一个名为std的标准logger,对外导出的各类方法直接使用std记录日志,一般可按如下方式使用

package main
import log "github.com/sirupsen/logrus"
func main() {
 log.Info("hello, world.")
}

自建Logger实例

package main
import (
 "os"
 "github.com/sirupsen/logrus"
)
// Create a new instance of the logger. You can have any number of instances.
var log = logrus.New()
func main() {
 // The API for setting attributes is a little different than the package level
 // exported logger. See Godoc.
 log.Out = os.Stdout
 // You could set this to any `io.Writer` such as a file
 // file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666)
 // if err == nil {
 // log.Out = file
 // } else {
 // log.Info("Failed to log to file, using default stderr")
 // }
 log.WithFields(logrus.Fields{
 "animal": "walrus",
 "size": 10,
 }).Info("A group of walrus emerges from the ocean")
}

输出到本地文件系统

下面示例代码,通过一个hook将日志输出到本地文件系统中,并提供日志切割功能

import (
 "github.com/lestrrat/go-file-rotatelogs"
 "github.com/rifflock/lfshook"
 log "github.com/sirupsen/logrus"
 "time"
 "os"
 "github.com/pkg/errors"
 "path"
)
// config logrus log to local filesystem, with file rotation
func ConfigLocalFilesystemLogger(logPath string, logFileName string, maxAge time.Duration, rotationTime time.Duration) {
 baseLogPaht := path.Join(logPath, logFileName)
 writer, err := rotatelogs.New(
 baseLogPaht+".%Y%m%d%H%M",
 rotatelogs.WithLinkName(baseLogPaht), // 生成软链,指向最新日志文件
 rotatelogs.WithMaxAge(maxAge), // 文件最大保存时间
 rotatelogs.WithRotationTime(rotationTime), // 日志切割时间间隔
 )
 if err != nil {
 log.Errorf("config local file system logger error. %+v", errors.WithStack(err))
 }
 lfHook := lfshook.NewHook(lfshook.WriterMap{
 log.DebugLevel: writer, // 为不同级别设置不同的输出目的
 log.InfoLevel: writer,
 log.WarnLevel: writer,
 log.ErrorLevel: writer,
 log.FatalLevel: writer,
 log.PanicLevel: writer,
 })
 log.AddHook(lfHook)
}

输出到MQ或ES

如下示例代码通过hook将日志输出到amqp消息队列,或者es中。

import (
 "github.com/vladoatanasov/logrus_amqp"
 "gopkg.in/olivere/elastic.v5"
 "gopkg.in/sohlich/elogrus.v2"
 log "github.com/sirupsen/logrus"
 "github.com/pkg/errors"
)
// config logrus log to amqp
func ConfigAmqpLogger(server, username, password, exchange, exchangeType, virtualHost, routingKey string) {
 hook := logrus_amqp.NewAMQPHookWithType(server, username, password, exchange, exchangeType, virtualHost, routingKey)
 log.AddHook(hook)
}
// config logrus log to es
func ConfigESLogger(esUrl string, esHOst string, index string) {
 client, err := elastic.NewClient(elastic.SetURL(esUrl))
 if err != nil {
 log.Errorf("config es logger error. %+v", errors.WithStack(err))
 }
 esHook, err := elogrus.NewElasticHook(client, esHOst, log.DebugLevel, index)
 if err != nil {
 log.Errorf("config es logger error. %+v", errors.WithStack(err))
 }
 log.AddHook(esHook)
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:yiduyangyi

查看原文:golang日志框架logrus

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
22110 次点击
4 回复 | 直到 2017年10月20日 07:59:03
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏