阅读logrus文档

This commit is contained in:
asahi
2025-01-14 20:36:19 +08:00
parent 4fe88021e4
commit 1137d1c420

View File

@@ -51,6 +51,10 @@
- [log messages in log file](#log-messages-in-log-file) - [log messages in log file](#log-messages-in-log-file)
- [将日志同时输出到log file和console](#将日志同时输出到log-file和console) - [将日志同时输出到log file和console](#将日志同时输出到log-file和console)
- [展示日志输出行数](#展示日志输出行数) - [展示日志输出行数](#展示日志输出行数)
- [logrus hook](#logrus-hook)
- [JSONFormatter](#jsonformatter)
- [设置TimeStampFormat格式](#设置timestampformat格式)
- [自定义Formatter](#自定义formatter)
- [syntax](#syntax) - [syntax](#syntax)
- [iota](#iota) - [iota](#iota)
@@ -995,7 +999,149 @@ log.SetLevel(log.DebugLevel)
{"file":"D:/Workspace/GolangWorkspace/demo/logrus/logrus.go:33","func":"main.main","level":"info","msg":"Ciallo~","time":"2025-01-14T12:59:12+08:00"} {"file":"D:/Workspace/GolangWorkspace/demo/logrus/logrus.go:33","func":"main.main","level":"info","msg":"Ciallo~","time":"2025-01-14T12:59:12+08:00"}
``` ```
### logrus hook
通过logrus hook可以在输出日志时执行自定义逻辑。logrus hook需要实现`Hook`接口,该接口包含`Levels``Fire`方法:
- `Levels`触发该hook的log level
- `Fire`定义当hook被触发时的执行逻辑
logrus示例如下所示
```go
package main
import (
"encoding/json"
"errors"
"fmt"
"github.com/sirupsen/logrus"
"io"
"os"
"path/filepath"
)
type UploadESHook struct {
}
func (h *UploadESHook) Levels() []logrus.Level {
return []logrus.Level{
logrus.InfoLevel,
logrus.WarnLevel,
logrus.ErrorLevel,
logrus.FatalLevel,
}
}
func (h *UploadESHook) Fire(e *logrus.Entry) error {
jStr, err := e.String()
m := map[string]any{}
err = json.Unmarshal([]byte(jStr), &m)
if err!=nil {
return errors.New(err.Error());
}
fmt.Printf("Uploading entry:\n %s to ES...\n", jStr)
return nil
}
func GetLogger(dir string, filename string) (logger *logrus.Logger, file *os.File, err error) {
if err = os.MkdirAll(dir, 0750); err!=nil {
return
}
logfile := filepath.Join(dir, filename)
file, err = os.OpenFile(logfile, os.O_TRUNC|os.O_CREATE, 0640)
if err != nil {
return
}
logger = logrus.New()
logger.SetLevel(logrus.InfoLevel)
logger.SetOutput(io.MultiWriter(file, os.Stdout))
logger.SetFormatter(&logrus.JSONFormatter{})
logger.SetReportCaller(true)
logger.AddHook(&UploadESHook{})
return
}
func main() {
logger, file, err := GetLogger("./log/", "app.log")
if err!=nil {
panic(any(err))
}
defer file.Close()
logger.Info("Ciallo~")
}
```
### JSONFormatter
`logrus.JSONFormatter`会按照json格式来输出日志可以通过如下方式进行配置
```go
logger.SetFormatter(&logrus.JSONFormatter{})
```
#### 设置TimeStampFormat格式
可以通过如下代码设置日志输出时的TimeFormat格式
```go
logger.SetFormatter(&logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05.000"})
```
### 自定义Formatter
可以通过如下方式来自定义formatter
```go
package main
import (
"fmt"
"path/filepath"
"runtime"
"strings"
"github.com/google/uuid"
"github.com/sirupsen/logrus"
)
type CustomTextFormatter struct {
SessionID string
}
func (f *CustomTextFormatter) Format(entry *logrus.Entry) ([]byte, error) {
// Get the file and line number where the log was called
_, filename, line, _ := runtime.Caller(7)
// Get the script name from the full file path
scriptName := filepath.Base(filename)
// Format the log message
message := fmt.Sprintf("[%s] [%s] [%s] [%s:%d] %s\n",
entry.Time.Format("2006-01-02 15:04:05"), // Date-time
entry.Level.String(), // Log level
f.SessionID, // Unique session ID
scriptName, // Script name
line, // Line number
entry.Message, // Log message
)
return []byte(message), nil
}
// Generate a unique session ID
func generateSessionID() string {
randomUUID := uuid.New()
return strings.Replace(randomUUID.String(), "-", "", -1)
}
func main() {
// Generate a new unique session ID
sessionID := generateSessionID()
// Create a new instance of the custom formatter
customFormatter := &CustomTextFormatter{SessionID: sessionID}
// Set the custom formatter as the formatter for the logger
logrus.SetFormatter(customFormatter)
// Now, log something
logrus.Info("This is a custom-formatted log")
}
```
## syntax ## syntax
### iota ### iota