一、安装logrus

执行如下命令,即可按照logrus
go get github.com/sirupsen/logrus
如果无法访问 golang ,那么可以先 clone github.com/golang的源码,然后生成

1
2
3
4
5
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/crypto.git
go get -u golang.org/x/crypto/ssh/terminal
git clone https://github.com/golang/sys.git
go get -u golang.org/x/sys/unix
使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main
 import (
    log "github.com/sirupsen/logrus"
    "time"
)
 
type Animal struct {
    Name string
    age int
}
 
func main() {
    //log.SetFormatter(&log.JSONFormatter{})
    a := Animal{"dog", 22}
    log.SetFormatter(&log.TextFormatter{
        FullTimestamp:true})
    log.WithFields(log.Fields{
        "event": "ne",
        "topic": "title",
        "key": "my key",
    }).Info("hello", a)
   
    log.Error("hello world")
    for {
        time.Sleep(time.Second)
        log.Printf("i am ok %s", "dock")
    }
    log.Fatal("kill ")
}
写在一个文件里
1
2
3
4
5
6
7
8
func SetLogFile() {
    file := time.Now().Format("20060102") + ".txt"
    logFile, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
    if nil != err {
        panic(err)
    }
    log.SetOutput(logFile)
}
自动拆分日志文件

先安装拆分日志文件的2份源码

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

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package main
 
import (
    log "github.com/sirupsen/logrus"
    "github.com/lestrrat-go/file-rotatelogs"
    "github.com/rifflock/lfshook"
    "time"
    "os"
    "github.com/pkg/errors"
    "path"
)
 
func main() {
    // 24小时一个日志文件,最多存365天的日志文件。 再多了就删掉
    ConfigLocalFilesystemLogger("log", "lg", time.Hour*24*365, time.Hour*24)
   
    for {
        time.Sleep(time.Second*3)
        log.Info("hello ")
    }
}
 
// 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.WithRotationCount(365),  // 最多存365个文件
 
        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.TextFormatter{})
    log.AddHook(lfHook)
}

WithRotationTime 设置为1分钟时,生成的日志文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
~/gol/log $ ls
lg               lg.201812041357  lg.201812041410  lg.201812041423
lg.201812041344  lg.201812041358  lg.201812041411  lg.201812041424
lg.201812041346  lg.201812041359  lg.201812041412  lg.201812041425
lg.201812041347  lg.201812041400  lg.201812041413  lg.201812041426
lg.201812041348  lg.201812041401  lg.201812041414  lg.201812041427
lg.201812041349  lg.201812041402  lg.201812041415  lg.201812041428
lg.201812041350  lg.201812041403  lg.201812041416  lg.201812041429
lg.201812041351  lg.201812041404  lg.201812041417  lg.201812041430
lg.201812041352  lg.201812041405  lg.201812041418  lg.201812041431
lg.201812041353  lg.201812041406  lg.201812041419  lg.201812041432
lg.201812041354  lg.201812041407  lg.201812041420  lg.201812041433
lg.201812041355  lg.201812041408  lg.201812041421  lg.201812041434
lg.201812041356  lg.201812041409  lg.201812041422  lg.201812041435