go原生log模块的简易封装

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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
}
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
53 3
Golang语言之Prometheus的日志模块使用案例
|
2月前
|
Shell Python
salt自定义模块内使用日志例子
salt自定义模块内使用日志例子
logging 日志 模块
logging 日志 模块
|
3月前
|
Go 开发者
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
|
3月前
|
数据挖掘 语音技术
3D-Speaker说话人任务的开源项目问题之语义说话人信息模块在说话人日志系统中的问题如何解决
3D-Speaker说话人任务的开源项目问题之语义说话人信息模块在说话人日志系统中的问题如何解决
|
3月前
|
存储 监控 Java
|
3月前
|
存储 安全 Python
[python]使用标准库logging实现多进程安全的日志模块
[python]使用标准库logging实现多进程安全的日志模块
|
3月前
|
缓存 JavaScript 前端开发
为开源项目 go-gin-api 增加 WebSocket 模块
为开源项目 go-gin-api 增加 WebSocket 模块
46 2
|
4月前
|
存储 算法 开发工具
Etcd/Raft 原理问题之Etcd-Raft是什么
Etcd/Raft 原理问题之Etcd-Raft是什么
|
5月前
|
存储 中间件 Go
在go语言服务中封装路由和示例
【6月更文挑战第23天】本文介绍golang后端按协议处理、中间件(一次性与每次请求执行)划分、以及服务架构Controller、Logic/Service、DAO/Repository和Routers划分。代码仓库在GitHub上提供。使用框架简化了交互和处理。后续章节深入探讨服务构建。
162 5
在go语言服务中封装路由和示例