方便易用的全局函数

大多数时候,只不过是写一个简单的测试程序。例如:

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库函数的兼容的更多相关文章

  1. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  2. Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》

    Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676

  3. 【AOS应用基础平台】完好了AOS标签库,和标准标签库完美兼容了

    [金码坊AOS开发平台]今天①完好了AOS标签库,和标准标签库完美兼容了.②新开发了依据子页面动态生成主页面的二级导航菜单功能.#AOS开发平台#

  4. 小程序重新封装打印函数console.log

    习惯性使用console.log打印获取到的数据,信息等,然后上星期大佬看见了说怎么那么多打印信息出来,线上那个也是吗?问我能不能线上的就不打印出来? 我就说那就封装一个打印函数呗. 重写一个没问题, ...

  5. Python之自定义封装一个简单的Log类

    参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...

  6. Vue 集成环信 全局封装环信WebSDK 可直接使用

    2019-11-25更新 npm install --save easemob-websdk请直接使用官方安装方式即可.import WebIM from 'easemob-websdk' 以下是最开 ...

  7. JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 [TOC] 一.缘由 由于在ES6之前,JavaScript中没有定义类(class)语法.导致大家用各种五花八门的办法来定义类,代码风格不统一.而且对于模拟面向对象的三大支柱& ...

  8. 标准C库函数

    标准库函数由15个头文件组成 1.math.h 1.1 绝对值函数 1.2 幂函数.开平方函数 1.3 指数函数.对数函数 1.5 三角函数 注意参数范围: 1.6 取整函数.取余函数 2.字符串处理 ...

  9. 标准c库函数与Linux下系统函数库 区别 (即带不带缓冲区的学习)

    我们都知道,C语言在UNIX/Linux系统下有一套系统调用(系统函数),比如文件操作open().close().write().read()等,而标准C语言的库函数中也有一套对文件的操作函数fop ...

随机推荐

  1. Windows 7 下安装mysql-5.7.18-winx64.zip

    mysql-5.7以后压缩包安装有了不小的变化 第一步:到官网下载https://dev.mysql.com/downloads/mysql/ 第二步:解压到一个文件夹 第三步:配置环境变量 把;%M ...

  2. scroll抖动问题

    参考软文: http://www.cnblogs.com/coco1s/p/5499469.html function throttle(func, wait, mustRun) { var time ...

  3. sql定时自动备份(定时作业)

    第一步: 右键启动"SQL Server 代理"

  4. 初入计算机图形学——BVH结构的实现

    摘要: 本人水平有限,若有错误也请指正~ 光线追踪作为全局光照解决方案的一个重要思想,其与场景大量三角形的求交效率高低直接影响最终算法的速度,典型的一些渲染器都采用二叉树来将场景进行划分,最近自己实现 ...

  5. 【WPF】用三角形网格构建三维图形

    虽然WPF只能支持部分三维模型,不过从应用功能开发的角度看,也已经够用了(非游戏开发).WPF 的三维图形,说得简单一点,也就两种而已. 1.把二维对象放到三维空间中,这个应该较为好办,像 Image ...

  6. github pages部署静态网页

    如果你的项目只是一个静态网站,就没有必要再去整什么服务器,github pages 提供了搭建静态网站的功能: 为什么使用Github Pages 1. 搭建简单而且免费: 2. 支持静态脚本: 3. ...

  7. 抓包工具 - Fiddler(详细介绍)

    Fiddler的详细介绍 一.Fiddler与其他抓包工具的区别 1.Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要 ...

  8. Vulkan Tutorial 17 Rendering and presentation

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Setup 这一章节会把之前的所有内容进行整合.我们将会编写drawFrame函数, ...

  9. KNN算法介绍

    KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思. 算法描述 KNN是一种分类算法,其基本思想是采用测量不同特征值之间的距离方法进行分类. 算法过程如下: 1.准备样本数据集( ...

  10. vue-resource promise兼容性问题

    背景 其实这个问题在之前的项目开发中就出现过,但是当初只解决问题了,并没有针对问题作总结:于是乎今天踩到了自己埋的坑,所以决定记录一下.那么到底是什么问题呢?就是"在安卓低版本,如果你在vu ...