messages:

- [feat] nazalog: 新增日志级别LevelTrace,目前已有trace, debug, info, warn, error, fatal, panic
- [feat] nazalog: 新增日志级别LevelNothing,初始化成这个级别的Logger,不会打印任何内容
- [feat] nazalog: 提供一个Logger实例DummyLogger,该实例不打印任何内容
- [feat] nazalog: 新增SetGlobalLogger,业务方可以设置替换全局Logger
- [feat] nazalog: 新增GetGlobalLogger,业务方可以获取全局Logger,比如将全局Logger赋值给其他Logger使用
pull/2/head
q191201771 4 years ago
parent 330a917da4
commit 4ce7763275

1
.gitignore vendored

@ -1,3 +1,4 @@
/pkg/websocket
/pkg/nazabytes/
/pkg/tag
/pkg/nazatime

@ -0,0 +1,17 @@
// Copyright 2021, Chef. All rights reserved.
// https://github.com/q191201771/naza
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package nazalog
var DummyLogger Logger
func init() {
DummyLogger, _ = New(func(option *Option) {
option.Level = LevelLogNothing
})
}

@ -16,7 +16,11 @@ import (
"github.com/q191201771/naza/pkg/fake"
)
var global *logger
var global Logger
func Tracef(format string, v ...interface{}) {
global.Out(LevelTrace, 2, fmt.Sprintf(format, v...))
}
func Debugf(format string, v ...interface{}) {
global.Out(LevelDebug, 2, fmt.Sprintf(format, v...))
@ -44,6 +48,10 @@ func Panicf(format string, v ...interface{}) {
panic(fmt.Sprintf(format, v...))
}
func Trace(v ...interface{}) {
global.Out(LevelTrace, 2, fmt.Sprint(v...))
}
func Debug(v ...interface{}) {
global.Out(LevelDebug, 2, fmt.Sprint(v...))
}
@ -97,7 +105,7 @@ func Panicln(v ...interface{}) {
func Assert(expected interface{}, actual interface{}) {
if !nazareflect.Equal(expected, actual) {
err := fmt.Sprintf("assert failed. excepted=%+v, but actual=%+v", expected, actual)
switch global.core.option.AssertBehavior {
switch global.GetOption().AssertBehavior {
case AssertError:
global.Out(LevelError, 2, err)
case AssertFatal:
@ -122,7 +130,24 @@ func WithPrefix(s string) Logger {
return global.WithPrefix(s)
}
// 这里不加锁保护如果要调用Init函数初始化全局的Logger那么由调用方保证调用Init函数时不会并发调用全局Logger的其他方法
func GetOption() Option {
return global.GetOption()
}
// -------------------------------------------------------------------------------------------------
// 这些设置全局Logger的函数没有加锁由调用方保证调用Init、SetGlobalLogger函数时不会并发调用全局Logger的其他方法
// 也即最好在程序启动时配置
func SetGlobalLogger(l Logger) {
global = l
}
func GetGlobalLogger() Logger {
return global
}
// 初始化全局Logger
func Init(modOptions ...ModOption) error {
var err error
global, err = newLogger(modOptions...)

@ -17,9 +17,9 @@ import "errors"
// * 可选输出至控制台或文件,也可以同时输出
// * 日志文件支持按天翻转
// * 支持是否输出源码文件及行号
// * 业务日志其实位置固定,方便查看
// * 业务日志起始位置固定,方便查看
// * 支持Assert断言失败后的行为可配置
// * 支持全局日志对象,独立日志对象
// * 支持全局日志对象,独立日志对象,日志对象都可以配置,相互间可以赋值
// * 支持设置前缀并且前缀可叠加使得可以按repo package对象等维度添加不同的前缀
// * 支持标准库中的打印接口函数(但是没有适配非打印接口),方便替换标准库日志
// * 日志文件目录不存在则自动创建
@ -29,6 +29,7 @@ import "errors"
var ErrLog = errors.New("naza.log:fxxk")
type Logger interface {
Tracef(format string, v ...interface{})
Debugf(format string, v ...interface{})
Infof(format string, v ...interface{})
Warnf(format string, v ...interface{})
@ -36,6 +37,7 @@ type Logger interface {
Fatalf(format string, v ...interface{}) // 打印日志并退出程序
Panicf(format string, v ...interface{})
Trace(v ...interface{})
Debug(v ...interface{})
Info(v ...interface{})
Warn(v ...interface{})
@ -62,6 +64,9 @@ type Logger interface {
Println(v ...interface{})
Fatalln(v ...interface{})
Panicln(v ...interface{})
// 获取配置项,注意,作用是只读,非修改配置
GetOption() Option
}
type Option struct {
@ -98,17 +103,20 @@ var defaultOption = Option{
type Level uint8
const (
_ Level = iota
LevelDebug // 1
LevelTrace Level = iota // 0
LevelDebug // 1
LevelInfo
LevelWarn
LevelError
LevelFatal
LevelPanic
LevelLogNothing
)
func (l Level) ReadableString() string {
switch l {
case LevelTrace:
return "LevelTrace"
case LevelDebug:
return "LevelDebug"
case LevelInfo:
@ -121,6 +129,8 @@ func (l Level) ReadableString() string {
return "LevelFatal"
case LevelPanic:
return "LevelPanic"
case LevelLogNothing:
return "LevelLogNothing"
default:
return "unknown"
}

@ -25,6 +25,7 @@ import (
var _ Logger = new(logger)
const (
levelTraceString = "TRACE "
levelDebugString = "DEBUG "
levelInfoString = " INFO "
levelWarnString = " WARN "
@ -32,7 +33,8 @@ const (
levelFatalString = "FATAL "
levelPanicString = "PANIC "
levelDebugColorString = "\033[22;37mDEBUG\033[0m "
levelTraceColorString = "\033[22;32mTRACE\033[0m "
levelDebugColorString = "\033[22;34mDEBUG\033[0m "
levelInfoColorString = "\033[22;36m INFO\033[0m "
levelWarnColorString = "\033[22;33m WARN\033[0m "
levelErrorColorString = "\033[22;31mERROR\033[0m "
@ -42,6 +44,7 @@ const (
var (
levelToString = map[Level]string{
LevelTrace: levelTraceString,
LevelDebug: levelDebugString,
LevelInfo: levelInfoString,
LevelWarn: levelWarnString,
@ -50,6 +53,7 @@ var (
LevelPanic: levelPanicString,
}
levelToColorString = map[Level]string{
LevelTrace: levelTraceColorString,
LevelDebug: levelDebugColorString,
LevelInfo: levelInfoColorString,
LevelWarn: levelWarnColorString,
@ -74,6 +78,10 @@ type core struct {
currRoundTime time.Time
}
func (l *logger) Tracef(format string, v ...interface{}) {
l.Out(LevelTrace, 2, fmt.Sprintf(format, v...))
}
func (l *logger) Debugf(format string, v ...interface{}) {
l.Out(LevelDebug, 2, fmt.Sprintf(format, v...))
}
@ -100,6 +108,10 @@ func (l *logger) Panicf(format string, v ...interface{}) {
panic(fmt.Sprintf(format, v...))
}
func (l *logger) Trace(v ...interface{}) {
l.Out(LevelTrace, 2, fmt.Sprint(v...))
}
func (l *logger) Debug(v ...interface{}) {
l.Out(LevelDebug, 2, fmt.Sprint(v...))
}
@ -283,6 +295,10 @@ func (l *logger) WithPrefix(s string) Logger {
return ll
}
func (l *logger) GetOption() Option {
return l.core.option
}
func newLogger(modOptions ...ModOption) (*logger, error) {
var err error
@ -317,7 +333,7 @@ func newLogger(modOptions ...ModOption) (*logger, error) {
}
func validate(option Option) error {
if option.Level < LevelDebug || option.Level > LevelPanic {
if option.Level < LevelTrace || option.Level > LevelLogNothing {
return ErrLog
}
if option.AssertBehavior < AssertError || option.AssertBehavior > AssertPanic {

@ -34,10 +34,12 @@ func TestLogger(t *testing.T) {
assert.Equal(t, nil, err)
buf := []byte("1234567890987654321")
l.Error(hex.Dump(buf))
l.Tracef("l test msg by Trace%s", "f")
l.Debugf("l test msg by Debug%s", "f")
l.Infof("l test msg by Info%s", "f")
l.Warnf("l test msg by Warn%s", "f")
l.Errorf("l test msg by Error%s", "f")
l.Trace("l test msg by Trace")
l.Debug("l test msg by Debug")
l.Info("l test msg by Info")
l.Warn("l test msg by Warn")
@ -52,10 +54,12 @@ func TestLogger(t *testing.T) {
func TestGlobal(t *testing.T) {
buf := []byte("1234567890987654321")
nazalog.Error(hex.Dump(buf))
nazalog.Tracef("g test msg by Trace%s", "f")
nazalog.Debugf("g test msg by Debug%s", "f")
nazalog.Infof("g test msg by Info%s", "f")
nazalog.Warnf("g test msg by Warn%s", "f")
nazalog.Errorf("g test msg by Error%s", "f")
nazalog.Trace("g test msg by Trace")
nazalog.Debug("g test msg by Debug")
nazalog.Info("g test msg by Info")
nazalog.Warn("g test msg by Warn")
@ -68,10 +72,12 @@ func TestGlobal(t *testing.T) {
})
assert.Equal(t, nil, err)
nazalog.Tracef("gc test msg by Trace%s", "f")
nazalog.Debugf("gc test msg by Debug%s", "f")
nazalog.Infof("gc test msg by Info%s", "f")
nazalog.Warnf("gc test msg by Warn%s", "f")
nazalog.Errorf("gc test msg by Error%s", "f")
nazalog.Trace("gc test msg by Trace")
nazalog.Debug("gc test msg by Debug")
nazalog.Info("gc test msg by Info")
nazalog.Warn("gc test msg by Warn")
@ -90,7 +96,7 @@ func TestNew(t *testing.T) {
err error
)
l, err = nazalog.New(func(option *nazalog.Option) {
option.Level = nazalog.LevelPanic + 1
option.Level = nazalog.LevelLogNothing + 1
})
assert.Equal(t, nil, l)
assert.Equal(t, nazalog.ErrLog, err)
@ -329,12 +335,14 @@ func TestFieldFlag(t *testing.T) {
}
func TestReadableString(t *testing.T) {
assert.Equal(t, "LevelTrace", nazalog.LevelTrace.ReadableString())
assert.Equal(t, "LevelDebug", nazalog.LevelDebug.ReadableString())
assert.Equal(t, "LevelInfo", nazalog.LevelInfo.ReadableString())
assert.Equal(t, "LevelWarn", nazalog.LevelWarn.ReadableString())
assert.Equal(t, "LevelError", nazalog.LevelError.ReadableString())
assert.Equal(t, "LevelFatal", nazalog.LevelFatal.ReadableString())
assert.Equal(t, "LevelPanic", nazalog.LevelPanic.ReadableString())
assert.Equal(t, "LevelLogNothing", nazalog.LevelLogNothing.ReadableString())
assert.Equal(t, "unknown", nazalog.Level(100).ReadableString())
assert.Equal(t, "AssertError", nazalog.AssertError.ReadableString())
@ -343,6 +351,44 @@ func TestReadableString(t *testing.T) {
assert.Equal(t, "unknown", nazalog.AssertBehavior(100).ReadableString())
}
func TestLevel(t *testing.T) {
var l nazalog.Logger
l, _ = nazalog.New(func(option *nazalog.Option) {
option.Level = nazalog.LevelTrace
})
l.Trace("log by trace")
l.Debug("log by debug")
l.Info("log by info")
l.Warn("log by warn")
l.Error("log by error")
}
func TestModGlobal(t *testing.T) {
l, _ := nazalog.New(func(option *nazalog.Option) {
option.Level = nazalog.LevelInfo
})
nazalog.SetGlobalLogger(l)
nazalog.Debug("a")
nazalog.Info("b")
l = nazalog.GetGlobalLogger()
l.Debug("c")
l.Info("d")
}
func TestLogger_GetOption(t *testing.T) {
l, _ := nazalog.New(func(option *nazalog.Option) {
option.Level = nazalog.LevelDebug
})
o := l.GetOption()
assert.Equal(t, nazalog.LevelDebug, o.Level)
_ = nazalog.Init(func(option *nazalog.Option) {
option.Level = nazalog.LevelDebug
})
o = nazalog.GetOption()
assert.Equal(t, nazalog.LevelDebug, o.Level)
}
func BenchmarkNazaLog(b *testing.B) {
b.ReportAllocs()

Loading…
Cancel
Save