log4go的全局封装Wrapper和标准log库函数的兼容
方便易用的全局函数
大多数时候,只不过是写一个简单的测试程序。例如:
package main
import (
"log"
)
func main(){
log.Fatal("Come with fatal,exit with 1 \n")
}
这是Go语言标准log库的用法。
无须用logger := log.New(...)来产生一个指针。而且可以在程序的任何地方都能使用这个log。
阅读 log.go 源码:
...
var std = New(os.Stderr, "", LstdFlags)
...
// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
std.Output(2, fmt.Sprint(v...))
os.Exit(1)
}
奥妙就在于 log.go 申请了一个全局变量 std,并封装了全局函数 log.Fatal。
log4go 的一个简单例子
这是 log4go 的一个简单例子:
package main
import (
"time"
log "github.com/ccpaging/log4go"
"github.com/ccpaging/log4go/colorlog"
)
func main() {
log.AddFilter("stdout", log.DEBUG, colorlog.NewColorLogWriter())
log.Debug("The time is now: %s", time.Now().Format("15:04:05 MST 2006/01/02"))
log.Info("The time is now: %s", time.Now().Format("15:04:05 MST 2006/01/02"))
log.Warn("The time is now: %s", time.Now().Format("15:04:05 MST 2006/01/02"))
time.Sleep(200 * time.Millisecond)
}
效果如下图:

是不是很漂亮?运行环境:windows ConEmu。
colorlog 目前可以支持 Windows、Linux 以及 Cygwin 的 mintty 和 tmux。

