日志

[[toc]]

介绍

为了帮助你了解应用程序的运行状况,Goravel 提供了强大的日志模块,可以将日志消息、系统错误记录到文件中或其他通道。

该模块可以使用 facades.Log 进行操作,facades.Log 是知名日志组件 sirupsen/logrus 的一个实例,使用方法与 sirupsen/logrus 完全一致。

配置

config/logging.go 中进行所有自定义配置。允许配置不同的日志通道,可以进入配置文件进行查看。

Goravel 默认使用 stack 通道记录日志。stack 允许日志转发到多个通道中。

可用的通道驱动

名称 描述
stack 允许使用多个通道
single 单日志文件
daily 每天一个日志文件
custom 自定义驱动

写日志消息

可用级别:

  1. facades.Log.Trace($message)
  2. facades.Log.Debug($message)
  3. facades.Log.Info($message)
  4. facades.Log.Warn($message)
  5. facades.Log.Error($message)
  6. facades.Log.Fatal($message)
  7. facades.Log.Panic($message)

上下文信息

可以将上下文数据数组传递给日志方法。这些信息将被格式化,并与日志消息一起显示:

  1. facades.Log.WithFields(logrus.Fields{
  2. "goravel": "framework",
  3. }).Debug("web")

创建自定义通道

如果你想定义一个完全自定义的驱动,可以在 config/logging.go 配置文件中指定 custom 驱动类型。 然后包含一个 via 选项,实现一个 framework\contracts\log\Logger 结构:

  1. //config/logging.go 配置
  2. "custom": map[string]interface{}{
  3. "driver": "custom",
  4. "via": CustomTest{},
  5. "path": "storage/logs/goravel-custom.log",//选配
  6. "level": facadesConfig.Env("LOG_LEVEL", "debug"),//选配
  7. },

编写驱动

实现 framework\contracts\log\Logger 接口。

  1. //framework\contracts\log\Logger
  2. package log
  3. import "github.com/sirupsen/logrus"
  4. type Logger interface {
  5. Handle(configPath string) (logrus.Hook, error)
  6. }

文件可以储存到 app/extensions 文件夹中(可修改)。例如:

  1. package aliyun
  2. import (
  3. "github.com/goravel/framework/support/facades"
  4. "github.com/sirupsen/logrus"
  5. )
  6. type Logger struct {
  7. }
  8. func (logger Logger) Handle(configPath string) (logrus.Hook, error) {
  9. return AliyunLogHook{}, nil
  10. }
  11. type AliyunLogHook struct {
  12. }
  13. func (h AliyunLogHook) Levels() []logrus.Level {
  14. level := facades.Config.GetString("logging.channels.aliyun.level")
  15. if level == "error" {
  16. return []logrus.Level{
  17. logrus.ErrorLevel,
  18. logrus.FatalLevel,
  19. logrus.PanicLevel,
  20. }
  21. }
  22. return []logrus.Level{
  23. logrus.TraceLevel,
  24. logrus.DebugLevel,
  25. logrus.InfoLevel,
  26. logrus.WarnLevel,
  27. logrus.ErrorLevel,
  28. logrus.FatalLevel,
  29. logrus.PanicLevel,
  30. }
  31. }
  32. func (h AliyunLogHook) Fire(entry *logrus.Entry) error {
  33. // todo 相应逻辑
  34. level := entry.Level.String()
  35. errTime := entry.Time.String()
  36. message := entry.Message
  37. return nil
  38. }

更多使用方法

详见 sirupsen/logrus