[feat] nazalog: 增加Init接口函数

pull/5/head
q191201771 3 years ago
parent 0582391149
commit 3f9c8992f2

@ -139,26 +139,35 @@ func GetOption() Option {
return global.GetOption()
}
// -------------------------------------------------------------------------------------------------
// 这些设置全局Logger的函数没有加锁由调用方保证调用Init、SetGlobalLogger函数时不会并发调用全局Logger的其他方法
// 也即最好在程序启动时配置
func SetGlobalLogger(l Logger) {
global = l
}
// ---------------------------------------------------------------------------------------------------------------------
// GetGlobalLogger 获取全局Logger
//
func GetGlobalLogger() Logger {
return global
}
// 初始化全局Logger
// Init 初始化全局Logger
//
// 注意全局Logger在不需要特殊配置时可以不显示调用 Init 函数
// 注意该方法不会修改global指针指向而是操作global指针指向的对象
//
func Init(modOptions ...ModOption) error {
var err error
global, err = newLogger(modOptions...)
return err
return global.Init(modOptions...)
}
// SetGlobalLogger 更换全局Logger
//
// 注意,更换后,之前调用 GetGlobalLogger 获取的全局Logger和当前的全局Logger将是两个对象
//
// TODO(chef): [refactor] 在已经提供 Init 的前提下,是否应该删除掉该函数
//
func SetGlobalLogger(l Logger) {
global = l
}
// ---------------------------------------------------------------------------------------------------------------------
func init() {
_ = Init()
global, _ = newLogger()
}

@ -58,13 +58,16 @@ type Logger interface {
//
Assert(expected interface{}, actual interface{}, extInfo ...string)
// flush to disk, typically
// Sync flush to disk, typically
//
Sync()
// 添加前缀新生成一个Logger对象如果老Logger也有prefix则老Logger依然打印老prefix新Logger打印多个prefix
// WithPrefix 添加前缀新生成一个Logger对象如果老Logger也有prefix则老Logger依然打印老prefix新Logger打印多个prefix
//
WithPrefix(s string) Logger
// 下面这些打印接口是为兼容标准库让某些已使用标准库日志的代码替换到nazalog方便一些
// Output Print ... 下面这些打印接口是为兼容标准库让某些已使用标准库日志的代码替换到nazalog方便一些
//
Output(calldepth int, s string) error
Print(v ...interface{})
Printf(format string, v ...interface{})
@ -72,8 +75,18 @@ type Logger interface {
Fatalln(v ...interface{})
Panicln(v ...interface{})
// 获取配置项,注意,作用是只读,非修改配置
// GetOption 获取配置项
//
// 注意,作用是只读,非修改配置
//
GetOption() Option
// Init 初始化配置
//
// 注意,正常情况下,应在调用 New 函数生成Logger对象时进行配置 Init 方法提供了在已有Logger对象上配置的机会
// 但是出于性能考虑操作logger对象内部成员时没有加锁调用方需自行保证该函数不和其他函数并发调用也即在使用Logger对象前比如程序启动时)
//
Init(modOptions ...ModOption) error
}
type Option struct {

@ -80,7 +80,7 @@ type core struct {
m sync.Mutex
fp *os.File
console *os.File
buf bytes.Buffer
buf bytes.Buffer // TODO(chef): [refactor] 是否需要使用nazabytes.Buffer
currRoundTime time.Time
}
@ -315,36 +315,44 @@ func (l *logger) GetOption() Option {
return l.core.option
}
func newLogger(modOptions ...ModOption) (*logger, error) {
func (l *logger) Init(modOptions ...ModOption) error {
var err error
l := &logger{
core: &core{
currRoundTime: time.Now(),
},
}
l.core.currRoundTime = time.Now()
l.core.option = defaultOption
for _, fn := range modOptions {
fn(&l.core.option)
}
if err := validate(l.core.option); err != nil {
return nil, err
if err = validate(l.core.option); err != nil {
return err
}
if l.core.option.Filename != "" {
dir := filepath.Dir(l.core.option.Filename)
if err = os.MkdirAll(dir, 0777); err != nil {
return nil, err
return err
}
if l.core.fp, err = os.OpenFile(l.core.option.Filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666); err != nil {
return nil, err
return err
}
}
if l.core.option.IsToStdout {
l.core.console = os.Stdout
}
return nil
}
// ---------------------------------------------------------------------------------------------------------------------
func newLogger(modOptions ...ModOption) (*logger, error) {
l := &logger{
core: &core{},
}
if err := l.Init(modOptions...); err != nil {
return nil, err
}
return l, nil
}

Loading…
Cancel
Save