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
138 lines
2.9 KiB
Go
4 weeks ago
|
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))
|
||
|
}
|