前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang log日志

golang log日志

原创
作者头像
老脸一红
修改2018-05-28 11:20:35
7101
修改2018-05-28 11:20:35
举报
文章被收录于专栏:老脸一黑老脸一黑

最近在做项目的时候发现beego的log系统挺好用,但是好用归好用,还不够舒服。希望能够自定义

于是便有了这儿的简单的log日志包。

日志很简单,目前是都打印到控制台,做了简单的分级,没有接graylog,下一步如果有这种需求会继续完善一下。

代码语言:go
复制
package logging

import (
	"fmt"
	"log"
	"os"
)

type (
	Level int
)

const (
	LevelFatal = iota
	LevelError
	LevelWarning
	LevelInfo
	LevelDebug
	fatalColor   = "\033[35m"
	errColor     = "\033[31m"
	warningColor = "\033[33m"
	infoColor    = "\033[32m"
	debugColor   = "\033[36m"
	colorEnd     = "\033[0m"
)

var logger = New()

func p(level Level, v ...interface{}) {
	var formatStr string
	length := len(v)
	for i := 0; i < length; i++ {
		formatStr += "%+v "
	}
	logger.Output(level, fmt.Sprintf(formatStr, v...))
}

func Fatal(v ...interface{}) {
	p(LevelFatal, v...)
	os.Exit(1)
}

func Fatalf(format string, v ...interface{}) {
	logger.Output(LevelFatal, fmt.Sprintf(format, v...))
	os.Exit(1)
}

func Error(v ...interface{}) {
	p(LevelError, v...)
}

func Errorf(format string, v ...interface{}) {
	logger.Output(LevelError, fmt.Sprintf(format, v...))
}

func Warn(v ...interface{}) {
	p(LevelWarning, v...)
}

func Warnf(format string, v ...interface{}) {
	logger.Output(LevelWarning, fmt.Sprintf(format, v...))
}

func Info(v ...interface{}) {
	p(LevelInfo, v...)
}

func Infof(format string, v ...interface{}) {
	logger.Output(LevelInfo, fmt.Sprintf(format, v...))
}

func Debug(v ...interface{}) {
	p(LevelDebug, v...)
}

func Debugf(format string, v ...interface{}) {
	logger.Output(LevelDebug, fmt.Sprintf(format, v...))
}

func Check(s string, err error) {
	if err == nil {
		logger.Output(LevelInfo, s+" ok")
	} else {
		logger.Output(LevelFatal, fmt.Sprintf("%s %+v", s, err))
		os.Exit(1)
	}
}

func SetLogLevel(level Level) {
	logger.SetLogLevel(level)
}

type logManager struct {
	_log *log.Logger
	//小于等于该级别的level才会被记录
	logLevel Level
}

//NewLogger 实例化,供自定义
func NewLogger() *logManager {
	return &logManager{_log: log.New(os.Stderr, "", log.Lshortfile|log.LstdFlags), logLevel: LevelDebug}
}

//New 实例化,供外部直接调用 log.XXXX
func New() *logManager {
	return &logManager{_log: log.New(os.Stderr, "", log.Lshortfile|log.LstdFlags), logLevel: LevelDebug}
}

func (l *logManager) Output(level Level, s string) error {
	if l.logLevel < level {
		return nil
	}
	switch level {
	case LevelFatal:
		s = fmt.Sprintf("%s[FATAL] %s%s", fatalColor, s, colorEnd)
	case LevelError:
		s = fmt.Sprintf("%s[ERROR] %s%s", errColor, s, colorEnd)
	case LevelWarning:
		s = fmt.Sprintf("%s[WARNING] %s%s", warningColor, s, colorEnd)
	case LevelInfo:
		s = fmt.Sprintf("%s[INFO] %s%s", infoColor, s, colorEnd)
	case LevelDebug:
		s = fmt.Sprintf("%s[DEBUG] %s%s", debugColor, s, colorEnd)
	default:
		s = fmt.Sprintf("%s[UNKNOWN] %s%s", infoColor, s, colorEnd)
	}
	return l._log.Output(3, s)
}

func (l *logManager) Fatal(s string) {
	l.Output(LevelFatal, s)
	os.Exit(1)
}

func (l *logManager) Fatalf(format string, v ...interface{}) {
	l.Output(LevelFatal, fmt.Sprintf(format, v...))
	os.Exit(1)
}

func (l *logManager) Error(s string) {
	l.Output(LevelError, s)
}

func (l *logManager) Errorf(format string, v ...interface{}) {
	l.Output(LevelError, fmt.Sprintf(format, v...))
}

func (l *logManager) Warn(s string) {
	l.Output(LevelWarning, s)
}

func (l *logManager) Warnf(format string, v ...interface{}) {
	l.Output(LevelWarning, fmt.Sprintf(format, v...))
}

func (l *logManager) Info(s string) {
	l.Output(LevelInfo, s)
}

func (l *logManager) Infof(format string, v ...interface{}) {
	l.Output(LevelInfo, fmt.Sprintf(format, v...))
}

func (l *logManager) Debug(s string) {
	l.Output(LevelDebug, s)
}

func (l *logManager) Debugf(format string, v ...interface{}) {
	l.Output(LevelDebug, fmt.Sprintf(format, v...))
}

func (l *logManager) Check(s string, err error) {
	if err != nil {
		l.Output(LevelInfo, s+"ok")
	} else {
		l.Output(LevelWarning, s+fmt.Sprintf("%+v", err))
	}
}

func (l *logManager) SetLogLevel(level Level) {
	l.logLevel = level
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档