You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7.6 KiB
7.6 KiB
logx
English | 简体中文
logx 配置
type LogConf struct {
ServiceName string `json:",optional"`
Mode string `json:",default=console,options=[console,file,volume]"`
Encoding string `json:",default=json,options=[json,plain]"`
TimeFormat string `json:",optional"`
Path string `json:",default=logs"`
Level string `json:",default=info,options=[info,error,severe]"`
Compress bool `json:",optional"`
KeepDays int `json:",optional"`
StackCooldownMillis int `json:",default=100"`
MaxBackups int `json:",default=0"`
MaxSize int `json:",default=0"`
Rotation string `json:",default=daily,options=[daily,size]"`
}
ServiceName
:设置服务名称,可选。在volume
模式下,该名称用于生成日志文件。在rest/zrpc
服务中,名称将被自动设置为rest
或zrpc
的名称。Mode
:输出日志的模式,默认是console
console
模式将日志写到stdout/stderr
file
模式将日志写到Path
指定目录的文件中volume
模式在 docker 中使用,将日志写入挂载的卷中
Encoding
: 指示如何对日志进行编码,默认是json
json
模式以 json 格式写日志plain
模式用纯文本写日志,并带有终端颜色显示
TimeFormat
:自定义时间格式,可选。默认是2006-01-02T15:04:05.000Z07:00
Path
:设置日志路径,默认为logs
Level
: 用于过滤日志的日志级别。默认为info
info
,所有日志都被写入error
,info
的日志被丢弃severe
,info
和error
日志被丢弃,只有severe
日志被写入
Compress
: 是否压缩日志文件,只在file
模式下工作KeepDays
:日志文件被保留多少天,在给定的天数之后,过期的文件将被自动删除。对console
模式没有影响StackCooldownMillis
:多少毫秒后再次写入堆栈跟踪。用来避免堆栈跟踪日志过多MaxBackups
: 多少个日志文件备份将被保存。0代表所有备份都被保存。当Rotation
被设置为size
时才会起作用。注意:KeepDays
选项的优先级会比MaxBackups
高,即使MaxBackups
被设置为0,当达到KeepDays
上限时备份文件同样会被删除。MaxSize
: 当前被写入的日志文件最大可占用多少空间。0代表没有上限。单位为MB
。当Rotation
被设置为size
时才会起作用。Rotation
: 日志轮转策略类型。默认为daily
(按天轮转)。daily
按天轮转。size
按日志大小轮转。
打印日志方法
type Logger interface {
// Error logs a message at error level.
Error(...any)
// Errorf logs a message at error level.
Errorf(string, ...any)
// Errorv logs a message at error level.
Errorv(any)
// Errorw logs a message at error level.
Errorw(string, ...LogField)
// Info logs a message at info level.
Info(...any)
// Infof logs a message at info level.
Infof(string, ...any)
// Infov logs a message at info level.
Infov(any)
// Infow logs a message at info level.
Infow(string, ...LogField)
// Slow logs a message at slow level.
Slow(...any)
// Slowf logs a message at slow level.
Slowf(string, ...any)
// Slowv logs a message at slow level.
Slowv(any)
// Sloww logs a message at slow level.
Sloww(string, ...LogField)
// WithContext returns a new logger with the given context.
WithContext(context.Context) Logger
// WithDuration returns a new logger with the given duration.
WithDuration(time.Duration) Logger
}
Error
,Info
,Slow
: 将任何类型的信息写进日志,使用fmt.Sprint(...)
来转换为string
Errorf
,Infof
,Slowf
: 将指定格式的信息写入日志Errorv
,Infov
,Slowv
: 将任何类型的信息写入日志,用json marshal
编码Errorw
,Infow
,Sloww
: 写日志,并带上给定的key:value
字段WithContext
:将给定的 ctx 注入日志信息,例如用于记录trace-id
和span-id
WithDuration
: 将指定的时间写入日志信息中,字段名为duration
与第三方日志库集成
- zap
- logrus
对于其它的日志库,请参考上面示例实现,并欢迎提交 PR
到 https://github.com/zeromicro/zero-contrib
将日志写到指定的存储
logx
定义了两个接口,方便自定义 logx
,将日志写入任何存储。
logx.NewWriter(w io.Writer)
logx.SetWriter(write logx.Writer)
例如,如果我们想把日志写进kafka,而不是控制台或文件,我们可以像下面这样做。
type KafkaWriter struct {
Pusher *kq.Pusher
}
func NewKafkaWriter(pusher *kq.Pusher) *KafkaWriter {
return &KafkaWriter{
Pusher: pusher,
}
}
func (w *KafkaWriter) Write(p []byte) (n int, err error) {
// writing log with newlines, trim them.
if err := w.Pusher.Push(strings.TrimSpace(string(p))); err != nil {
return 0, err
}
return len(p), nil
}
func main() {
pusher := kq.NewPusher([]string{"localhost:9092"}, "go-zero")
defer pusher.Close()
writer := logx.NewWriter(NewKafkaWriter(pusher))
logx.SetWriter(writer)
// more code
}
完整代码:https://github.com/zeromicro/zero-examples/blob/main/logx/tokafka/main.go
过滤敏感字段
如果我们需要防止 password
字段被记录下来,我们可以像下面这样实现。
type (
Message struct {
Name string
Password string
Message string
}
SensitiveLogger struct {
logx.Writer
}
)
func NewSensitiveLogger(writer logx.Writer) *SensitiveLogger {
return &SensitiveLogger{
Writer: writer,
}
}
func (l *SensitiveLogger) Info(msg any, fields ...logx.LogField) {
if m, ok := msg.(Message); ok {
l.Writer.Info(Message{
Name: m.Name,
Password: "******",
Message: m.Message,
}, fields...)
} else {
l.Writer.Info(msg, fields...)
}
}
func main() {
// setup logx to make sure originalWriter not nil,
// the injected writer is only for filtering, like a middleware.
originalWriter := logx.Reset()
writer := NewSensitiveLogger(originalWriter)
logx.SetWriter(writer)
logx.Infov(Message{
Name: "foo",
Password: "shouldNotAppear",
Message: "bar",
})
// more code
}
完整代码:https://github.com/zeromicro/zero-examples/blob/main/logx/filterfields/main.go
更多示例
https://github.com/zeromicro/zero-examples/tree/main/logx
Give a Star! ⭐
如果你正在使用或者觉得这个项目对你有帮助,请 star 支持,感谢!