10 Commits

Author SHA1 Message Date
4c129271a5 update at 2019-11-11 10:30:05 by ehlxr 2019-11-11 10:30:05 +08:00
5820e0ded2 update at 2019-11-11 10:28:56 by ehlxr 2019-11-11 10:28:56 +08:00
119fee49af update at 2019-11-11 09:32:36 by ehlxr 2019-11-11 09:32:36 +08:00
a2a63aebee release v0.0.4 2019-11-08 18:18:03 +08:00
8dcedb0ce7 release v0.0.4 2019-11-08 17:45:09 +08:00
b3fbc466f1 add rotating log files daily feature; add file log config 2019-11-07 17:04:36 +08:00
911f959018 update at 2019-11-06 13:45:39 by ehlxr 2019-11-06 13:45:39 +08:00
ae2bfef999 release v0.0.2 2019-11-06 10:15:22 +08:00
98605355bb add log test 2019-11-06 10:12:49 +08:00
9712dbfd2c add log test 2019-11-06 10:11:12 +08:00
9 changed files with 120 additions and 66 deletions

4
.gitignore vendored
View File

@@ -1,2 +1,4 @@
.vscode
go.sum
go.sum
/.idea/
logs

View File

@@ -6,16 +6,14 @@ import (
"log"
"os"
"syscall"
"github.com/pkg/errors"
)
// CrashLog set crash log
func CrashLog(file string) {
// NewCrashLog set crash log
func NewCrashLog(file string) {
f, err := os.OpenFile(file, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("open crash log file error. %v", errors.WithStack(err))
log.Fatalf("open crash log file error. %v", err)
} else {
syscall.Dup2(int(f.Fd()), 2)
_ = syscall.Dup2(int(f.Fd()), 2)
}
}

View File

@@ -6,16 +6,14 @@ import (
"log"
"os"
"syscall"
"github.com/pkg/errors"
)
// CrashLog set crash log
func CrashLog(file string) {
// NewCrashLog set crash log
func NewCrashLog(file string) {
f, err := os.OpenFile(file, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("open crash log file error. %v", errors.WithStack(err))
log.Fatalf("open crash log file error. %v", err)
} else {
syscall.Dup3(int(f.Fd()), 2, 0)
_ = syscall.Dup3(int(f.Fd()), 2, 0)
}
}

View File

@@ -6,8 +6,6 @@ import (
"log"
"os"
"syscall"
"github.com/pkg/errors"
)
var (
@@ -26,15 +24,15 @@ func setStdHandle(stdhandle int32, handle syscall.Handle) error {
return nil
}
// CrashLog set crash log
func CrashLog(file string) {
// NewCrashLog set crash log
func NewCrashLog(file string) {
f, err := os.OpenFile(file, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Println(err.Error())
} else {
err = setStdHandle(syscall.STD_ERROR_HANDLE, syscall.Handle(f.Fd()))
if err != nil {
log.Fatalf("open crash log file error. %v", errors.WithStack(err))
log.Fatalf("open crash log file error. %v", err)
}
}
}

View File

@@ -88,7 +88,7 @@ func (enc textEncoder) EncodeEntry(ent zapcore.Entry, fields []zapcore.Field) (*
// if i > 0 {
// line.AppendByte('\t')
// }
fmt.Fprint(line, arr.elems[i])
_, _ = fmt.Fprint(line, arr.elems[i])
}
putSliceEncoder(arr)
@@ -129,7 +129,7 @@ func (enc textEncoder) writeContext(line *buffer.Buffer, extra []zapcore.Field)
// c.addTabIfNecessary(line)
line.AppendByte('{')
line.Write(context.buf.Bytes())
_, _ = line.Write(context.buf.Bytes())
line.AppendByte('}')
}
@@ -185,6 +185,8 @@ func (enc *textEncoder) AddBool(key string, val bool) {
enc.addElementSeparator()
enc.buf.AppendBool(val)
}
//noinspection GoRedundantConversion
func (enc *textEncoder) AddComplex128(key string, val complex128) {
enc.addKey(key)
enc.addElementSeparator()
@@ -260,6 +262,8 @@ func (enc *textEncoder) AddUint64(key string, val uint64) {
enc.addElementSeparator()
enc.buf.AppendUint(val)
}
//noinspection GoRedundantConversion
func (enc *textEncoder) AddComplex64(k string, v complex64) { enc.AddComplex128(k, complex128(v)) }
func (enc *textEncoder) AddFloat32(k string, v float32) { enc.AddFloat64(k, float64(v)) }
func (enc *textEncoder) AddInt(k string, v int) { enc.AddInt64(k, int64(v)) }
@@ -274,7 +278,7 @@ func (enc *textEncoder) AddUintptr(k string, v uintptr) { enc.AddUint64(k, u
func (enc *textEncoder) Clone() zapcore.Encoder {
clone := enc.clone()
clone.buf.Write(enc.buf.Bytes())
_, _ = clone.buf.Write(enc.buf.Bytes())
return clone
}
@@ -355,7 +359,7 @@ func (enc *textEncoder) safeAddByteString(s []byte) {
i++
continue
}
enc.buf.Write(s[i : i+size])
_, _ = enc.buf.Write(s[i : i+size])
i += size
}
}

5
go.mod
View File

@@ -3,8 +3,7 @@ module github.com/ehlxr/log
go 1.13
require (
github.com/ehlxr/logger v0.0.0-20191105075740-0235eee42e0f
github.com/pkg/errors v0.8.1
github.com/ehlxr/lumberjack v0.0.1
github.com/robfig/cron/v3 v3.0.0
go.uber.org/zap v1.12.0
gopkg.in/natefinch/lumberjack.v2 v2.0.0
)

98
log.go
View File

@@ -2,20 +2,19 @@ package log
import (
"fmt"
"github.com/ehlxr/lumberjack"
"log"
"os"
"path"
"strings"
"time"
"github.com/ehlxr/log/encoder"
"github.com/ehlxr/log/bufferpool"
"github.com/ehlxr/log/crash"
"github.com/pkg/errors"
"github.com/ehlxr/log/encoder"
"github.com/robfig/cron/v3"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
var logger *zap.SugaredLogger
@@ -32,10 +31,9 @@ const (
type logConfig struct {
Level zapcore.Level
FilePath string
EnableColors bool
CrashLogPath string
ErrorLogPath string
CrashLogFilename string
ErrorLogFilename string
EnableLineNumber bool
// enable the truncation of the level text to 4 characters.
@@ -45,21 +43,15 @@ type logConfig struct {
EnableCapitalLevel bool
atomicLevel zap.AtomicLevel
Name string
*lumberjack.Logger
}
func init() {
lc := &logConfig{
Level: InfoLevel,
FilePath: "",
EnableColors: false,
CrashLogPath: "",
ErrorLogPath: "",
EnableLineNumber: false,
EnableLevelTruncation: false,
EnableErrorStacktrace: false,
TimestampFormat: "",
EnableCapitalLevel: false,
Name: "",
Logger: &lumberjack.Logger{
LocalTime: true,
},
}
logger = lc.newLogger().Sugar()
@@ -72,21 +64,29 @@ func (lc *logConfig) Init() {
func NewLogConfig() *logConfig {
return &logConfig{
Level: DebugLevel,
FilePath: "./log/",
EnableColors: true,
CrashLogPath: "./log/crash.log",
ErrorLogPath: "./log/error_",
CrashLogFilename: "./logs/crash.log",
ErrorLogFilename: "./logs/error.log",
EnableLineNumber: true,
EnableLevelTruncation: true,
EnableErrorStacktrace: true,
TimestampFormat: "2006-01-02 15:04:05.000",
EnableCapitalLevel: true,
Logger: &lumberjack.Logger{
Filename: "./logs/log.log",
MaxSize: 200,
MaxAge: 0,
MaxBackups: 30,
LocalTime: true,
Compress: false,
BackupTimeFormat: "2006-01-02",
},
}
}
func (lc *logConfig) newLogger() *zap.Logger {
if lc.CrashLogPath != "" {
writeCrashLog(lc.CrashLogPath)
if lc.CrashLogFilename != "" {
writeCrashLog(lc.CrashLogFilename)
}
lc.atomicLevel = zap.NewAtomicLevelAt(lc.Level)
@@ -99,11 +99,11 @@ func (lc *logConfig) newLogger() *zap.Logger {
lc.atomicLevel,
)}
if lc.FilePath != "" {
if lc.Filename != "" {
cores = append(cores, lc.fileCore())
}
if lc.ErrorLogPath != "" {
if lc.ErrorLogFilename != "" {
cores = append(cores, lc.errorFileCore())
}
@@ -164,7 +164,7 @@ func (lc *logConfig) fileCore() zapcore.Core {
// zapcore.Lock(os.Stdout),
// lc.fileWriteSyncer(),
// ),
fileWriteSyncer(lc.FilePath),
lc.fileWriteSyncer(lc.Filename),
lc.atomicLevel,
)
}
@@ -173,7 +173,7 @@ func (lc *logConfig) errorFileCore() zapcore.Core {
return zapcore.NewCore(
encoder.NewTextEncoder(lc.encoderConfig()),
fileWriteSyncer(lc.ErrorLogPath),
lc.fileWriteSyncer(lc.ErrorLogFilename),
zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.ErrorLevel
}),
@@ -219,28 +219,46 @@ func trimCallerFilePath(ec zapcore.EntryCaller) string {
return fmt.Sprintf(" %s", caller)
}
func fileWriteSyncer(name string) zapcore.WriteSyncer {
fileName := fmt.Sprintf("%s%s.log",
name,
time.Now().Format("2006-01-02"))
func (lc *logConfig) fileWriteSyncer(fileName string) zapcore.WriteSyncer {
// go get github.com/lestrrat-go/file-rotatelogs
// writer, err := rotatelogs.New(
// name+".%Y%m%d",
// rotatelogs.WithLinkName(name), // 生成软链,指向最新日志文件
// rotatelogs.WithMaxAge(7*24*time.Hour), // 文件最大保存时间
// rotatelogs.WithRotationTime(24*time.Hour), // 日志切割时间间隔
// )
// if err != nil {
// log.Fatalf("config normal logger file error. %v", errors.WithStack(err))
// }
return zapcore.AddSync(&lumberjack.Logger{
Filename: fileName,
MaxSize: 500, // 单个日志文件大小MB
MaxBackups: 10,
MaxAge: 30, // 保留多少天的日志
LocalTime: true,
Compress: true,
writer := &lumberjack.Logger{
Filename: fileName,
MaxSize: lc.MaxSize, // 单个日志文件大小MB
MaxBackups: lc.MaxBackups,
MaxAge: lc.MaxAge, // 保留多少天的日志
LocalTime: lc.LocalTime,
Compress: lc.Compress,
BackupTimeFormat: lc.BackupTimeFormat,
}
// Rotating log files daily
runner := cron.New(cron.WithSeconds(), cron.WithLocation(time.Local))
_, _ = runner.AddFunc("0 0 0 * * ?", func() {
_ = writer.Rotate(time.Now().AddDate(0, 0, -1))
})
go runner.Run()
return zapcore.AddSync(writer)
}
func writeCrashLog(file string) {
err := os.MkdirAll(path.Dir(file), os.ModePerm)
if err != nil {
log.Fatalf("make crash log dir error. %v", errors.WithStack(err))
log.Fatalf("make crash log dir error. %v",
err)
}
crash.CrashLog(file)
crash.NewCrashLog(file)
}
func Fields(args ...interface{}) {

37
log_test.go Normal file
View File

@@ -0,0 +1,37 @@
package log
import (
"testing"
"time"
)
func TestLog(t *testing.T) {
Debugf("this is %s message", "debug")
Infof("this is %s message", "info")
Errorf("this is %s message", "error")
// Panicf("this is %s message", "panic")
}
func TestLogWithConfig(t *testing.T) {
lc := NewLogConfig()
_ = lc.Level.Set("info")
lc.Name = "main"
lc.Init()
Debugf("this is %s message", "debug")
Infof("this is %s message", "info")
Errorf("this is %s message", "error")
// Panicf("this is %s message", "panic")
}
func TestLogRote(t *testing.T) {
lc := NewLogConfig()
lc.MaxSize = 1
lc.Init()
for {
Infof("this is %s message", "info")
time.Sleep(time.Millisecond * 1)
}
}

View File

@@ -1 +1 @@
v0.0.1
v0.0.5