github.com/ccpaging/log4go/colorlog,这是一个彩色字符终端的log4go扩展插件。
喧宾夺主了……color term log 的话题以后再聊。
全局变量和全局函数
所以,log4go也有一个全局变量和一堆全局函数封装。详见:wrapper.go
var (
Global Logger
)
func init() {
Global = Logger {
"stdout": NewFilter(DEBUG, NewConsoleLogWriter().SetFormat("%T %L %s %M")),
}
}
// Wrapper for (*Logger).AddFilter
func AddFilter(name string, lvl Level, writer LogWriter) {
Global.AddFilter(name, lvl, writer)
}
全局变量Global被自动初始化为一个 ConsoleLogWriter。它是黑白两色的字符终端。
// Add a new LogWriter to the Logger which will only log messages at lvl or
// higher. This function should not be called from multiple goroutines.
// Returns the logger for chaining.
func (log Logger) AddFilter(name string, lvl Level, writer LogWriter) Logger {
if filt, isExist := log[name]; isExist {
filt.Close()
delete(log, name)
}
log[name] = NewFilter(lvl, writer)
return log
}
加入 ColorLogWriter 时,使用了同样的关键字 stdout,
所以,原来的黑白终端输出被关闭,Global 中只保留了新的彩色终端。
如果 AddFilter 时,换一个关键字,例如 xxxout 会怎样?我不知道。
系统不会崩溃吧 :(
兼容标准log库
为了方便习惯于标准log库的程序员,封装了与标准库兼容的函数。
原来使用标准 log 库的程序只需换成 log4go 就可以用了?
想得美?!这是一个值得尝试的设想……
func Fatal(v ...interface{})
func Fatalf(format string, v ...interface{})
func Fatalln(v ...interface{})
func Output(calldepth int, s string) error
func Panic(v ...interface{})
func Panicf(format string, v ...interface{})
func Panicln(v ...interface{})
func Print(v ...interface{})
func Printf(format string, v ...interface{})
func Println(v ...interface{})
后续可能会加入:
func Prefix() string
func SetPrefix(prefix string)
这个功能也许在nanomsg的订阅模型中用到。
异步写日志的坑
细心的童鞋可能注意到测试程序中的一个特殊语句。
time.Sleep(200 * time.Millisecond)
纳尼?延时了200ms。我承认,这个问题令人困惑。如果没有这个延时,
可能在终端上什么也看不到。后果很严重……考试通不过,挂科……惨……
log4go 的每个日志都在一个 go routine 中运行。如果测试程序写的太简单了,
go routine 还没有来得及运行,主程序就退出了。
曾经设想在go routine中加 channel……然并没有什么用……
睡 200ms 是最优雅的解决方案了。
就酱紫。
log4go的全局封装Wrapper和标准log库函数的兼容的更多相关文章
- python+selenium之自定义封装一个简单的Log类
python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...
- Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》
Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676
- 【AOS应用基础平台】完好了AOS标签库,和标准标签库完美兼容了
[金码坊AOS开发平台]今天①完好了AOS标签库,和标准标签库完美兼容了.②新开发了依据子页面动态生成主页面的二级导航菜单功能.#AOS开发平台#
- 小程序重新封装打印函数console.log
习惯性使用console.log打印获取到的数据,信息等,然后上星期大佬看见了说怎么那么多打印信息出来,线上那个也是吗?问我能不能线上的就不打印出来? 我就说那就封装一个打印函数呗. 重写一个没问题, ...
- Python之自定义封装一个简单的Log类
参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...
- Vue 集成环信 全局封装环信WebSDK 可直接使用
2019-11-25更新 npm install --save easemob-websdk请直接使用官方安装方式即可.import WebIM from 'easemob-websdk' 以下是最开 ...
- JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档
作者: zyl910 [TOC] 一.缘由 由于在ES6之前,JavaScript中没有定义类(class)语法.导致大家用各种五花八门的办法来定义类,代码风格不统一.而且对于模拟面向对象的三大支柱& ...
- 标准C库函数
标准库函数由15个头文件组成 1.math.h 1.1 绝对值函数 1.2 幂函数.开平方函数 1.3 指数函数.对数函数 1.5 三角函数 注意参数范围: 1.6 取整函数.取余函数 2.字符串处理 ...
- 标准c库函数与Linux下系统函数库 区别 (即带不带缓冲区的学习)
我们都知道,C语言在UNIX/Linux系统下有一套系统调用(系统函数),比如文件操作open().close().write().read()等,而标准C语言的库函数中也有一套对文件的操作函数fop ...
随机推荐
- Autotest添加测试用例小结
Autotest本身是一个自动化测试框架,可以在上面添加各种测试工具用于系统测试.前几天我在上面添加了几个基于龙芯桌面5.0系统的性能测试工具.现在做以下总结,大体写以下添加的过程. 以unixben ...
- linux 系统备份日志
题目: 备份日志 小明是一个服务器管理员,他需要每天备份论坛数据(这里我们用日志替代),备份当天的日志并删除之前的日志.而且备份之后文件名是年-月-日的格式.alternatives.log在/var ...
- android打电话
一.安卓中,TelephonyManager是电话管理器,它管理着电话的所有服务. 1.如图,为一个简单的打电话应用,他是通过调用系统API实现的,必须添加权限 2.先看清单文件,此处添加权限 < ...
- Bottle源码阅读笔记(二):路由
前言 程序收到请求后,会根据URL来寻找相应的视图函数,随后由其生成页面发送回给客户端.其中,不同的URL对应着不同的视图函数,这就存在一个映射关系.而处理这个映射关系的功能就叫做路由.路由的实现分为 ...
- Chapter 9:Noise-Estimation Algorithms
作者:桂. 时间:2017-06-14 12:08:57 链接:http://www.cnblogs.com/xingshansi/p/6956556.html 主要是<Speech enha ...
- Java类的装载过程和静态代码块
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载.连接和初始化,其中连接又可以分成校验.准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下: ...
- mac os 安装 python 环境
1.我们先获取pip安装脚本: 1 wget https://bootstrap.pypa.io/get-pip.py 如果没有安装wget可以去这里将所有内容复制下来,新建get-pip.py文件, ...
- eclipse tomcat add时提示The Tomcat server configuration at \Servers\Tomcat v6.0 Server at localhost-
原因为左侧项目中把对于网络应用的servers项目给关闭或删除了,导致相应的localhost-config无法定位,所以才发生的错误. 解决办法:删除servers下的tomcat 重新添加serv ...
- CoordinatorLayout+沉浸式状态栏
没有gif 说个*B 注意看 状态栏的瑶瑟变化 (如果我是你 我不会去计较下边的toast) 之前为了这个效果我查了好多文章 博客什么的 ,,要么就是刚开始图片背景没有填充到状态栏下 要么就是 ...
- C# DataGridView显示日期格式问题
给DataGridView单元格绑定或者赋值DataTime数据后有时会发现不能显示完整的数据格式,怎么办呢?给出解决方案如下:1.指定整列的显示格式:m_dataGridView.Columns[c ...