分享
  1. 首页
  2. 文章

Go语言自己实现的异步小log程序.

fyxichen · · 2890 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

slog.go

package slog
import (
	"errors"
	"fmt"
	"os"
	"strings"
	"time"
)
type Logger struct {
	console bool
	warn bool
	info bool
	tformat func() string
	file chan string
}
func NewLog(level string, console bool, File *os.File, buf int) (*Logger, error) {
	log := &Logger{console: console, tformat: format}
	if File != nil {
		FileInfo, err := File.Stat()
		if err != nil {
			return nil, err
		}
		mode := strings.Split(FileInfo.Mode().String(), "-")
		if strings.Contains(mode[1], "w") {
			str_chan := make(chan string, buf)
			log.file = str_chan
			go func() {
				for {
					fmt.Fprintln(File, <-str_chan)
				}
			}()
			defer func() {
				for len(str_chan) > 0 {
					time.Sleep(1e9)
				}
			}()
		} else {
			return nil, errors.New("can't write.")
		}
	}
	switch level {
	case "Warn":
		log.warn = true
		return log, nil
	case "Info":
		log.warn = true
		log.info = true
		return log, nil
	}
	return nil, errors.New("level must be Warn or Info.")
}
func (self *Logger) Error(info interface{}) {
	if self.console {
		fmt.Println("Error", self.tformat(), info)
	}
	if self.file != nil {
		self.file <- fmt.Sprintf("Error %s %s", self.tformat(), info)
	}
}
func (self *Logger) Warn(info interface{}) {
	if self.warn && self.console {
		fmt.Println("Warn", self.tformat(), info)
	}
	if self.file != nil {
		self.file <- fmt.Sprintf("Warn %s %s", self.tformat(), info)
	}
}
func (self *Logger) Info(info interface{}) {
	if self.info && self.console {
		fmt.Println("Info", self.tformat(), info)
	}
	if self.file != nil {
		self.file <- fmt.Sprintf("Info %s %s", self.tformat(), info)
	}
}
func (self *Logger) Close() {
	for len(self.file) > 0 {
		time.Sleep(1e8)
	}
}
func format() string {
	return time.Now().Format("2006年01月02日 15:04:05")
}

slog_test.go
package main
import (
	"fmt"
	"os"
	"slog"
	"testing"
)
func Test_log(T *testing.T) {
	File, _ := os.Create("log")
	log, err := slog.NewLog("Info", true, File, 10)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer log.Close()
	for i := 0; i < 1000; i++ {
		log.Warn("Nima")
		log.Info("Fuck")
	}
}
func Benchmark_log(b *testing.B) {
	File, _ := os.Create("log")
	log, err := slog.NewLog("Info", false, File, 10)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer log.Close()
	for i := 0; i < b.N; i++ {
		log.Warn("Nima")
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:fyxichen

查看原文:Go语言自己实现的异步小log程序.

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2890 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