You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
2.9 KiB
Go

package Common
import (
"bytes"
"errors"
"fmt"
"os"
"path/filepath"
"runtime"
"strconv"
"strings"
"time"
log "github.com/sirupsen/logrus"
)
// 日志自定义格式
type LogFormatter struct{}
// 格式详情
func (s *LogFormatter) Format(entry *log.Entry) ([]byte, error) {
defer func() {
if r := recover(); r != nil {
log.Error("Format:", r)
}
}()
timestamp := time.Now().Local().Format("2006-01-02 15:04:05")
var file string
var len int
if entry.Caller != nil {
file = filepath.Base(entry.Caller.File)
len = entry.Caller.Line
}
//fmt.Println(entry.Data)
msg := fmt.Sprintf("[-%s-] [-%s-] [-%s:%d-][-GOID:%d-][-%s-] [-%s-] \n", timestamp, "--", file, len, getGID(), strings.ToUpper(entry.Level.String()), entry.Message)
return []byte(msg), nil
}
func getGID() uint64 {
defer func() {
if r := recover(); r != nil {
log.Error("getGID:", r)
}
}()
b := make([]byte, 64)
b = b[:runtime.Stack(b, false)]
b = bytes.TrimPrefix(b, []byte("goroutine "))
b = b[:bytes.IndexByte(b, ' ')]
n, _ := strconv.ParseUint(string(b), 10, 64)
return n
}
type logFileWriter struct {
file *os.File
logPath string
fileDate string //判断日期切换目录
appName string
encoding string
}
func (p *logFileWriter) Write(data []byte) (n int, err error) {
defer func() {
if r := recover(); r != nil {
log.Error("Write:", r)
}
}()
if p == nil {
return 0, errors.New("logFileWriter is nil")
}
if p.file == nil {
return 0, errors.New("file not opened")
}
//判断是否需要切换日期
fileDate := time.Now().Format("20060102")
if p.fileDate != fileDate {
p.file.Close()
err = os.MkdirAll(fmt.Sprintf("%s/%s", p.logPath, fileDate), os.ModePerm)
if err != nil {
return 0, err
}
filename := fmt.Sprintf("%s/%s/%s-%s.log", p.logPath, fileDate, p.appName, fileDate)
p.file, err = os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE|os.O_SYNC, 0600)
if err != nil {
return 0, err
}
}
if p.encoding != "" {
dataToEncode := []byte(string(data))
// ConvertStringToByte(string(data), p.encoding)
n, e := p.file.Write(dataToEncode)
return n, e
}
n, e := p.file.Write(data)
return n, e
}
// 初始化日志
func InitLog(logPath string, appName string, encoding string) {
defer func() {
if r := recover(); r != nil {
log.Error("InitLog:", r)
}
}()
fileDate := time.Now().Format("20060102")
//创建目录
err := os.MkdirAll(fmt.Sprintf("%s/%s", logPath, fileDate), os.ModePerm)
if err != nil {
log.Error(err)
return
}
filename := fmt.Sprintf("%s/%s/%s-%s.log", logPath, fileDate, appName, fileDate)
file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE|os.O_SYNC, 0600)
if err != nil {
log.Error(err)
return
}
fileWriter := logFileWriter{file, logPath, fileDate, appName, encoding}
log.SetOutput(&fileWriter)
log.SetReportCaller(true)
log.SetFormatter(new(LogFormatter))
}