目的: 错误日志写入到文件里面
- 日志文件夹是否存在,创建日志目录
- 日志文件是否存在,创建日志文件
- 文件权限
- 追加写入
package main
import (
"io"
"os"
"time"
)
const (
//LOGPATH LOGPATH/time.Now().Format(FORMAT)/*.log
LOGPATH = "log/"
//FORMAT .
FORMAT = "20060102"
//LineFeed 换行
LineFeed = "\r\n"
)
//以天为基准,存日志
var path = LOGPATH + time.Now().Format(FORMAT) + "/"
//WriteLog return error
func WriteLog(fileName, msg string) error {
if !IsExist(path) {
return CreateDir(path)
}
var (
err error
f *os.File
)
f, err = os.OpenFile(path+fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
_, err = io.WriteString(f, LineFeed+msg)
defer f.Close()
return err
}
//CreateDir 文件夹创建
func CreateDir(path string) error {
err := os.MkdirAll(path, os.ModePerm)
if err != nil {
return err
}
os.Chmod(path, os.ModePerm)
return nil
}
//IsExist 判断文件夹/文件是否存在 存在返回 true
func IsExist(f string) bool {
_, err := os.Stat(f)
return err == nil || os.IsExist(err)
}
调用 直接 ==包名.WriteLog("1.log","这是个错误")==
==本文使用到的技术 剖析:==
1: os.Stat(name string) (fi FileInfo, err error)
//返回描述文件的FileInfo信息。如果出错,将是 *PathError类型。
2: os.IsExist(err error) bool
//返回一个布尔值,它指明err错误是否报告了一个文件或者目录已经存在。它被ErrExist和其它系统调用满足
3: os.MkdirAll(path string, perm FileMode) error
//创建一个新目录,该目录是利用路径(包括绝对路径和相对路径)
进行创建的,如果需要创建对应的父目录也一起进行创建
如果已经有了该目录,则不进行新的创建
当创建一个已经存在的目录时,不会报错.
4: os.Chmod(name string, mode FileMode) error
//更改文件的权限(读写执行,分为三类:all-group-owner)
5: os.OpenFile(name string, flag int, perm FileMode) (file *File, err error)
//指定文件权限和打开方式打开name文件或者create文件,其中flag标志如下:
O_RDONLY:只读模式(read-only)
O_WRONLY:只写模式(write-only)
O_RDWR:读写模式(read-write)
O_APPEND:追加模式(append)
O_CREATE:文件不存在就创建(create a new file if none exists.)
O_EXCL:与 O_CREATE 一起用,构成一个新建文件的功能,它要求文件必须不存在(used with O_CREATE, file must not exist)
O_SYNC:同步方式打开,即不使用缓存,直接写入硬盘
O_TRUNC:打开并清空文件
至于操作权限perm,除非创建文件时才需要指定,不需要创建新文件时可以将其设定为0.虽然go语言给perm权限设定了很多的常量,但是习惯上也可以直接使用数字,如0666(具体含义和Unix系统的一致).
6: io.WriteString(w Writer, s string) (n int, err error)
有疑问加站长微信联系(非本文作者)