我正在尝试从漂亮的 Logrus(对调试非常有帮助)迁移我的应用程序并引入 Uber 日志框架 Zap。
使用 Logrus,我只能初始化记录器一次并从其他 Go 文件中重用它,例如:
package main
import(
// Print filename on log
filename "github.com/onrik/logrus/filename"
// Very nice log library
log "github.com/sirupsen/logrus"
)
func main(){
// ==== SET LOGGING
Formatter := new(log.TextFormatter)
Formatter.TimestampFormat = "Jan _2 15:04:05.000000000"
Formatter.FullTimestamp = true
Formatter.ForceColors = true
log.AddHook(filename.NewHook()) // Print filename + line at every log
log.SetFormatter(Formatter)
}
Run Code Online (Sandbox Code Playgroud)
从其他 Go 文件中,我可以重用该记录器而无需任何其他初始化:
// VerifyCommandLineInput is delegated to manage the inputer parameter provide with the input flag from command line
func VerifyCommandLineInput() …Run Code Online (Sandbox Code Playgroud) 我创建了一个记录器kubebuilder,它基于 zap 记录器:
import (
"flag"
"github.com/gin-gonic/gin"
"net/http"
"os"
"go.uber.org/zap/zapcore"
uzap "go.uber.org/zap"
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
// to ensure that exec-entrypoint and run can make use of them.
_ "k8s.io/client-go/plugin/pkg/client/auth"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/healthz"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
)
var (
scheme = runtime.NewScheme()
setupLog = ctrl.Log.WithName("setup")
)
var zapOpts []uzap.Option
zapOpts = append(zapOpts, uzap.AddCaller())
zapOpts = append(zapOpts, uzap.AddCallerSkip(1))
zapOpts = append(zapOpts, uzap.AddStacktrace(uzap.DebugLevel))
opts := zap.Options{
Development: developmentFlag,
StacktraceLevel: …Run Code Online (Sandbox Code Playgroud) 我开始在我的 Go 项目中使用 zap 日志库。我想根据日志级别将不同的颜色打印到 tty 控制台。
我发现该zap/internal/color包可以显示不同颜色的字符串,但我想用不同的颜色更改日志级别。
我还想将日志写入一些具有不同日志级别的日志文件。
如何初始化和配置 zap 记录器?
我已将 Zap 与我的 go 应用程序集成,我们将日志打印在两个日志文件中,并且我还使用 Lumberjack 进行日志轮换。但我也尝试在控制台中显示日志,但在这种情况下没有运气。以下是我在 logger.go 中的代码
var (
Logger *zap.Logger
N2n *zap.Logger
)
type WriteSyncer struct {
io.Writer
}
func (ws WriteSyncer) Sync() error {
return nil
}
func InitLogging(mode string) {
var cfg zap.Config
var logName = "abc.log"
var slogName = "n2n.log"
if mode == "production" {
cfg = zap.NewProductionConfig()
cfg.DisableCaller = true
} else {
cfg = zap.NewDevelopmentConfig()
cfg.EncoderConfig.LevelKey = "level"
cfg.EncoderConfig.NameKey = "name"
cfg.EncoderConfig.MessageKey = "msg"
cfg.EncoderConfig.CallerKey = "caller"
cfg.EncoderConfig.StacktraceKey = "stacktrace"
}
cfg.Encoding …Run Code Online (Sandbox Code Playgroud) 我有一个从自定义配置(即config.Build())生成的 Zap 记录器。我想通过调用来测试记录器,例如,logger.Info()在测试方法中并断言结果以查看它是否符合配置集。我怎样才能做到这一点?
代码示例:
func GetLogger() *zap.Logger{
config := &zap.Config{
Encoding: "json",
Level: zap.NewAtomicLevelAt(zapcore.InfoLevel),
OutputPaths: []string{"stdout"},
ErrorOutputPaths: []string{"stdout"},
EncoderConfig: zapcore.EncoderConfig{
MessageKey: "@m",
LevelKey: "@l",
EncodeLevel: zapcore.CapitalLevelEncoder,
TimeKey: "@t",
EncodeTime: zapcore.EpochMillisTimeEncoder,
CallerKey: "@c",
EncodeCaller: zapcore.ShortCallerEncoder,
StacktraceKey: "@x",
},
}
return config.Build()
}
Run Code Online (Sandbox Code Playgroud) 给出以下代码(从此处复制):
1 package main
2
3 import (
4 "fmt"
5
6 "github.com/pkg/errors"
7
8 "go.uber.org/zap"
9 )
10
11 func main() {
12 logger, _ := zap.NewProduction()
13 defer logger.Sync()
14
15 sugar := logger.Sugar()
16 result, err := caller1()
17 if err != nil {
18 sugar.Error(err)
19 return
20 }
21 fmt.Println("Result: ", result)
22 }
23
24 func caller1() (int, error) {
25 err := caller2()
26 if err != nil {
27 return …Run Code Online (Sandbox Code Playgroud) 如何配置uber-go/zaplogger api 将日志附加到指定的文件路径。是否可以使其像滚动文件附加器(基于文件大小或日期)一样工作而不影响性能?
目前我们项目的日志格式是这样的:
www.abcdef.com`3`1s
Run Code Online (Sandbox Code Playgroud)
我想用Go重写项目并导入zap作为日志工具。通过 zap,日志的格式如下:
{"url": "www.abcdef.com", "attempt": 3, "backoff": "1s"}
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索了它的用法,但没有找到任何将 zap 格式更改为上述格式的方法,所以我想在这里寻求一些建议。
如何从 Uber Zap 日志记录中获取打印在日志中的函数名称?这是PR 请求,他们似乎添加了在日志中输出函数名称的功能。
我使用 golang 版本1.15和 go.uber.org/zap v1.16.0
这是我的代码:
package main
import (
"go.uber.org/zap"
)
var logger *zap.Logger
func main() {
logger := NewLogger()
logger.Info("Test msg Main")
TestFunc(logger)
}
func TestFunc(logger *zap.Logger) {
logger.Info("Test msg TestFunc")
}
func NewLogger() *zap.Logger {
config := zap.NewDevelopmentConfig()
opts := []zap.Option{
zap.AddCallerSkip(1), // traverse call depth for more useful log lines
zap.AddCaller(),
}
logger, _ = config.Build(opts...)
return logger
}Run Code Online (Sandbox Code Playgroud)
这是我在添加/不添加AddCaller()选项的情况下得到的输出
2021-03-01T15:00:02.927-0800 INFO runtime/proc.go:204 Test msg …Run Code Online (Sandbox Code Playgroud) 我将我的应用程序用作 SystemD 服务,并且需要在每条消息前添加<LEVEL>JournalD 的入门级别,例如:
<6> this is info
<7> this is debug
<4> this is warning
Run Code Online (Sandbox Code Playgroud)
否则,JournalD 将所有条目视为同一级别,我想使用其高级功能仅显示特定级别的日志。
<6>如何使用 uber-zap 库在每个日志条目前面添加正确的级别标签(例如 Info )?
编辑:这是我的记录器配置的相关部分:
<6> this is info
<7> this is debug
<4> this is warning
Run Code Online (Sandbox Code Playgroud)