Skip to content

Commit cb3c0d6

Browse files
committed
日志不使用全局变量控制,调整日志相关代码
1 parent c100e3b commit cb3c0d6

File tree

13 files changed

+162
-150
lines changed

13 files changed

+162
-150
lines changed

boot/boot.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func Boot() {
1616
}
1717
go func() {
1818
if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
19-
zap.L().Info(fmt.Sprintf("start http server error: %v\n", err))
19+
global.LbLogger.Info(fmt.Sprintf("start http server error: %v\n", err))
2020
}
2121
}()
2222
logo(addr)

boot/log.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,22 @@ import (
55
"fmt"
66
"github.com/reggiepy/LogBeetle/global"
77
"github.com/reggiepy/LogBeetle/goutils/logUtils"
8+
"go.uber.org/zap"
89
"os"
910
)
1011

11-
func Log() {
12-
logConfig := &logUtils.Config{}
12+
func Log() *zap.Logger {
13+
logConfig := logUtils.NewDefaultConfig()
1314
jsonBytes, _ := json.Marshal(global.LbConfig.LogConfig)
1415
err := json.Unmarshal(jsonBytes, logConfig)
1516
if err != nil {
16-
fmt.Println(err.Error())
17+
fmt.Printf("Error marshalling log config: %v\n", err)
1718
os.Exit(1)
1819
}
19-
err = logUtils.InitLogger(*logConfig)
20+
logger, err := logConfig.NewLogger()
2021
if err != nil {
21-
fmt.Println(err.Error())
22+
fmt.Printf("Error creating logger: %v\n", err)
2223
os.Exit(1)
2324
}
25+
return logger
2426
}

cmd/LogBeetle/sub/config.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,13 @@ import (
1616

1717
func init() {
1818
rootCmd.AddCommand(configCmd)
19+
20+
// show config
1921
configCmd.AddCommand(configShowCmd)
2022
configShowCmd.Flags().Var(configFormat, "format", "humanReadable | simple")
21-
configCmd.ValidArgsFunction = func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
22-
return []string{"json", "simple"}, cobra.ShellCompDirectiveNoFileComp
23-
}
2423

24+
// generate config
2525
configCmd.AddCommand(configGenerateCmd)
26-
configCmd.ValidArgsFunction = func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
27-
return []string{"json", "simple"}, cobra.ShellCompDirectiveNoFileComp
28-
}
2926
}
3027

