go原生log模块的简易封装

简介: go原生log模块的简易封装

go的原生log模块,功能稍简单。比如不支持自定义输出级别。只有默认的三个可用。println,Fatal,Panic等


以下对go的原生log模块做的一个简易封装:


package main
import (
  "fmt"
  "io/ioutil"
  "log"
  "mime/multipart"
  "os"
  "path"
)
// Level These are the integer logging levels used by the logger
type Level int
// Comment
const (
  DEBUG Level = iota
  INFO
  WARNING
  ERROR
  FATAL
)
var (
  logPrefix  = ""
  levelFlags = []string{"DEBG", "INFO", "WARN", "ERRO", "FATL"}
  logger  *log.Logger
  loggerf *log.Logger
  // curLevel ...
  curLevel Level
  //
  logfile *os.File
)
func init() {
  curLevel = DEBUG
  logger = log.New(os.Stdout, "[default] ", log.LstdFlags)
  logger.SetFlags(log.Ldate | log.Lmicroseconds | log.Llongfile)
}
// Println ..
func Println(l *log.Logger, v ...interface{}) {
  if l != nil {
    l.Output(3, fmt.Sprintln(v...))
  }
}
// Fatalln is equivalent to l.Println() followed by a call to os.Exit(1).
func Fatalln(l *log.Logger, v ...interface{}) {
  if l != nil {
    l.Output(3, fmt.Sprintln(v...))
    os.Exit(1)
  }
}
// Debug ...
func Debug(v ...interface{}) {
  setPrefix(DEBUG)
  if DEBUG >= curLevel {
    Println(logger, v)
    Println(loggerf, v)
  }
}
// Info ...
func Info(v ...interface{}) {
  setPrefix(INFO)
  if INFO >= curLevel {
    Println(logger, v)
    Println(loggerf, v)
  }
}
// Warn ...
func Warn(v ...interface{}) {
  setPrefix(WARNING)
  if WARNING >= curLevel {
    Println(logger, v)
    Println(loggerf, v)
  }
}
// Error Warn
func Error(v ...interface{}) {
  setPrefix(ERROR)
  if ERROR >= curLevel {
    Println(logger, v)
    Println(loggerf, v)
  }
}
// Fatal ...
func Fatal(v ...interface{}) {
  setPrefix(FATAL)
  if FATAL >= curLevel {
    Fatalln(logger, v)
    Fatalln(loggerf, v)
  }
}
func setPrefix(level Level) {
  logPrefix = fmt.Sprintf("[%s] ", levelFlags[level])
  logger.SetPrefix(logPrefix)
  if loggerf != nil {
    loggerf.SetPrefix(logPrefix)
  }
}
// Config ..
func Config(level Level, lfile *os.File) {
  curLevel = level
  loggerf = log.New(lfile, "[default] ", log.LstdFlags)
  loggerf.SetFlags(log.Ldate | log.Lmicroseconds | log.Llongfile)
}
func main() {
  lgfile, err := MustOpen("log.txt", "mylog1/")
  if err != nil {
    Error("Failed to open log file:" + err.Error())
  }
  Config(DEBUG, lgfile)
  Debug("message")
  Info("message")
  Warn("message")
  Error("message")
}


要支持文件,则再加上以下几个操作文件和目录的:


func GetSize(f multipart.File) (int, error) {
  content, err := ioutil.ReadAll(f)
  return len(content), err
}
func GetExt(fileName string) string {
  return path.Ext(fileName)
}
func CheckNotExist(src string) bool {
  _, err := os.Stat(src)
  return os.IsNotExist(err)
}
func CheckPermission(src string) bool {
  _, err := os.Stat(src)
  return os.IsPermission(err)
}
func IsNotExistMkDir(src string) error {
  if notExist := CheckNotExist(src); notExist == true {
    if err := MkDir(src); err != nil {
      return err
    }
  }
  return nil
}
func MkDir(src string) error {
  err := os.MkdirAll(src, os.ModePerm)
  if err != nil {
    return err
  }
  return nil
}
func Open(name string, flag int, perm os.FileMode) (*os.File, error) {
  f, err := os.OpenFile(name, flag, perm)
  if err != nil {
    return nil, err
  }
  return f, nil
}
func MustOpen(fileName, filePath string) (*os.File, error) {
  dir, err := os.Getwd()
  if err != nil {
    return nil, fmt.Errorf("os.Getwd err: %v", err)
  }
  src := dir + "/" + filePath
  perm := CheckPermission(src)
  if perm == true {
    return nil, fmt.Errorf("file.CheckPermission Permission denied src: %s", src)
  }
  err = IsNotExistMkDir(src)
  if err != nil {
    return nil, fmt.Errorf("file.IsNotExistMkDir src: %s, err: %v", src, err)
  }
  f, err := Open(src+fileName, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644)
  if err != nil {
    return nil, fmt.Errorf("Fail to OpenFile :%v", err)
  }
  return f, nil
}
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
3月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
123 2
|
3月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
293 0
|
4月前
|
监控 前端开发 数据可视化
Github 12.3kstar, 3分钟起步做中后台?Go+Vue 脚手架,把权限、代码生成、RBAC 都封装好了
Go-admin 是基于 Gin + Vue 的中后台脚手架,集成 Casbin RBAC 权限、JWT 鉴权、GORM 数据库操作与 Swagger 文档,内置用户、角色、菜单等管理模块。提供代码生成器与表单构建器,支持多租户与多前端框架(Element UI/Arco/Ant Design),3 分钟快速搭建企业级后台,助力高效交付。
314 4
|
8月前
|
Go 持续交付 开发者
Go语言包与模块(module)的基本使用-《Go语言实战指南》
本章深入讲解Go语言中的包(Package)和模块(Module)概念。包是代码组织的最小单位,每个`.go`文件属于一个包,通过`import`实现复用;主程序包需命名为`main`。模块是Go 1.11引入的依赖管理机制,支持自动版本管理和私有/远程仓库,无需依赖GOPATH。通过实际示例,如自定义包`mathutil`和第三方模块`gin`的引入,展示其使用方法。常用命令包括`go mod init`、`go mod tidy`等,帮助开发者高效管理项目依赖。最后总结,包负责功能划分,模块实现现代化依赖管理,提升团队协作效率。
322 15
|
10月前
|
存储 JSON Go
PHP 日志系统的最佳搭档:一个 Go 写的远程日志收集服务
为了不再 SSH 上去翻日志,我写了个 Go 小脚本,用来接收远程日志。PHP 负责记录日志,Go 负责存储和展示,按天存储、支持 API 访问、可远程管理,终于能第一时间知道项目炸了。
219 10
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
281 4
Golang语言之Prometheus的日志模块使用案例
|
Go 开发者
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
207 2
|
数据挖掘 语音技术
3D-Speaker说话人任务的开源项目问题之语义说话人信息模块在说话人日志系统中的问题如何解决
3D-Speaker说话人任务的开源项目问题之语义说话人信息模块在说话人日志系统中的问题如何解决
208 1
|
存储 安全 Python
[python]使用标准库logging实现多进程安全的日志模块
[python]使用标准库logging实现多进程安全的日志模块
487 1