Initial commit

This commit is contained in:
yan.y
2024-03-27 23:25:08 +08:00
commit 0884384e91
127 changed files with 9353 additions and 0 deletions
+88
View File
@@ -0,0 +1,88 @@
package zap_server
import (
"encoding/json"
"fmt"
"strconv"
"github.com/spf13/viper"
"pet-house.com/core/g"
"pet-house.com/core/server/viper_server"
)
var CONFIG = Zap{
Level: "debug",
Format: "console",
Prefix: "[IRIS]",
Director: "logs",
LinkName: "latest_log",
ShowLine: true,
EncodeLevel: "LowercaseColorLevelEncoder",
StacktraceKey: "stacktrace",
LogInConsole: false,
}
type Zap struct {
Level string `mapstructure:"level" json:"level" yaml:"level"` //debug ,info,warn,error,panic,fatal
Format string `mapstructure:"format" json:"format" yaml:"format"`
Prefix string `mapstructure:"prefix" json:"prefix" yaml:"prefix"`
Director string `mapstructure:"director" json:"director" yaml:"director"`
LinkName string `mapstructure:"link-name" json:"link-name" yaml:"link-name"`
ShowLine bool `mapstructure:"show-line" json:"show-line" yaml:"show-line"`
EncodeLevel string `mapstructure:"encode-level" json:"encode-level" yaml:"encode-level"`
StacktraceKey string `mapstructure:"stacktrace-key" json:"stacktrace-key" yaml:"stacktrace-key"`
LogInConsole bool `mapstructure:"log-in-console" json:"log-in-console" yaml:"log-in-console"`
}
// IsExist config file is exist
func IsExist() bool {
return getViperConfig().IsFileExist()
}
// Remove remove config file
func Remove() error {
return getViperConfig().Remove()
}
// Recover
func Recover() error {
b, err := json.Marshal(CONFIG)
if err != nil {
return err
}
return getViperConfig().Recover(b)
}
// getViperConfig get viper config
func getViperConfig() viper_server.ViperConfig {
configName := "zap"
showLine := strconv.FormatBool(CONFIG.ShowLine)
logInConsole := strconv.FormatBool(CONFIG.LogInConsole)
return viper_server.ViperConfig{
Debug: true,
Directory: g.ConfigDir,
Name: configName,
Type: g.ConfigType,
Watch: func(vi *viper.Viper) error {
if err := vi.Unmarshal(&CONFIG); err != nil {
return fmt.Errorf("get Unarshal error: %v", err)
}
// watch config file change
vi.SetConfigName(configName)
return nil
},
//
Default: []byte(`
{
"level": "` + CONFIG.Level + `",
"format": "` + CONFIG.Format + `",
"prefix": "` + CONFIG.Prefix + `",
"director": "` + CONFIG.Director + `",
"link-name": "` + CONFIG.LinkName + `",
"show-line": ` + showLine + `,
"encode-level": "` + CONFIG.EncodeLevel + `",
"stacktrace-key": "` + CONFIG.StacktraceKey + `",
"log-in-console": ` + logInConsole + `
}`),
}
}
+122
View File
@@ -0,0 +1,122 @@
package zap_server
import (
"fmt"
"time"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"pet-house.com/core/server/viper_server"
)
const ConfigFileName = "zap.yaml"
// level log level
var (
level zapcore.Level
ZAPLOG *zap.Logger
)
// init
func init() {
var logger *zap.Logger
viper_server.Init(getViperConfig())
switch CONFIG.Level {
case "debug":
level = zap.DebugLevel
case "info":
level = zap.InfoLevel
case "warn":
level = zap.WarnLevel
case "error":
level = zap.ErrorLevel
case "dpanic":
level = zap.DPanicLevel
case "panic":
level = zap.PanicLevel
case "fatal":
level = zap.FatalLevel
default:
level = zap.InfoLevel
}
if level == zap.DebugLevel || level == zap.ErrorLevel {
logger = zap.New(getEncoderCore(), zap.AddStacktrace(level))
} else {
logger = zap.New(getEncoderCore())
}
if CONFIG.ShowLine {
logger = logger.WithOptions(zap.AddCaller())
}
ZAPLOG = logger
}
// getEncoderConfig 获取zapcore.EncoderConfig
func getEncoderConfig() (conf zapcore.EncoderConfig) {
conf = zapcore.EncoderConfig{
MessageKey: "message",
LevelKey: "level",
TimeKey: "time",
NameKey: "logger",
CallerKey: "caller",
StacktraceKey: CONFIG.StacktraceKey,
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: customTimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.FullCallerEncoder,
}
switch {
case CONFIG.EncodeLevel == "LowercaseLevelEncoder":
conf.EncodeLevel = zapcore.LowercaseLevelEncoder
case CONFIG.EncodeLevel == "LowercaseColorLevelEncoder":
conf.EncodeLevel = zapcore.LowercaseColorLevelEncoder
case CONFIG.EncodeLevel == "CapitalLevelEncoder":
conf.EncodeLevel = zapcore.CapitalLevelEncoder
case CONFIG.EncodeLevel == "CapitalColorLevelEncoder":
conf.EncodeLevel = zapcore.CapitalColorLevelEncoder
default:
conf.EncodeLevel = zapcore.LowercaseLevelEncoder
}
return conf
}
// getEncoder
func getEncoder() zapcore.Encoder {
if CONFIG.Format == "json" {
return zapcore.NewJSONEncoder(getEncoderConfig())
}
return zapcore.NewConsoleEncoder(getEncoderConfig())
}
// getEncoderCore
func getEncoderCore() (core zapcore.Core) {
writer, err := GetWriteSyncer()
if err != nil {
fmt.Printf("Get Write Syncer Failed err:%v", err.Error())
return
}
return zapcore.NewCore(getEncoder(), writer, level)
}
func customTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format(CONFIG.Prefix + "2006/01/02 - 15:04:05.000"))
}
type StringsArray [][]string
// MarshalLogArray
func (ss StringsArray) MarshalLogArray(arr zapcore.ArrayEncoder) error {
for i := range ss {
for ii := range ss[i] {
arr.AppendString(ss[i][ii])
}
}
return nil
}
// Strings constructs a field that carries a slice of strings.
func Strings(key string, ss [][]string) zap.Field {
return zap.Array(key, StringsArray(ss))
}
+15
View File
@@ -0,0 +1,15 @@
package zap_server
import (
"testing"
)
func TestGetEncoderConfig(t *testing.T) {
defer Remove()
t.Run("test zap_server get encoder config", func(t *testing.T) {
config := getEncoderConfig()
if config.StacktraceKey != CONFIG.StacktraceKey {
t.Errorf("zaplog config stacktracekey want %s but get %s", CONFIG.StacktraceKey, config.StacktraceKey)
}
})
}
@@ -0,0 +1,24 @@
package zap_server
import (
"os"
"path"
"time"
zaprotatelogs "github.com/lestrrat-go/file-rotatelogs"
"go.uber.org/zap/zapcore"
)
// GetWriteSyncer
func GetWriteSyncer() (zapcore.WriteSyncer, error) {
fileWriter, err := zaprotatelogs.New(
path.Join(CONFIG.Director, "%Y-%m-%d.log"),
zaprotatelogs.WithLinkName(CONFIG.LinkName),
zaprotatelogs.WithMaxAge(7*24*time.Hour),
zaprotatelogs.WithRotationTime(24*time.Hour),
)
if CONFIG.LogInConsole {
return zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(fileWriter)), err
}
return zapcore.AddSync(fileWriter), err
}
@@ -0,0 +1,23 @@
package zap_server
import (
zaprotatelogs "github.com/lestrrat-go/file-rotatelogs"
"go.uber.org/zap/zapcore"
"os"
"path"
"time"
)
// GetWriteSyncer
func GetWriteSyncer() (zapcore.WriteSyncer, error) {
fileWriter, err := zaprotatelogs.New(
path.Join(CONFIG.Director, "%Y-%m-%d.log"),
zaprotatelogs.WithLinkName(CONFIG.LinkName),
zaprotatelogs.WithMaxAge(7*24*time.Hour),
zaprotatelogs.WithRotationTime(24*time.Hour),
)
if CONFIG.LogInConsole {
return zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(fileWriter)), err
}
return zapcore.AddSync(fileWriter), err
}
@@ -0,0 +1,23 @@
package zap_server
import (
"os"
"path"
"time"
zaprotatelogs "github.com/lestrrat-go/file-rotatelogs"
"go.uber.org/zap/zapcore"
)
// GetWriteSyncer
func GetWriteSyncer() (zapcore.WriteSyncer, error) {
fileWriter, err := zaprotatelogs.New(
path.Join(CONFIG.Director, "%Y-%m-%d.log"),
zaprotatelogs.WithMaxAge(7*24*time.Hour),
zaprotatelogs.WithRotationTime(24*time.Hour),
)
if CONFIG.LogInConsole {
return zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(fileWriter)), err
}
return zapcore.AddSync(fileWriter), err
}