3128
var configCmd = &cobra.Command{
@@ -40,6 +37,9 @@ var configCmd = &cobra.Command{
4037
var configShowCmd = &cobra.Command{
4138
Use: "show",
4239
Short: "show config",
40+
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
41+
return []string{"json", "simple"}, cobra.ShellCompDirectiveNoFileComp
42+
},
4343
RunE: func(cmd *cobra.Command, args []string) error {
4444
global.LbViper = boot.Viper()
4545
data, err := jsonUtils.AnyToJson(global.LbConfig, configFormat.String())

cmd/LogBeetle/sub/root.go

+14-9
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import (
55
"fmt"
66
"github.com/reggiepy/LogBeetle/boot"
77
"github.com/reggiepy/LogBeetle/global"
8-
"go.uber.org/zap"
8+
"github.com/reggiepy/LogBeetle/goutils/enumUtils"
9+
"github.com/reggiepy/LogBeetle/version"
910
"os"
1011
"os/signal"
1112
"sync"
@@ -21,7 +22,7 @@ import (
2122

2223
var (
2324
showVersion bool
24-
configFormat = NewEnum([]string{"humanReadable", "simple"}, "humanReadable")
25+
configFormat = enumUtils.NewEnum([]string{"humanReadable", "simple"}, "humanReadable")
2526
)
2627

2728
func init() {
@@ -45,18 +46,22 @@ func init() {
4546
}
4647

4748
var rootCmd = cobra.Command{
48-
Use: "LogBeetle",
49-
Short: "LogBeetle help",
50-
Long: `LogBeetle help`,
51-
Version: "",
49+
Use: "LogBeetle",
50+
Short: "LogBeetle help",
51+
Long: `LogBeetle help`,
5252
Args: func(cmd *cobra.Command, args []string) error {
5353
return nil
5454
},
55-
Run: func(cmd *cobra.Command, args []string) {
55+
RunE: func(cmd *cobra.Command, args []string) error {
56+
if showVersion {
57+
fmt.Println(version.Full())
58+
return nil
59+
}
5660
global.LbViper = boot.Viper()
57-
boot.Log()
61+
global.LbLogger = boot.Log()
5862
boot.Boot()
5963
StartServer()
64+
return nil
6065
},
6166
}
6267

@@ -119,7 +124,7 @@ func StartServer() {
119124
} else {
120125
consumerManager.Add(c)
121126
fmt.Printf("consumer %s added\n", "test")
122-
zap.L().Info(fmt.Sprintf("consumer %s added\n", "test"))
127+
global.LbLogger.Info(fmt.Sprintf("consumer %s added\n", "test"))
123128
}
124129

125130
// 添加其他消费者

global/global.go

+2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package global
33
import (
44
"github.com/reggiepy/LogBeetle/config"
55
"github.com/spf13/viper"
6+
"go.uber.org/zap"
67
)
78

89
var (
910
LbConfig config.Config
1011
LbViper *viper.Viper
12+
LbLogger *zap.Logger
1113
)

goutils/arrayUtils/set.go

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package arrayUtils
2+
3+
type Set map[string]struct{}
4+
5+
func NewSet(item ...string) Set {
6+
s := make(Set, len(item))
7+
for _, v := range item {
8+
s.Add(v)
9+
}
10+
return s
11+
}
12+
13+
func (s Set) Has(key string) bool {
14+
_, ok := s[key]
15+
return ok
16+
}
17+
18+
func (s Set) Add(key string) {
19+
s[key] = struct{}{}
20+
}
21+
22+
func (s Set) Delete(key string) {
23+
delete(s, key)
24+
}

cmd/LogBeetle/sub/enum.go renamed to goutils/enumUtils/enumUtils.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package sub
1+
package enumUtils
22

33
import (
44
"fmt"

goutils/logUtils/logUtils.go

+26-100
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package logUtils
22

33
import (
4-
"reflect"
5-
64
"github.com/natefinch/lumberjack"
5+
"github.com/reggiepy/LogBeetle/goutils/arrayUtils"
76
"go.uber.org/zap"
87
"go.uber.org/zap/zapcore"
98
)
109

11-
var Logger *zap.Logger
12-
1310
type Config struct {
1411
LogFile string `json:"LogFile" yaml:"LogFile"` // 日志文件名
1512
MaxSize int `json:"MaxSize" yaml:"MaxSize"` // 日志文件大小限制,单位为 MB
@@ -20,64 +17,6 @@ type Config struct {
2017
LogFormat string `json:"LogFormat" yaml:"LogFormat"` // 日志等级
2118
}
2219

23-
type ConfigOption func(loggerConfig *Config) error
24-
25-
// WithLogFile 设置日志文件名
26-
func WithLogFile(logFile string) ConfigOption {
27-
return func(loggerConfig *Config) error {
28-
loggerConfig.LogFile = logFile
29-
return nil
30-
}
31-
}
32-
33-
// WithMaxSize 设置日志文件大小限制,单位为 MB
34-
func WithMaxSize(maxSize int) ConfigOption {
35-
return func(loggerConfig *Config) error {
36-
loggerConfig.MaxSize = maxSize
37-
return nil
38-
}
39-
}
40-
41-
// WithMaxBackups 设置最大保留的旧日志文件数量
42-
func WithMaxBackups(maxBackups int) ConfigOption {
43-
return func(loggerConfig *Config) error {
44-
loggerConfig.MaxBackups = maxBackups
45-
return nil
46-
}
47-
}
48-
49-
// WithMaxAge 设置旧日志文件保留天数
50-
func WithMaxAge(maxAge int) ConfigOption {
51-
return func(loggerConfig *Config) error {
52-
loggerConfig.MaxAge = maxAge
53-
return nil
54-
}
55-
}
56-
57-
// WithCompress 设置是否压缩旧日志文件
58-
func WithCompress(compress bool) ConfigOption {
59-
return func(loggerConfig *Config) error {
60-
loggerConfig.Compress = compress
61-
return nil
62-
}
63-
}
64-
65-
// WithLogLevel 设置日志等级
66-
func WithLogLevel(logLevel string) ConfigOption {
67-
return func(loggerConfig *Config) error {
68-
loggerConfig.LogLevel = logLevel
69-
return nil
70-
}
71-
}
72-
73-
// WithLogFormat 设置日志格式
74-
func WithLogFormat(logFormat string) ConfigOption {
75-
return func(loggerConfig *Config) error {
76-
loggerConfig.LogFormat = logFormat
77-
return nil
78-
}
79-
}
80-
8120
// NewDefaultConfig 创建默认配置
8221
func NewDefaultConfig() *Config {
8322
return &Config{
@@ -91,62 +30,49 @@ func NewDefaultConfig() *Config {
9130
}
9231
}
9332

94-
// InitLogger 初始化Logger
95-
func InitLogger(logConfig Config, options ...ConfigOption) error {
96-
if reflect.DeepEqual(logConfig, Config{}) {
97-
logConfig = *NewDefaultConfig()
98-
}
99-
for _, option := range options {
100-
err := option(&logConfig)
101-
if err != nil {
102-
return err
103-
}
104-
}
105-
logLevel := map[string]zapcore.Level{
106-
"debug": zapcore.DebugLevel,
107-
"info": zapcore.InfoLevel,
108-
"warn": zapcore.WarnLevel,
109-
"error": zapcore.ErrorLevel,
33+
// NewLogger 初始化Logger
34+
func (c *Config) NewLogger(opts ...Option) (*zap.Logger, error) {
35+
var (
36+
logger *zap.Logger
37+
logFormats = arrayUtils.NewSet("json", "logfmt")
38+
)
39+
for _, opt := range opts {
40+
opt.apply(c)
11041
}
11142

11243
lumberJackLogger := &lumberjack.Logger{
113-
Filename: logConfig.LogFile,
114-
MaxSize: logConfig.MaxSize,
115-
MaxBackups: logConfig.MaxBackups,
116-
MaxAge: logConfig.MaxAge,
117-
Compress: logConfig.Compress,
44+
Filename: c.LogFile,
45+
MaxSize: c.MaxSize,
46+
MaxBackups: c.MaxBackups,
47+
MaxAge: c.MaxAge,
48+
Compress: c.Compress,
11849
}
11950
writeSyncer := zapcore.AddSync(lumberJackLogger)
12051

121-
logFormats := []string{"json", "logfmt"}
12252
logFormat := "json"
123-
for _, format := range logFormats {
124-
if format == logConfig.LogFormat {
125-
logFormat = format
126-
}
53+
for logFormats.Has(c.LogFormat) {
54+
logFormat = c.LogFormat
12755
}
128-
encoder := getEncoder(logFormat)
129-
l, ok := logLevel[logConfig.LogLevel] // 日志打印级别
130-
if !ok {
131-
l = logLevel["info"]
56+
encoder := NewEncoder(logFormat)
57+
58+
// 日志打印级别
59+
l, err := zapcore.ParseLevel(c.LogLevel)
60+
if err != nil {
61+
l = zapcore.InfoLevel
13262
}
133-
//l, err := zapcore.ParseLevel(logConfig.LogLevel)
134-
//if err != nil {
135-
// l = zapcore.InfoLevel
136-
//}
13763
core := zapcore.NewCore(encoder, writeSyncer, l)
13864

139-
Logger = zap.New(core, zap.AddCaller()) // zap.Addcaller() 输出日志打印文件和行数如: logger/logger_test.go:33
65+
logger = zap.New(core, zap.AddCaller()) // zap.Addcaller() 输出日志打印文件和行数如: logger/logger_test.go:33
14066
// 1. zap.ReplaceGlobals 函数将当前初始化的 logger 替换到全局的 logger,
14167
// 2. 使用 logger 的时候 直接通过 zap.S().Debugf("xxx") or zap.L().Debug("xxx")
14268
// 3. 使用 zap.S() 和 zap.L() 提供全局锁,保证一个全局的安全访问logger的方式
143-
zap.ReplaceGlobals(Logger) // 替换zap包中全局的logger实例,后续在其他包中只需使用zap.L()调用即可
69+
//zap.ReplaceGlobals(logger) // 替换zap包中全局的logger实例,后续在其他包中只需使用zap.L()调用即可
14470
// zap.L().Debug("")
14571
// zap.S().Debugf("")
146-
return nil
72+
return logger, nil
14773
}
14874

149-
func getEncoder(logFormat string) zapcore.Encoder {
75+
func NewEncoder(logFormat string) zapcore.Encoder {
15076
encoderConfig := zap.NewProductionEncoderConfig()
15177
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
15278
encoderConfig.TimeKey = "time"

goutils/logUtils/options.go

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package logUtils
2+
3+
type Option interface {
4+
apply(config *Config)
5+
}
6+
7+
type optionFunc func(config *Config)
8+
9+
func (o optionFunc) apply(config *Config) {
10+
o(config)
11+
}
12+
13+
// WithLogFile 设置日志文件名
14+
func WithLogFile(logFile string) Option {
15+
return optionFunc(func(config *Config) {
16+
config.LogFile = logFile
17+
return
18+
})
19+
}
20+
21+
// WithMaxSize 设置日志文件大小限制,单位为 MB
22+
func WithMaxSize(maxSize int) Option {
23+
return optionFunc(func(loggerConfig *Config) {
24+
loggerConfig.MaxSize = maxSize
25+
})
26+
}
27+
28+
// WithMaxBackups 设置最大保留的旧日志文件数量
29+
func WithMaxBackups(maxBackups int) Option {
30+
return optionFunc(func(loggerConfig *Config) {
31+
loggerConfig.MaxBackups = maxBackups
32+
})
33+
}
34+
35+
// WithMaxAge 设置旧日志文件保留天数
36+
func WithMaxAge(maxAge int) Option {
37+
return optionFunc(func(loggerConfig *Config) {
38+
loggerConfig.MaxAge = maxAge
39+
})
40+
}
41+
42+
// WithCompress 设置是否压缩旧日志文件
43+
func WithCompress(compress bool) Option {
44+
return optionFunc(func(loggerConfig *Config) {
45+
loggerConfig.Compress = compress
46+
})
47+
}
48+
49+
// WithLogLevel 设置日志等级
50+
func WithLogLevel(logLevel string) Option {
51+
return optionFunc(func(loggerConfig *Config) {
52+
loggerConfig.LogLevel = logLevel
53+
})
54+
}
55+
56+
// WithLogFormat 设置日志格式
57+
func WithLogFormat(logFormat string) Option {
58+
return optionFunc(func(loggerConfig *Config) {
59+
loggerConfig.LogFormat = logFormat
60+
})
61+
}

0 commit comments

Comments
 (0)