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 }