请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,您好,如果配置了日志文件和滚动,日志信息就无法输出到控制台了,这样该怎么办呢?

正在回答 回答被采纳积分+3

2回答

Schwarzeni 2019-10-18 16:51:56

可以使用logrus的hook,下面是我的代码,日志打印到项目根目录的logs文件夹下,需要提前执行命令安装第三方库

go get -u github.com/rifflock/lfshook
go get -u github.com/lestrrat-go/file-rotatelogs

然后再使用formatter时关闭颜色输出,完整的文件如下

package base

import (
   "time"

   "github.com/rifflock/lfshook"

   rotatelogs "github.com/lestrrat-go/file-rotatelogs"
   "github.com/pkg/errors"
   log "github.com/sirupsen/logrus"
   prefixed "github.com/x-cray/logrus-prefixed-formatter"
)

func init() {
   // 命令行日志格式
   stdFormatter := &prefixed.TextFormatter{
      FullTimestamp:   true,
      TimestampFormat: "2006-01-02.15:04:05.000000",
      ForceFormatting: true,
      ForceColors:     true,
      DisableColors:   false,
   }
   log.SetFormatter(stdFormatter)
   // 日志级别
   log.SetLevel(log.DebugLevel)
   // 日志文件和滚动配置
   writer, err := rotatelogs.New(
      "logs/console.log"+".%Y%m%d%H%M",
      //rotatelogs.WithLinkName("logs/console.log"), // 生成软链,指向最新日志文件
      rotatelogs.WithMaxAge(7*24*time.Hour),     // 文件最大保存时间
      rotatelogs.WithRotationTime(24*time.Hour), // 日志切割时间间隔
   )
   if err != nil {
      log.Errorf("config local file system logger error. %v", errors.WithStack(err))
   }

   // 文件输出格式
   fileFormatter := &prefixed.TextFormatter{
      FullTimestamp:   true,
      TimestampFormat: "2006-01-02.15:04:05.000000",
      ForceFormatting: true,
      ForceColors:     false,
      DisableColors:   true,
   }
   lfHook := lfshook.NewHook(lfshook.WriterMap{
      log.InfoLevel:  writer,
      log.ErrorLevel: writer,
   }, fileFormatter)
   log.AddHook(lfHook)

   log.Info("测试")
   log.Debug("测试")
}


0 回复 有任何疑惑可以回复我~
  • 兄弟你这写的也太复杂了
    直接这样不就好了吗,按照日期切分
    ```
    logPath, _ := os.Getwd()
    	logName := fmt.Sprintf("%s/log/access_log.", logPath)
    	r, _ := rotatelogs.New(logName+"%Y%m%d")
    	if level == "true" {
    		log.SetOutput(os.Stdout)
    	}
    	log.SetOutput(r)
    ```
    回复 有任何疑惑可以回复我~ 2019-10-30 18:20:40
  • 你这么写不是只能写到文件里了吗?即使你的 `level` 是 `true` ,你设置完 `log.SetOutput(os.Stdout)` 还是会被下面的 `log.SetOutput(r)` 设置覆盖。提问者的意思应该是希望可以既输出到stdout又能写到文件里吧,难道是我理解错提问者的意思了?
    
    另,之后我找到了一个简单的写法:https://github.com/sirupsen/logrus/issues/689,缺陷是这些输出的格式是一样的
    
    ```
    mw := io.MultiWriter(os.Stdout, logFile)
    logrus.SetOutput(mw)
    ```
    回复 有任何疑惑可以回复我~ 2019-11-02 09:46:45
  • 不会覆盖的,可以直接输出。只是设置了两个输出源而已
    回复 有任何疑惑可以回复我~ 2019-11-02 09:48:03
枫荇 2019-06-19 23:16:59

这个问题,@qq_清风欲叶_klO389看能不能附上问题代码,具体问题来具体分析了,只从现象也很难确定。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信