zap
Logger structure
var _ hlog.FullLogger = (*Logger)(nil)
type Logger struct {
l *zap.SugaredLogger
config *config
}
NewLogger
Create and initialize a Logger through defaultConfig(). The required configuration can be passed into the function as a parameter. If no parameter is passed in, the initial configuration will be installed to create a Logger
For related configuration, please refer to option configuration below
Function Signature:
func NewLogger(opts ...Option) *Logger
Sample code:
package main
import (
"github.com/cloudwego/hertz/pkg/common/hlog"
hertzzap "github.com/hertz-contrib/logger/zap"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func main() {
logger := hertzzap.NewLogger(hertzzap.WithZapOptions(zap.WithFatalHook(zapcore.WriteThenPanic)))
hlog.SetLogger(logger)
}
Logger
Logger is used to return an instance of *zap.Logger for custom fields, etc
Function Signature:
func (l *Logger) Logger() *zap.Logger
Sample code:
package main
import (
hertzzap "github.com/hertz-contrib/logger/zap"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func main() {
logger := hertzzap.NewLogger(hertzzap.WithZapOptions(zap.WithFatalHook(zapcore.WriteThenPanic)))
l := logger.Logger()
}
Option configuration
WithCoreEnc
Encoder is a format-agnostic interface for all log entry marshalers, WithCoreEnc passes zapcore.Encoder into configuration
Function Signature:
func WithCoreEnc(enc zapcore.Encoder) Option
Sample code:
package main
import (
hertzzap "github.com/hertz-contrib/logger/zap"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func main() {
enc := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
l := hertzzap.NewLogger(hertzzap.WithCoreEnc(enc))
}
WithCoreWs
WithCoreWs specifies the location where the log is written through the zapcore.AddSync(file), and passes zapcore.WriteSyncer into the configuration
Function Signature:
func WithCoreWs(ws zapcore.WriteSyncer) Option
Sample code:
package main
import (
hertzzap "github.com/hertz-contrib/logger/zap"
"go.uber.org/zap/zapcore"
"os"
)
func main() {
ws := zapcore.AddSync(os.Stdout)
l:=hertzzap.NewLogger(hertzzap.WithCoreWs(ws))
}
WithCoreLevel
WithCoreLevel passes zap.AtomicLevel into configuration
Function Signature:
func WithCoreLevel(lvl zap.AtomicLevel) Option
Sample code:
package main
import (
hertzzap "github.com/hertz-contrib/logger/zap"
"go.uber.org/zap"
)
func main() {
lvl := zap.NewAtomicLevelAt(zap.InfoLevel)
l:=hertzzap.NewLogger(hertzzap.WithCoreLevel(lvl))
}
WithCores
WithCores passes zapcore.Encoder, zapcore.WriteSyncer, zap.AtomicLevel into CoreConfig into the configuration
Function Signature:
func WithCores(coreConfigs ...CoreConfig) Option
Sample code:
package main
import (
hertzzap "github.com/hertz-contrib/logger/zap"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
)
func main() {
enc := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
lvl := zap.NewAtomicLevelAt(zap.InfoLevel)
ws := zapcore.AddSync(os.Stdout)
cfg := hertzzap.CoreConfig{
Enc: enc,
Ws: ws,
Lvl: lvl,
}
l := hertzzap.NewLogger(hertzzap.WithCores(cfg))
}
WithZapOptions
WithZapOptions uses the append() method to append the original zap configuration
Function Signature:
func WithZapOptions(opts ...zap.Option) Option
Sample code:
package main
import (
hertzzap "github.com/hertz-contrib/logger/zap"
"go.uber.org/zap"
)
func main() {
opts := zap.AddCaller()
l := hertzzap.NewLogger(hertzzap.WithZapOptions(opts,zap.Hooks()))
}
}
WithExtraKeys
ExtraKey is a field in the zap.config structure used to store extra keys. WithExtraKeys judges the incoming parameters. If they are not added to zap.config, the incoming parameters are added to zap .config
Function Signature:
type ExtraKey String
func WithExtraKeys(keys []ExtraKey) Option
Sample code:
package main
import (
hertzzap "github.com/hertz-contrib/logger/zap"
"go.uber.org/zap"
)
func main() {
l := hertzzap.NewLogger(hertzzap.WithExtraKeys())
}
WithExtraKeyAsStr
WithExtraKeyAsStr convert extraKey to a string type when retrieving value from context
Not recommended for use, only for compatibility with certain situations
Typically used with WithExtraKeys
Function Signature:
func WithExtraKeyAsStr() Option
Sample code:
package main
import (
hertzzap "github.com/hertz-contrib/logger/zap"
"go.uber.org/zap"
)
func main() {
l := hertzzap.NewLogger(hertzzap.WithExtraKeys(),hertzzap.WithExtraKeyAsStr())
}
A complete zap example
package main
import (
"context"
"log"
"os"
"path"
"time"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/common/hlog"
"github.com/cloudwego/hertz/pkg/protocol/consts"
hertzzap "github.com/hertz-contrib/logger/zap"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
h := server.Default()
// Customizable output directory.
var logFilePath string
dir := "./hlog"
logFilePath = dir + "/logs/"
if err := os.MkdirAll(logFilePath, 0o777); err != nil {
log.Println(err.Error())
return
}
// set filename to date
logFileName := time.Now().Format("2006-01-02") + ".log"
fileName := path.Join(logFilePath, logFileName)
if _, err := os.Stat(fileName); err != nil {
if _, err := os.Create(fileName); err != nil {
log.Println(err.Error())
return
}
}
logger := hertzzap.NewLogger()
// Provides compression and deletion
lumberjackLogger := &lumberjack.Logger{
Filename: fileName,
MaxSize: 20, // A file can be up to 20M.
MaxBackups: 5, // Save up to 5 files at the same time
MaxAge: 10, // A file can be saved for up to 10 days.
Compress: true, // Compress with gzip.
}
logger.SetOutput(lumberjackLogger)
logger.SetLevel(hlog.LevelDebug)
hlog.SetLogger(logger)
h.GET("/hello", func(ctx context.Context, c *app.RequestContext) {
hlog.Info("Hello, hertz")
c.String(consts.StatusOK, "Hello hertz!")
})
h.Spin()
}
For more details on how to adapt the interface of hlog, see hertz-contrib/logger/zap