Compare commits
2 Commits
9d7fea4d82
...
8213cc3729
Author | SHA1 | Date | |
---|---|---|---|
8213cc3729 | |||
3e5a9b3244 |
@ -12,9 +12,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
"git.hexq.cn/tiglog/golib/crypto/gmd5"
|
|
||||||
"github.com/rs/xid"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 是否是字符串
|
// 是否是字符串
|
||||||
@ -26,10 +23,10 @@ func IsString(v interface{}) bool {
|
|||||||
// 随机字符串
|
// 随机字符串
|
||||||
func RandString(n int) string {
|
func RandString(n int) string {
|
||||||
letterRunes := []rune("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
letterRunes := []rune("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
||||||
rand.Seed(time.Now().UnixNano())
|
rd := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
b := make([]rune, n)
|
b := make([]rune, n)
|
||||||
for i := range b {
|
for i := range b {
|
||||||
b[i] = letterRunes[rand.Intn(len(letterRunes))]
|
b[i] = letterRunes[rd.Intn(len(letterRunes))]
|
||||||
}
|
}
|
||||||
return string(b)
|
return string(b)
|
||||||
}
|
}
|
||||||
@ -125,44 +122,6 @@ func Reverse(str string) string {
|
|||||||
return string(runes[n:])
|
return string(runes[n:])
|
||||||
}
|
}
|
||||||
|
|
||||||
// 唯一字符串
|
|
||||||
// 返回字符串长度为 20
|
|
||||||
func GenId() string {
|
|
||||||
guid := xid.New()
|
|
||||||
return guid.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// 可变长度的唯一字符串
|
|
||||||
// 长度太短,可能就不唯一了
|
|
||||||
// 长度大于等于 16 为最佳
|
|
||||||
// 长度小于20时,为 GenId 的值 md5 后的前缀,因此,理论上前6位也能在大多数情况
|
|
||||||
// 下唯一
|
|
||||||
func Uniq(l int) string {
|
|
||||||
if l <= 0 {
|
|
||||||
panic("wrong length param")
|
|
||||||
}
|
|
||||||
ret := GenId()
|
|
||||||
hl := len(ret)
|
|
||||||
if l < hl {
|
|
||||||
t, err := gmd5.EncryptString(ret)
|
|
||||||
if err != nil {
|
|
||||||
return ret[hl-l:]
|
|
||||||
}
|
|
||||||
return t[:l]
|
|
||||||
}
|
|
||||||
mhac_len := 6
|
|
||||||
pl := len(ret)
|
|
||||||
var hash string
|
|
||||||
for l > pl {
|
|
||||||
hash = GenId()
|
|
||||||
hash = hash[mhac_len:]
|
|
||||||
ret += hash
|
|
||||||
pl += len(hash)
|
|
||||||
}
|
|
||||||
// log.Println("ret=", ret, ", pl=", pl, ", l=", l)
|
|
||||||
return ret[0:l]
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetCjkRange(code int) string {
|
func GetCjkRange(code int) string {
|
||||||
var result string
|
var result string
|
||||||
if code >= 0x4E00 && code <= 0x9FFF {
|
if code >= 0x4E00 && code <= 0x9FFF {
|
||||||
|
@ -46,79 +46,6 @@ func TestUcFirst(t *testing.T) {
|
|||||||
gtest.Equal(t, "HelloWorld", r3)
|
gtest.Equal(t, "HelloWorld", r3)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGenId(t *testing.T) {
|
|
||||||
s1 := helper.GenId()
|
|
||||||
s2 := helper.GenId()
|
|
||||||
s3 := helper.GenId()
|
|
||||||
s4 := helper.GenId()
|
|
||||||
fmt.Println("gen id: ", s4)
|
|
||||||
gtest.NotNil(t, s1)
|
|
||||||
gtest.NotNil(t, s2)
|
|
||||||
gtest.NotNil(t, s3)
|
|
||||||
gtest.NotNil(t, s4)
|
|
||||||
gtest.NotEqual(t, s1, s2)
|
|
||||||
gtest.NotEqual(t, s1, s3)
|
|
||||||
gtest.NotEqual(t, s1, s4)
|
|
||||||
// fmt.Println(s1)
|
|
||||||
// fmt.Println(s2)
|
|
||||||
// fmt.Println(s3)
|
|
||||||
// fmt.Println(s4)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestUniq(t *testing.T) {
|
|
||||||
s1 := helper.Uniq(1)
|
|
||||||
fmt.Println("s1=", s1)
|
|
||||||
gtest.True(t, 1 == len(s1))
|
|
||||||
|
|
||||||
s12 := helper.Uniq(6)
|
|
||||||
s13 := helper.Uniq(6)
|
|
||||||
s14 := helper.Uniq(6)
|
|
||||||
s15 := helper.Uniq(6)
|
|
||||||
fmt.Println("s12..15", s12, s13, s14, s15)
|
|
||||||
gtest.NotNil(t, s12)
|
|
||||||
gtest.NotNil(t, s13)
|
|
||||||
gtest.NotNil(t, s14)
|
|
||||||
gtest.NotNil(t, s15)
|
|
||||||
gtest.NotEqual(t, s12, s13)
|
|
||||||
gtest.NotEqual(t, s12, s14)
|
|
||||||
gtest.NotEqual(t, s12, s15)
|
|
||||||
|
|
||||||
s2 := helper.Uniq(16)
|
|
||||||
s3 := helper.Uniq(16)
|
|
||||||
s4 := helper.Uniq(16)
|
|
||||||
s5 := helper.Uniq(16)
|
|
||||||
gtest.NotNil(t, s2)
|
|
||||||
gtest.NotNil(t, s3)
|
|
||||||
gtest.NotNil(t, s4)
|
|
||||||
gtest.NotNil(t, s5)
|
|
||||||
gtest.NotEqual(t, s2, s3)
|
|
||||||
gtest.NotEqual(t, s2, s4)
|
|
||||||
gtest.NotEqual(t, s2, s5)
|
|
||||||
|
|
||||||
s6 := helper.Uniq(32)
|
|
||||||
fmt.Println("s6=", s6)
|
|
||||||
s7 := helper.Uniq(32)
|
|
||||||
s8 := helper.Uniq(32)
|
|
||||||
s9 := helper.Uniq(32)
|
|
||||||
gtest.NotNil(t, s6)
|
|
||||||
gtest.NotNil(t, s7)
|
|
||||||
gtest.NotNil(t, s8)
|
|
||||||
gtest.NotNil(t, s9)
|
|
||||||
// fmt.Println("s6789=", s6, s7, s8, s9)
|
|
||||||
|
|
||||||
s60 := helper.Uniq(64)
|
|
||||||
fmt.Println("s60=", s60)
|
|
||||||
s70 := helper.Uniq(64)
|
|
||||||
s80 := helper.Uniq(64)
|
|
||||||
s90 := helper.Uniq(64)
|
|
||||||
gtest.NotNil(t, s60)
|
|
||||||
gtest.NotNil(t, s70)
|
|
||||||
gtest.NotNil(t, s80)
|
|
||||||
gtest.NotNil(t, s90)
|
|
||||||
// fmt.Println(s60, s70, s80, s90)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSnake(t *testing.T) {
|
func TestSnake(t *testing.T) {
|
||||||
s1 := "XxYy"
|
s1 := "XxYy"
|
||||||
r1 := helper.SnakeString(s1)
|
r1 := helper.SnakeString(s1)
|
||||||
|
51
helper/uniq_helper.go
Normal file
51
helper/uniq_helper.go
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
//
|
||||||
|
// uniq_helper.go
|
||||||
|
// Copyright (C) 2023 tiglog <me@tiglog.com>
|
||||||
|
//
|
||||||
|
// Distributed under terms of the MIT license.
|
||||||
|
//
|
||||||
|
|
||||||
|
package helper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.hexq.cn/tiglog/golib/crypto/gmd5"
|
||||||
|
"github.com/rs/xid"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 唯一字符串
|
||||||
|
// 返回字符串长度为 20
|
||||||
|
func GenId() string {
|
||||||
|
guid := xid.New()
|
||||||
|
return guid.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 可变长度的唯一字符串
|
||||||
|
// 长度太短,可能就不唯一了
|
||||||
|
// 长度大于等于 16 为最佳
|
||||||
|
// 长度小于20时,为 GenId 的值 md5 后的前缀,因此,理论上前6位也能在大多数情况
|
||||||
|
// 下唯一
|
||||||
|
func Uniq(l int) string {
|
||||||
|
if l <= 0 {
|
||||||
|
panic("wrong length param")
|
||||||
|
}
|
||||||
|
ret := GenId()
|
||||||
|
hl := len(ret)
|
||||||
|
if l < hl {
|
||||||
|
t, err := gmd5.EncryptString(ret)
|
||||||
|
if err != nil {
|
||||||
|
return ret[hl-l:]
|
||||||
|
}
|
||||||
|
return t[:l]
|
||||||
|
}
|
||||||
|
mhac_len := 6
|
||||||
|
pl := len(ret)
|
||||||
|
var hash string
|
||||||
|
for l > pl {
|
||||||
|
hash = GenId()
|
||||||
|
hash = hash[mhac_len:]
|
||||||
|
ret += hash
|
||||||
|
pl += len(hash)
|
||||||
|
}
|
||||||
|
// log.Println("ret=", ret, ", pl=", pl, ", l=", l)
|
||||||
|
return ret[0:l]
|
||||||
|
}
|
89
helper/uniq_helper_test.go
Normal file
89
helper/uniq_helper_test.go
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
//
|
||||||
|
// uniq_helper_test.go
|
||||||
|
// Copyright (C) 2023 tiglog <me@tiglog.com>
|
||||||
|
//
|
||||||
|
// Distributed under terms of the MIT license.
|
||||||
|
//
|
||||||
|
|
||||||
|
package helper_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.hexq.cn/tiglog/golib/gtest"
|
||||||
|
"git.hexq.cn/tiglog/golib/helper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGenId(t *testing.T) {
|
||||||
|
s1 := helper.GenId()
|
||||||
|
s2 := helper.GenId()
|
||||||
|
s3 := helper.GenId()
|
||||||
|
s4 := helper.GenId()
|
||||||
|
fmt.Println("gen id: ", s4)
|
||||||
|
gtest.NotNil(t, s1)
|
||||||
|
gtest.NotNil(t, s2)
|
||||||
|
gtest.NotNil(t, s3)
|
||||||
|
gtest.NotNil(t, s4)
|
||||||
|
gtest.NotEqual(t, s1, s2)
|
||||||
|
gtest.NotEqual(t, s1, s3)
|
||||||
|
gtest.NotEqual(t, s1, s4)
|
||||||
|
// fmt.Println(s1)
|
||||||
|
// fmt.Println(s2)
|
||||||
|
// fmt.Println(s3)
|
||||||
|
// fmt.Println(s4)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUniq(t *testing.T) {
|
||||||
|
s1 := helper.Uniq(1)
|
||||||
|
fmt.Println("s1=", s1)
|
||||||
|
gtest.True(t, 1 == len(s1))
|
||||||
|
|
||||||
|
s12 := helper.Uniq(6)
|
||||||
|
s13 := helper.Uniq(6)
|
||||||
|
s14 := helper.Uniq(6)
|
||||||
|
s15 := helper.Uniq(6)
|
||||||
|
fmt.Println("s12..15", s12, s13, s14, s15)
|
||||||
|
gtest.NotNil(t, s12)
|
||||||
|
gtest.NotNil(t, s13)
|
||||||
|
gtest.NotNil(t, s14)
|
||||||
|
gtest.NotNil(t, s15)
|
||||||
|
gtest.NotEqual(t, s12, s13)
|
||||||
|
gtest.NotEqual(t, s12, s14)
|
||||||
|
gtest.NotEqual(t, s12, s15)
|
||||||
|
|
||||||
|
s2 := helper.Uniq(16)
|
||||||
|
s3 := helper.Uniq(16)
|
||||||
|
s4 := helper.Uniq(16)
|
||||||
|
s5 := helper.Uniq(16)
|
||||||
|
gtest.NotNil(t, s2)
|
||||||
|
gtest.NotNil(t, s3)
|
||||||
|
gtest.NotNil(t, s4)
|
||||||
|
gtest.NotNil(t, s5)
|
||||||
|
gtest.NotEqual(t, s2, s3)
|
||||||
|
gtest.NotEqual(t, s2, s4)
|
||||||
|
gtest.NotEqual(t, s2, s5)
|
||||||
|
|
||||||
|
s6 := helper.Uniq(32)
|
||||||
|
fmt.Println("s6=", s6)
|
||||||
|
s7 := helper.Uniq(32)
|
||||||
|
s8 := helper.Uniq(32)
|
||||||
|
s9 := helper.Uniq(32)
|
||||||
|
gtest.NotNil(t, s6)
|
||||||
|
gtest.NotNil(t, s7)
|
||||||
|
gtest.NotNil(t, s8)
|
||||||
|
gtest.NotNil(t, s9)
|
||||||
|
// fmt.Println("s6789=", s6, s7, s8, s9)
|
||||||
|
|
||||||
|
s60 := helper.Uniq(64)
|
||||||
|
fmt.Println("s60=", s60)
|
||||||
|
s70 := helper.Uniq(64)
|
||||||
|
s80 := helper.Uniq(64)
|
||||||
|
s90 := helper.Uniq(64)
|
||||||
|
gtest.NotNil(t, s60)
|
||||||
|
gtest.NotNil(t, s70)
|
||||||
|
gtest.NotNil(t, s80)
|
||||||
|
gtest.NotNil(t, s90)
|
||||||
|
// fmt.Println(s60, s70, s80, s90)
|
||||||
|
}
|
@ -10,7 +10,6 @@ package logger
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
@ -32,6 +31,7 @@ type Logger struct {
|
|||||||
l *zap.Logger
|
l *zap.Logger
|
||||||
// https://pkg.go.dev/go.uber.org/zap#example-AtomicLevel
|
// https://pkg.go.dev/go.uber.org/zap#example-AtomicLevel
|
||||||
al *zap.AtomicLevel
|
al *zap.AtomicLevel
|
||||||
|
fields map[string]Field
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(out io.Writer, level Level, opts ...Option) *Logger {
|
func New(out io.Writer, level Level, opts ...Option) *Logger {
|
||||||
@ -39,16 +39,20 @@ func New(out io.Writer, level Level, opts ...Option) *Logger {
|
|||||||
out = os.Stderr
|
out = os.Stderr
|
||||||
}
|
}
|
||||||
|
|
||||||
al := zap.NewAtomicLevelAt(level)
|
var al = zap.NewAtomicLevelAt(level)
|
||||||
cfg := zap.NewProductionEncoderConfig()
|
var cfg zap.Config
|
||||||
cfg.EncodeTime = zapcore.RFC3339TimeEncoder
|
if level == DebugLevel {
|
||||||
|
cfg = zap.NewDevelopmentConfig()
|
||||||
|
} else {
|
||||||
|
cfg = zap.NewProductionConfig()
|
||||||
|
}
|
||||||
|
|
||||||
core := zapcore.NewCore(
|
core := zapcore.NewCore(
|
||||||
zapcore.NewJSONEncoder(cfg),
|
zapcore.NewJSONEncoder(cfg.EncoderConfig),
|
||||||
zapcore.AddSync(out),
|
zapcore.AddSync(out),
|
||||||
al,
|
al,
|
||||||
)
|
)
|
||||||
return &Logger{l: zap.New(core, opts...), al: &al}
|
return &Logger{l: zap.New(core, opts...), al: &al, fields: make(map[string]Field)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetLevel 动态更改日志级别
|
// SetLevel 动态更改日志级别
|
||||||
@ -62,28 +66,37 @@ func (l *Logger) SetLevel(level Level) {
|
|||||||
|
|
||||||
type Field = zap.Field
|
type Field = zap.Field
|
||||||
|
|
||||||
|
func mergeFields(fields []Field) []Field {
|
||||||
|
var mfields = []Field{}
|
||||||
|
for _, field := range std.fields {
|
||||||
|
mfields = append(mfields, field)
|
||||||
|
}
|
||||||
|
mfields = append(mfields, fields...)
|
||||||
|
return mfields
|
||||||
|
}
|
||||||
|
|
||||||
func (l *Logger) Debug(msg string, fields ...Field) {
|
func (l *Logger) Debug(msg string, fields ...Field) {
|
||||||
l.l.Debug(msg, fields...)
|
l.l.Debug(msg, mergeFields(fields)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Logger) Info(msg string, fields ...Field) {
|
func (l *Logger) Info(msg string, fields ...Field) {
|
||||||
l.l.Info(msg, fields...)
|
l.l.Info(msg, mergeFields(fields)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Logger) Warn(msg string, fields ...Field) {
|
func (l *Logger) Warn(msg string, fields ...Field) {
|
||||||
l.l.Warn(msg, fields...)
|
l.l.Warn(msg, mergeFields(fields)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Logger) Error(msg string, fields ...Field) {
|
func (l *Logger) Error(msg string, fields ...Field) {
|
||||||
l.l.Error(msg, fields...)
|
l.l.Error(msg, mergeFields(fields)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Logger) Panic(msg string, fields ...Field) {
|
func (l *Logger) Panic(msg string, fields ...Field) {
|
||||||
l.l.Panic(msg, fields...)
|
l.l.Panic(msg, mergeFields(fields)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Logger) Fatal(msg string, fields ...Field) {
|
func (l *Logger) Fatal(msg string, fields ...Field) {
|
||||||
l.l.Fatal(msg, fields...)
|
l.l.Fatal(msg, mergeFields(fields)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Logger) Sync() error {
|
func (l *Logger) Sync() error {
|
||||||
@ -97,12 +110,12 @@ func ReplaceDefault(l *Logger) { std = l }
|
|||||||
|
|
||||||
func SetLevel(level Level) { std.SetLevel(level) }
|
func SetLevel(level Level) { std.SetLevel(level) }
|
||||||
|
|
||||||
func WithTarget(target string) Field {
|
func With(field Field) {
|
||||||
return String("target", target)
|
std.fields[field.Key] = field
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithRequestId(req *http.Request) Field {
|
func WithTarget(target string) {
|
||||||
return String("reqId", req.Header.Get("X-Request-ID"))
|
With(String("target", target))
|
||||||
}
|
}
|
||||||
|
|
||||||
func Debug(msg string, fields ...Field) { std.Debug(msg, fields...) }
|
func Debug(msg string, fields ...Field) { std.Debug(msg, fields...) }
|
||||||
|
@ -36,10 +36,27 @@ func outer() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestLogToFile(t *testing.T) {
|
func TestLogToFile(t *testing.T) {
|
||||||
log := logger.New(logger.NewProductionRotateBySize("./var/log/test.log"), logger.DebugLevel)
|
log := logger.New(logger.NewRotateBySize("./var/log/test.log"), logger.DebugLevel)
|
||||||
defer log.Sync()
|
defer log.Sync()
|
||||||
gtest.NotNil(t, logger.Default())
|
gtest.NotNil(t, logger.Default())
|
||||||
err := outer()
|
err := outer()
|
||||||
log.Error("hello world", logger.Any("err", err))
|
log.Error("hello world", logger.Any("err", err))
|
||||||
log.Info("中华人民共和国")
|
log.Info("info1 中华人民共和国")
|
||||||
|
log.Debug("debug1 中华人民共和国")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestProdLog(t *testing.T) {
|
||||||
|
log := logger.New(logger.NewRotateBySize("./var/log/test.log"), logger.InfoLevel)
|
||||||
|
defer log.Sync()
|
||||||
|
log.Info("info2 中华人民共和国")
|
||||||
|
log.Debug("debug2 应该没有")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWithGlobalField(t *testing.T) {
|
||||||
|
log := logger.New(logger.NewRotateBySize("./var/log/test.log"), logger.DebugLevel)
|
||||||
|
defer log.Sync()
|
||||||
|
logger.With(logger.String("reqId", "foo_IDD"))
|
||||||
|
log.Debug("debug3 中华人民共和国")
|
||||||
|
logger.With(logger.String("reqId", "bar_IID"))
|
||||||
|
log.Debug("debug3 救民于水火")
|
||||||
}
|
}
|
||||||
|
@ -32,16 +32,16 @@ type RotateConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewProductionRotateByTime 创建按时间轮转的 io.Writer
|
// NewProductionRotateByTime 创建按时间轮转的 io.Writer
|
||||||
func NewProductionRotateByTime(filename string) io.Writer {
|
func NewRotateByTime(filename string) io.Writer {
|
||||||
return NewRotateByTime(NewProductionRotateConfig(filename))
|
return RotateByTime(NewRotateConfig(filename))
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewProductionRotateBySize 创建按大小轮转的 io.Writer
|
// NewProductionRotateBySize 创建按大小轮转的 io.Writer
|
||||||
func NewProductionRotateBySize(filename string) io.Writer {
|
func NewRotateBySize(filename string) io.Writer {
|
||||||
return NewRotateBySize(NewProductionRotateConfig(filename))
|
return RotateBySize(NewRotateConfig(filename))
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewProductionRotateConfig(filename string) *RotateConfig {
|
func NewRotateConfig(filename string) *RotateConfig {
|
||||||
return &RotateConfig{
|
return &RotateConfig{
|
||||||
Filename: filename,
|
Filename: filename,
|
||||||
MaxAge: 30, // 日志保留 30 天
|
MaxAge: 30, // 日志保留 30 天
|
||||||
@ -55,7 +55,7 @@ func NewProductionRotateConfig(filename string) *RotateConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRotateByTime(cfg *RotateConfig) io.Writer {
|
func RotateByTime(cfg *RotateConfig) io.Writer {
|
||||||
opts := []rotatelogs.Option{
|
opts := []rotatelogs.Option{
|
||||||
rotatelogs.WithMaxAge(time.Duration(cfg.MaxAge) * time.Hour * 24),
|
rotatelogs.WithMaxAge(time.Duration(cfg.MaxAge) * time.Hour * 24),
|
||||||
rotatelogs.WithRotationTime(cfg.RotationTime),
|
rotatelogs.WithRotationTime(cfg.RotationTime),
|
||||||
@ -72,7 +72,7 @@ func NewRotateByTime(cfg *RotateConfig) io.Writer {
|
|||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRotateBySize(cfg *RotateConfig) io.Writer {
|
func RotateBySize(cfg *RotateConfig) io.Writer {
|
||||||
return &lumberjack.Logger{
|
return &lumberjack.Logger{
|
||||||
Filename: cfg.Filename,
|
Filename: cfg.Filename,
|
||||||
MaxSize: cfg.MaxSize,
|
MaxSize: cfg.MaxSize,
|
||||||
|
Loading…
Reference in New Issue
Block a user