mirror of
https://gitee.com/shikong-sk/golang-study
synced 2025-02-22 23:12:15 +08:00
docs: 手动实现 simple log 日志库
This commit is contained in:
parent
11361a4dab
commit
cd1c2fe26d
3
simplelog/go.mod
Normal file
3
simplelog/go.mod
Normal file
@ -0,0 +1,3 @@
|
||||
module simplelog
|
||||
|
||||
go 1.16
|
148
simplelog/simplelog.go
Normal file
148
simplelog/simplelog.go
Normal file
@ -0,0 +1,148 @@
|
||||
package simplelog
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"runtime"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 自定义日志
|
||||
|
||||
type LogLevel struct {
|
||||
s string
|
||||
flag LevelFlag
|
||||
}
|
||||
|
||||
func (l LogLevel) String() string {
|
||||
return l.s
|
||||
}
|
||||
|
||||
type LevelFlag uint8
|
||||
|
||||
const (
|
||||
FlagInfo LevelFlag = 0x1
|
||||
FlagWarn LevelFlag = 0x2
|
||||
FlagError LevelFlag = 0x4
|
||||
FlagDebug LevelFlag = 0x8
|
||||
)
|
||||
|
||||
var (
|
||||
INFO = LogLevel{"INFO", FlagInfo}
|
||||
WARN = LogLevel{"WARN", FlagWarn}
|
||||
ERROR = LogLevel{"ERROR", FlagError}
|
||||
DEBUG = LogLevel{"DEBUG", FlagDebug}
|
||||
)
|
||||
|
||||
// Logger 日志类
|
||||
type Logger struct {
|
||||
w io.Writer
|
||||
timeFormat string
|
||||
loggerFormat string
|
||||
flag LevelFlag
|
||||
}
|
||||
|
||||
func (l *Logger) time() string {
|
||||
now := time.Now()
|
||||
return now.Format(l.timeFormat)
|
||||
}
|
||||
|
||||
func (l *Logger) PrintLog(level LogLevel, log string) {
|
||||
// 根据 flag 位 限制日志级别
|
||||
if l.flag&level.flag != level.flag {
|
||||
return
|
||||
}
|
||||
|
||||
pc, _, _, ok := runtime.Caller(2)
|
||||
var f *runtime.Func
|
||||
if ok {
|
||||
f = runtime.FuncForPC(pc)
|
||||
_, _ = fmt.Fprintf(l.w, l.loggerFormat, l.time(), level, pc, f.Name(), log)
|
||||
} else {
|
||||
_, _ = fmt.Fprintf(l.w, l.loggerFormat, l.time(), level, "--", "Unknown", log)
|
||||
}
|
||||
}
|
||||
|
||||
// Debug 调试输出
|
||||
func (l *Logger) Debug(log string) {
|
||||
l.PrintLog(DEBUG, log)
|
||||
}
|
||||
|
||||
// Info 消息输出
|
||||
func (l *Logger) Info(log string) {
|
||||
l.PrintLog(INFO, log)
|
||||
}
|
||||
|
||||
// Warn 消息输出
|
||||
func (l *Logger) Warn(log string) {
|
||||
l.PrintLog(WARN, log)
|
||||
}
|
||||
|
||||
// Error 消息输出
|
||||
func (l *Logger) Error(log string) {
|
||||
l.PrintLog(ERROR, log)
|
||||
}
|
||||
|
||||
// 函数式 选项模式
|
||||
|
||||
type Option struct {
|
||||
Writer io.Writer
|
||||
TimeFormat string
|
||||
LogFormat string
|
||||
LevelFlag LevelFlag
|
||||
}
|
||||
|
||||
type OptionFunc func(*Option)
|
||||
|
||||
func WithWriter(writer io.Writer) OptionFunc {
|
||||
return func(option *Option) {
|
||||
option.Writer = writer
|
||||
}
|
||||
}
|
||||
|
||||
func WithTimeFormat(timeFormat string) OptionFunc {
|
||||
return func(option *Option) {
|
||||
option.TimeFormat = timeFormat
|
||||
}
|
||||
}
|
||||
|
||||
func WithLogFormat(logFormat string) OptionFunc {
|
||||
return func(option *Option) {
|
||||
option.LogFormat = logFormat
|
||||
}
|
||||
}
|
||||
|
||||
func WithLogFlag(flag LevelFlag) OptionFunc {
|
||||
return func(option *Option) {
|
||||
option.LevelFlag = flag
|
||||
}
|
||||
}
|
||||
|
||||
// 默认参数
|
||||
var defaultOption = &Option{
|
||||
Writer: os.Stdout,
|
||||
TimeFormat: "2006-01-02 15:04:05.99",
|
||||
LogFormat: "%-23s %s %v --- [%20s] : %s\n",
|
||||
LevelFlag: FlagInfo | FlagWarn | FlagError | FlagDebug,
|
||||
}
|
||||
|
||||
func NewOption(opts ...OptionFunc) (opt *Option) {
|
||||
opt = defaultOption
|
||||
for _, o := range opts {
|
||||
o(opt)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// NewLog 构造函数
|
||||
func NewLog(opts ...OptionFunc) *Logger {
|
||||
opt := NewOption(opts...)
|
||||
|
||||
return &Logger{
|
||||
w: opt.Writer,
|
||||
timeFormat: opt.TimeFormat,
|
||||
loggerFormat: opt.LogFormat,
|
||||
flag: opt.LevelFlag,
|
||||
}
|
||||
}
|
35
simplelog/simplelog_test.go
Normal file
35
simplelog/simplelog_test.go
Normal file
@ -0,0 +1,35 @@
|
||||
package simplelog
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestLog(t *testing.T) {
|
||||
log := NewLog()
|
||||
|
||||
log2 := NewLog(
|
||||
WithWriter(os.Stdout),
|
||||
WithTimeFormat("2006-01-02"),
|
||||
WithLogFormat("%-10s %s %v %s =-=-> %s\n"),
|
||||
WithLogFlag(FlagInfo|FlagDebug),
|
||||
)
|
||||
|
||||
fmt.Printf("simpleLog => %#v\n", log)
|
||||
|
||||
fmt.Println("=========================================================")
|
||||
|
||||
for i := 0; i < 5; i++ {
|
||||
log.Debug("测试 Debug 输出")
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
}
|
||||
|
||||
fmt.Println("=========================================================")
|
||||
|
||||
for i := 0; i < 5; i++ {
|
||||
log2.Debug("测试 Debug 输出")
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user