基于gin框架构建了一个web应用
并且引入了logrus来写日志
package logger
import (
"log"
"os"
"runtime"
"quanzi/service/setting"
"github.com/sirupsen/logrus"
)
type P map[string]interface{}
var Logger = logrus.New()
func init() {
//打开日志文件
file, err := os.OpenFile(setting.LogConf.Path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatalln("open log file err, file path:", setting.LogConf.Path, ",err:", err)
}
//修改日志的输出方式
Logger.Out = file
//设置日志格式为json
Logger.Formatter = &logrus.JSONFormatter{}
}
func Info(msg string, err error, params map[string]interface{}) {
fields := formatLog(err, params)
Logger.WithFields(fields).Info(msg)
}
func Debug(msg string, err error, params map[string]interface{}) {
fields := formatLog(err, params)
Logger.WithFields(fields).Debug(msg)
}
func Error(msg string, err error, params map[string]interface{}) {
fields := formatLog(err, params)
Logger.WithFields(fields).Error(msg)
}
func Fatal(msg string, err error, params map[string]interface{}) {
fields := formatLog(err, params)
Logger.WithFields(fields).Fatal(msg)
}
/**
* 为日志字段增加文件和行号
*/
func formatLog(err error, params map[string]interface{}) logrus.Fields {
_, file, line, ok := runtime.Caller(2)
if !ok {
log.Fatalln("runtime caller err")
}
var fields = logrus.Fields{
"file": file,
"line": line,
"error": err,
"params": params,
}
return fields
}
我是在这个包的init方法中,打开日志文件的文件句柄,并传递给logger,让日志写入文件
但是我不知道应该什么时候关闭这个文件句柄
还是这种方法就错了?因为我发现只有这个web应用启动,我就没办法删除或修改这个日志文件,这和nginx的日志好像不一样
我是不是应该在写入的时候,再打开文件句柄,写完了再关闭文件句柄?
可是我觉得这样不是很好,因为这是一个常驻进程,每次写入都要打开关闭不是很浪费资源吗?不应该是一直打开文件句柄,然后写入吗?
这种常驻进程,日志是如何写的?文件句柄是一直打开?还是写的时候打开,写完了关闭?
求大神指点
资源的释放一般发生在不需要使用这个资源的时候,给定
struct
赋值特定的字段绑定到该资源,在资源结束的时候调用 Close 方法去关闭该资源,