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)) }