Golang如何输出日志到指定文件

        日志输出在任何项目中都极其重要,是有助于后续我们排查问题、解决程序BUG,而规划好的日志输出路径,最能做到清晰直观的展示,本人对golang日志输出做了个小小的进阶,复制直接能够看到效果,希望对各位兄弟姐妹有所帮助!

日志功能

  1. 创建文件,按小时切割文件,按日志用途划分文件夹

代码如下:


import (
    "fmt"
    "go.uber.org/zap"
    "io"
    "log"
    "os"
    "strings"
    "time"
)

var logFile io.Writer

func main() {
    Logwrite("大家好,我是自定义日志", "outSysLog")
    Logwrite("很开心,欢迎大家使用我!", "insideSysLog")
}

// IsFile
//
//    @Description: 判断所给路径是否为文件
//    @param path
//    @return os.FileInfo
//    @return bool
//
func IsFile(path string) (os.FileInfo, bool) {
    f, flag := IsExists(path)
    return f, flag && !f.IsDir()
}

// IsExists
//
//    @Description: 判断路径是否存在
//    @param path
//    @return os.FileInfo
//    @return bool
//
func IsExists(path string) (os.FileInfo, bool) {
    f, err := os.Stat(path)
    return f, err == nil || os.IsExist(err)
}

// Logwrite
//
//    @Description: 写日志
//    @param message 日志信息
//    @param dirname 日志目录
//
func Logwrite(message string, dirname string) {
    //创建文件目录,dirname的命名可以是输出日志的用处,譬如:调用外部系统接口日志:outSysLog
    folderName := "log/" + dirname
    folderTemp := ""
    for _, v := range strings.Split(folderName, "/") {
        folderTemp += v
        _, IsExistsPath := IsExists(folderTemp)
        //判断文件夹是否存在,不存在则创建
        if !IsExistsPath {
            //创建文件夹代码
            err := os.Mkdir(folderTemp, os.ModePerm)
            if err != nil {
                zap.L().Error("创建日志文件夹出错", zap.Any("报错情况", err))
            }
        }
        folderTemp += "/"
    }
    now := time.Now() //设置时间变量
    //设置日志文件,做好日志文件管理:这里是用时间做文件名称,每个小时生成不同文件。
    filefullname := "./" + folderName + "/" + now.Format("20060102") + now.Format("_15") + ".log"
    //判断文件是否存在
    _, b := IsFile(filefullname)
    if b {
        //打开文件
        logFile, _ = os.OpenFile(filefullname, os.O_APPEND, 0666)
    } else {
        //新建文件
        logFile, _ = os.Create(filefullname)
    }
    //log.New函数创建新looger
    loger := log.New(logFile, "log_", log.Ldate|log.Ltime|log.Lshortfile)
    //SetFlags设置输出选项
    loger.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
    //设置输出前缀,如果不传输前缀,那么就不输出
    loger.SetPrefix("log_")
    //输出日志文件
    err := loger.Output(2, message+"\n")
    if err != nil {
        zap.L().Error("输出日志文件时报错", zap.Any("报错情况", err))
    }
    //打印在控制台
    fmt.Println(message)
}
  1. 效果展示

  1. 控制台输出

  1. 日志输出

  1. 按日志用途划分文件夹

  1. 按小时切割文件

  1. 信息输出

存在问题

  1. 此方法没有用日志插件,所以不会去保留配置天数文件,定期清理过期日志,这样就会造成日志文件越来越多,对服务器造成一定的资源压力,建议增加定时任务,定期删除过期日志。

  1. .....

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值