Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Go语言自己实现的异步小log程序.大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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",info)

	}
}

func (self *Logger) Warn(info interface{}) {
	if self.warn && self.console {
		fmt.Println("Warn",info)
	}
	if self.file != nil {
		self.file <- fmt.Sprintf("Warn %s %s",info)
	}
}
func (self *Logger) Info(info interface{}) {
	if self.info && self.console {
		fmt.Println("Info",info)
	}
	if self.file != nil {
		self.file <- fmt.Sprintf("Info %s %s",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,false,10)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer log.Close()
	for i := 0; i < b.N; i++ {
		log.Warn("Nima")
	}
}

大佬总结

以上是大佬教程为你收集整理的Go语言自己实现的异步小log程序.全部内容,希望文章能够帮你解决Go语言自己实现的异步小log程序.所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。