go原生log模块的简易封装
时间:2022-07-22
本文章向大家介绍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
}
- Apache NiFi 1.0.0测试版:邮件路由应用新型ListenSMTP
- 为什么我坚持使用 JavaScript 函数声明
- NewSQL数据库大对象块存储原理与应用
- 使用xUnit为.net core程序进行单元测试(下2)
- MongoDB + Spark: 完整的大数据解决方案
- 如何实现自然语言处理的集束搜索解码器
- PostgreSQL 使用advisory lock或skip locked消除行锁冲突, 提高几十倍并发更新效率
- 流动的数据——使用 RxJS 构造复杂单页应用的数据逻辑
- 内存泄漏的检测、解决、防止
- 大数据Hadoop快速入门教程
- 用Rust解决C语言的隐患
- GAN学习指南:从原理入门到制作生成Demo
- 从糖尿病监测看智能医疗发展
- Apache Beam:下一代的数据处理标准
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Dubbo 压测插件 2.0 —— 基于普通 API 调用
- Django 处理http请求之中间件
- 设计模式~享元模式
- 最近三个月记录
- 近期vue开发相关问题
- 打印日志时 Logback 内部都做了些什么
- nginx配置https
- 近期问题: jq循环中异步请求问题
- 启用HSTS并加入HSTS Preload List-附删除HSTS方法
- 聊聊UI标准化
- puppeteer学习----登录人才网并截图
- MySQL 案例:用户鉴权与 Host 优先级
- Http Post 快速使用
- 有赞Flutter插件开发与发布
- 国标GB28181协议客户端EasyGBS国标视频平台级联EasyNVR:EasyGBS如何实现调阅EasyNVR的视频通道?