代码小白一个,可能代码有多处漏洞,欢迎留言-
mian.go文件
func main() {
_, err := os.OpenFile("", os.O_RDWR, 0666)
//log.SetFile("./log/error.log")
log.Error("出错啦: ", err)
log.WriteReqError(errors.Wrap(err, "不小心出错了"), nil)
}
log.go文件
package log
import (
"fmt"
"github.com/gin-gonic/gin"
"os"
"sync"
"time"
)
const (
_ = iota
Level_Info
Level_Debug
Level_Error
Level_Warn
)
var wg sync.WaitGroup
var log *Log
func init() {
log = &Log{file: "./log/error.log"} // 默认日志文件路径
}
type Log struct {
file string
}
func Info(v ...interface{}) {
log.outPut(Level_Info, v...)
}
func Debug(v ...interface{}) {
log.outPut(Level_Debug, v...)
}
func Error(v ...interface{}) {
log.outPut(Level_Error, v...)
}
func Warn(v ...interface{}) {
log.outPut(Level_Warn, v...)
}
// SetFile 设置日志文件路径
func SetFile(file string) {
log.file = file
}
// WriteReqError 写入请求类日志
func WriteReqError(error error, c *gin.Context) {
log.requestPut(error, c)
}
func (l *Log) outPut(level int, v ...interface{}) {
wg.Add(1)
go func() {
defer wg.Done()
str := time.Now().Format("2006-01-02 15:04:05 [")
switch level {
case Level_Info:
str += "INFO"
break
case Level_Debug:
str += "DEBUG"
break
case Level_Error:
str += "ERROR"
break
case Level_Warn:
str += "WARN"
break
}
str += "] " + fmt.Sprint(v...) + "\n"
fmt.Print(str)
l.openFile(str)
}()
wg.Wait()
}
func (l *Log) requestPut(err error, c *gin.Context) {
wg.Add(1)
go func() {
defer wg.Done()
str := time.Now().Format("2006-01-02 15:04:05 [ERROR] ")
if c != nil {
str = fmt.Sprintf("%s\n请求地址:%s\n请求方式:%s\n请求ip:%s\n", str,
c.Request.RequestURI,
c.Request.Method,
c.ClientIP())
}
if err != nil {
str = fmt.Sprintf("%s%s\n", str, err)
}
fmt.Print(str)
l.openFile(str)
}()
wg.Wait()
}
func (l *Log) openFile(msg string) {
f, err := os.OpenFile(l.file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("日志文件打开失败:", err)
return
}
defer f.Close()
_, err = f.WriteString(msg)
if err != nil {
fmt.Println("文件写入失败:", err)
return
}
}
微信号: cloud-month ,欢迎一起学习交流技术问题