Golang语言的 os 包中OpenFile 函数,如下所示:
func OpenFile(name string, flag int, perm FileMode) (*File, error) {}
其中 name 是文件的文件名,如果不是在当前路径下运行需要加上具体路径;flag 是文件的处理参数,为 int 类型,根据系统的不同具体值可能有所不同,但是作用是相同的。
- O_RDONLY:只读模式打开文件;
- O_WRONLY:只写模式打开文件;
- O_RDWR:读写模式打开文件;
- O_APPEND:写操作时将数据附加到文件尾部(追加);
- O_CREATE:如果不存在将创建一个新文件;
- O_EXCL:和 O_CREATE 配合使用,文件必须不存在,否则返回一个错误;
- O_SYNC:当进行一系列写操作时,每次都要等待上次的 I/O 操作完成再进行;
- O_TRUNC:如果可能,在打开时清空文件。
//自定义日志文件写入函数
/*
* dir 文件夹名字
* fileName 文件名字
* args 要写入的数据
*/
func Logger(dir string, fileName string, args ...interface{}) error {
var floderLog = "logs"
if fileName != "" {
floderLog = floderLog + "/" + dir
}
logName := floderLog + "/" + fileName + "_" + time.Now().Format("2006-01-02") + ".log"
if _, err := os.Stat(floderLog); err != nil {
if !os.IsExist(err) {
os.MkdirAll(floderLog, os.ModePerm)
}
}
logFile, err := os.OpenFile(logName, os.O_APPEND|os.O_RDWR|os.O_CREATE, os.ModePerm)
if err != nil {
fmt.Println("打开文件失败 err:", err)
return err
}
defer logFile.Close()
tm := time.Now().Format("2006-01-02 15:04:05")
//方法一:os包
//logBody := fmt.Sprintf("%s star============================================>\r\n", tm)
//logFile.WriteString(logBody)
logBody := fmt.Sprintf("[%s] - %+v\r\n", tm, args)
logFile.WriteString(logBody)
// logBody = fmt.Sprintf("\r\n")
// logFile.WriteString(logBody)
//方法二:bufio包
// writer := bufio.NewWriter(logFile)
// logBody := fmt.Sprintf("%s star============================================>\r\n", tm)
// writer.WriteString(logBody) //写入缓存
// logBody = fmt.Sprintf("%+v\r\n", args)
// writer.WriteString(logBody)
// logBody = fmt.Sprintf("\r\n")
// writer.WriteString(logBody)
// writer.Flush() //从缓存写入文件
return nil
}