go开发属于自己的日志库-日志库易用性封装
文件日志和console日志也完成了,我们试试在其他其他使用一下。在我们之前的server中,main.go
输入一下代码:
package mainimport "hm_log"var log hm_log.Logfunc initLog(logPath, logName string) {//log := hm_log.NewFileLog(logPath, logName)log := hm_log.NewConsoleLog()log.Debug("this is debug")
}func Run() {log.Warn("this is warn")
}func main() {initLog(".", "server")Run()
}复制代码
运行这个程序,可以看到终端成功的输入了日志,然后试试文件日志库。 但是这样有一个麻烦就是,每个相关都需要声明一个log,还是麻烦,所以我们需要进行提炼,将log 全局变量封装到我们的日志库中,只给一个初始函数,使用的时候直接log变量即可。进入我们的hm_log
项目中,新建一个log.go
:
package hm_logimport "fmt"var log Logfunc InitLog(name string, config map[string]string) (err error) {switch name {case "file":log, err = NewFileLog(config)case "console":log, err = NewConsoleLog()default:err = fmt.Errorf("unspport log name:%s", name)}return
}func Debug(format string, args ...interface{}) {log.Debug(format, args...)
}func Trace(format string, args ...interface{}) {log.Trace(format, args...)
}func Info(format string, args ...interface{}) {log.Info(format, args...)
}func Warn(format string, args ...interface{}) {log.Warn(format, args...)
}func Error(format string, args ...interface{}) {log.Error(format, args...)
}func Fatal(format string, args ...interface{}) {log.Fatal(format, args...)
}func Close() {log.Close()
}
复制代码
由于文件日志需要配置多个参数,这是我们直接使用map来进行传参即可。因为传的是map,所以我们的文件日志库file.go
也需要进行修改:
func NewFileLog(config map[string]string) (logFile Log, err error) {//判断是否传入了值,没有值就抛出错误logPath, ok := config["log_path"]if !ok {err = fmt.Errorf("not found log_path")return}logName, ok := config["log_name"]if !ok {err = fmt.Errorf("not found log_name")return}logFile = &FileLog{logPath: logPath,logName: logName,}//logFile.init()logFile.Init()return
}
复制代码
logFile.init()
这里是会报错的,因为FileLog没有这个方法,所以文们需要加上一个init()方法。进入log_interface.go
:
package hm_logtype Log interface {Debug(format string, args ...interface{}) // ...表示接收可变参数Trace(format string, args ...interface{})Info(format string, args ...interface{})Warn(format string, args ...interface{})Error(format string, args ...interface{})Fatal(format string, args ...interface{})Close() // 文件需要进行关闭操作Init()
}
复制代码
把我们之前的file.go
,console.go
给加上Init(): file.go
// 替换之前的init()
func (f *FileLog) Init() {
}
复制代码
console.go
func (f *FileLog) Init() { }
复制代码
我们再来修改之前的main.go
:
package mainimport "hm_log"func initLog(logPath, logName string) {//log := hm_log.NewFileLog(logPath, logName)config := make(map[string]string, 8)config["log_path"] = "."config["log_name"] = "server"err := InitLog("file", config)if err != nil {return}
}func Run() {log.Warn("this is warn")
}func main() {initLog(".", "server")Run()
}
复制代码
这样我们就不需要声明全局变量log,使用起来就很方便了。运行一个,可以正常的使用。
go开发属于自己的日志库-日志库易用性封装相关推荐
- java开发有日志存表的吗_Java日志信息存库(logback篇)
一.Logback简介 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-acce ...
- 你所不知道的日志异步落库
https://www.cnblogs.com/scy251147/p/9193075.html 在互联网设计架构过程中,日志异步落库,俨然已经是高并发环节中不可缺少的一环.为什么说是高并发环节中不可 ...
- openresty开发系列36--openresty执行流程之6日志模块处理阶段
openresty开发系列36--openresty执行流程之6日志模块处理阶段 一)header_filter_by_lua 语法:header_filter_by_lua <lua-scri ...
- 你完全没了解过的日志异步落库
前言 在互联网设计架构过程中,日志异步落库,俨然已经是高并发环节中不可缺少的一环.为什么说是高并发环节中不可缺少的呢? 原因在于,如果直接用mq进行日志落库的时候,低并发下,生产端生产数据,然后由消费 ...
- 频发:记ADG备库日志应用延迟的一次故障处理-云和恩墨技术通讯精选
各位亲爱的用户/读者朋友们: 为了及时共享行业案例,通告共性问题,达成知识共享和提前预防,我们整理和编辑了<云和恩墨技术通讯>(7月刊),通过对过去一段时间的知识回顾和故障归纳,以期提供有 ...
- Go日志-Uber开源库zap使用
目录 1. zap包介绍 2. zap的使用 3. 使用Namespace构建嵌套格式 4. 构造的Logger对象的选项Option 5. 参考资料 上一篇我们讲到go日志官方标准库的log的使用方 ...
- 【游戏开发进阶】新发带你玩转Unity日志打印技巧(彩色日志 | 日志存储与上传 | 日志开关 | 日志双击溯源)
文章目录 一.前言 二.常规日志打印 1.打印Hello World 2.打印任意类型的数据 3.context参数干嘛的 4.格式化输出 三.彩色日志打印 四.日志存储与上传 1.打印日志事件 2. ...
- iOS开发76-使用Xcode查看实时日志
iOS开发76-使用Xcode查看实时日志 在Xcode上运行App代码的时候,可以实时查看到日志. 在没有APP源代码的情况下,直接使用Xcode查看Debug版本的App来查看实时日志. 步骤如下 ...
- oracle dg库慢,dg库日志应用慢参数调整
dg库日志应用慢参数调整 1> 日志应用是否使用了并行;-并行度看主机的cpu个数 alter database recover managed standby database paralle ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 异常处理和日志记录
基于 abp vNext 和 .NET Core 开发博客项目 - 异常处理和日志记录 转载于:https://github.com/Meowv/Blog 在开始之前,我们实现一个之前的遗留问题,这个 ...
最新文章
- php 静态类内存,php面向对象中static静态属性与方法的内存位置分析
- Linux rpm 命令参数
- 关于 移动端 页面跳转的方赞
- 简单文件的上传与保存
- 【Java】Java枚举类型示例
- 爬虫软件python功能_Python 网络爬虫程序详解
- java集群插件_别说,Cerebro还真好用!老板再也不用担心ES集群了
- 推荐!可视化垃圾回收算法(转)
- Windows Azure AppFabric 入门教学(七):多播(Multicast)
- 面经 | NLP算法岗(百度)
- 数学分析学习(一):映射与不等式
- Spring MVC - 拦截器实现 和 用户登陆例子
- 直方图均衡化 java,OpenCV Java 直方图均衡化
- python读取nc文件并转换成csv_在Python3中读取crystal report.rpt文件并将其转换为.csv或.xlsx...
- 基于Pacemaker+Corosync的PostgreSQL HA故障两例
- 微信小程序发现的一些小问题以及解决方案集合以及注意点
- 宏观调控绝不是微观控制
- 移动硬盘安装ubuntu16.04
- 华硕ddns注册ip地址不正确_华硕路由器 ddns注册成功,但是连接不上,怎么修改成别的ddns...
- <<算法很美>>——(三)十大排序算法(下)
热门文章
- 四种方法求Capacitated Facility Location Problem问题
- 修改model,映射到表中
- Java中上转型对象数组
- Yii2如何用migrate快速建表
- eclipse安装activiti 工作流插件
- Blob(二进制)、byte[]、long、date之间的类型转换
- [转] 虚拟机VMware3种网络模式(桥接、nat、Host-only)的工作原理
- 七、集合框架,Collection、list、set、map老师说集合学好了走到哪里都不怕
- ASP.NET2.0缓存(Cache)技术
- Hystrix熔断机制原理剖析