使用Golang logrus进行日志记录
简而言之
使用Golang的日志记录包logrus,记录如下所示的日志输出方式。
[INFO]:2020-01-20 03:06:19 [main.go:19] - info msg1
输出内容包括级别、时间、文件名、行位置和消息。
另外,还需要记录以下内容。
-
- ログファイルへの出力
- ログレベルの変更
Git: k-washi/gologger
Git:k-washi/gologger
安装
go get github.com/sirupsen/logrus
Logrus的配置文件
首先,创建一个用于设置的函数。
详细信息在程序内部进行记录。
package gologger
import (
"os"
"strings"
)
//openFile ログを出力するファイルを設定する。
//ファイルが存在する場合、ファイルにログを追記。
//ファイルが存在しない場合、ファイルを作成し、ログを出力。
func openFile(fileName string) (*os.File, error) {
if exists(fileName) {
f, err := os.OpenFile(fileName, os.O_WRONLY|os.O_APPEND, 0777)
return f, err
}
f, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE, 0777)
return f, err
}
//formatFilePath ログに記載するファイル名の抽出
func formatFilePath(path string) string {
arr := strings.Split(path, "/")
return arr[len(arr)-1]
}
//exists ファイルが存在するか確認する。
func exists(name string) bool {
_, err := os.Stat(name)
return !os.IsNotExist(err)
}
参照logrus的格式,设置日志格式。
详细信息请查阅程序内部。
package gologger
import (
"bytes"
"fmt"
"io"
"os"
"strings"
"github.com/sirupsen/logrus"
)
type logFormat struct {
TimestampFormat string
}
//Format ログの形式を設定
func (f *logFormat) Format(entry *logrus.Entry) ([]byte, error) {
var b *bytes.Buffer
if entry.Buffer != nil {
b = entry.Buffer
} else {
b = &bytes.Buffer{}
}
b.WriteByte('[')
b.WriteString(strings.ToUpper(entry.Level.String()))
b.WriteString("]:")
b.WriteString(entry.Time.Format(f.TimestampFormat))
b.WriteString(" [")
b.WriteString(formatFilePath(entry.Caller.File))
b.WriteString(":")
fmt.Fprint(b, entry.Caller.Line)
b.WriteString("] ")
if entry.Message != "" {
b.WriteString(" - ")
b.WriteString(entry.Message)
}
if len(entry.Data) > 0 {
b.WriteString(" || ")
}
for key, value := range entry.Data {
b.WriteString(key)
b.WriteByte('=')
b.WriteByte('{')
fmt.Fprint(b, value)
b.WriteString("}, ")
}
b.WriteByte('\n')
return b.Bytes(), nil
}
//init パッケージ読み込み時に実行される。
func init() {
logrus.SetReportCaller(true) //Caller(実行ファイル(ex. main.go)を扱うため)
formatter := logFormat{}
formatter.TimestampFormat = "2006-01-02 15:04:05" //時刻設定
logrus.SetFormatter(&formatter)
//ログ出力ファイルの設定
f, err := openFile("log.txt")
if err != nil {
logrus.Fatal(err)
}
logrus.SetOutput(io.MultiWriter(os.Stdout, f))
//ログレベルの設定
logrus.SetLevel(logrus.InfoLevel)
}
//SetLevelDebug Debugレベルに設定
func SetLevelDebug() {
logrus.SetLevel(logrus.DebugLevel)
}
//SetLevelInfo Set Infoレベルに設定
func SetLevelInfo() {
logrus.SetLevel(logrus.InfoLevel)
}
记录
通过在main.go中导入配置包,可以读取logrus的配置。如果想要更改日志级别,可以使用已注释的函数。
#出力結果
[INFO]:2020-01-20 03:32:53 [main.go:22] - info msg1
[INFO]:2020-01-20 03:32:53 [subpkg.go:9] - sub info msg1
package main
import (
"github.com/k-washi/gologger/test/subpkg"
_ "github.com/k-washi/gologger"
log "github.com/sirupsen/logrus"
)
func main() {
//logSetter.SetLevelDebug()
log.Info("info msg1")
log.Debug("debug msg1")
subpkg.SubPrint()
}
package subpkg
import (
log "github.com/sirupsen/logrus"
)
func SubPrint() {
log.Info("sub info msg1")
log.Debug("sub debug msg1")
}