简单使用和模拟golang的日志库的功能

简单模拟golang的日志库的功能

package main

import (
    "os"
        "io"
    "fmt"
        "log"
    "bytes"
    "strconv"
    "sync"
    "time"
)

func main() {
    //1 基本的写入
    //tlog()
    //2 写一个类似输出的日志的类
    tlog2()
}

func tlog2(){
    logTest := NewLogTest(new(WriterData))
    logTest.WriteStr("abc")

    var wg sync.WaitGroup
    for i:=0;i< 100;i++{
        wg.Add(1)
        go writeLog(logTest, "i="+strconv.Itoa(i)+"\n", &wg)
    }
    time.Sleep(time.Second *1)
    wg.Wait()

    defer logTest.destroy()

}

func writeLog(logTest *LogTest, str string,wg *sync.WaitGroup){
    wg.Done()
    logTest.WriteStr(str)

}

type LogTest struct {
    logdata chan  interface{}
    writer io.Writer
    quiteChan chan struct{}
}

func NewLogTest(w io.Writer) *LogTest{
    logTest := &LogTest{
        writer:w,
        logdata:make(chan  interface{}, 1024),
        quiteChan:make(chan struct{}),
    }
    go logTest.start()
    return logTest
}

func (logTest *LogTest)start(){
    //获取日志数据
LOOP:
    for{
        select {
        case data := <-logTest.logdata:
            byteData,ok := data.([]byte)
            if ok{
                logTest.writer.Write(byteData)
            }
            case <- logTest.quiteChan:
                break LOOP
        }
    }
    //处理
    for{
        if (len(logTest.logdata)) == 0{
            break
        }
        data := <-logTest.logdata
        byteData,ok := data.([]byte)
        if ok{
            logTest.Write(byteData)
        }
    }

}

func (logTest *LogTest) destroy(){
    close(logTest.logdata)
    close(logTest.quiteChan)
}

func (logTest *LogTest) close(){
    logTest.quiteChan <- struct{}{}
}

func (logTest *LogTest)Write(data []byte){
    logTest.logdata <- data
}

func (logTest *LogTest)WriteStr(data string){
    logTest.Write([]byte(data))
}


/**
    定义一个可消费的log

 */

type WriterData struct{
}

func (writerData *WriterData)Write(p []byte) (n int, err error){
    return os.Stdout.Write(p)
}


/**
日志的基本使用
 */
func tlog(){

    var buf bytes.Buffer
    log.New(&buf,"",log.Ltime|log.Ldate)
    log.Print("abc")

    fmt.Println(&buf)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值