猿问

替换 Go 默认日志的 *os.File

我正在尝试为 Go 的内置记录器编写一个包装器。这就是要有相容性。


package main


import (

    "log"

    "os"

)


var(

    mylog *log.Logger

)


func main() {

    mylog = log.New(os.Stdout, "", 0)

    mylog.Printf("test")

}

我不想使用os.Stdout,而是想创建一个东西。与os.Stdout类似,但打印时带有如下前缀。


package main


import( 

    "log"

    "mylibrary"

)


var(

    mylog *log.Logger

)


func main() {

    mylog = log.New(mylibrary.Prefix, "", 0)

    mylog.Printf("test")

}

基本上,我仍然希望在拥有自定义日志的同时拥有*log.Logger。有人可以提示我如何使它起作用吗?


目前,我正在使用以下方法来做到这一点。但我敢打赌有更好的方法。


func NewIoWriter(f func(string)) *io.PipeWriter {

    r, w := io.Pipe()

    go func() {

        scanner := bufio.NewScanner(r)

        for scanner.Scan() {

            f(scanner.Text())

        }

        if err := scanner.Err(); err != nil {

            f(err.Error())

        }

        r.Close()

    }()

    runtime.SetFinalizer(w, (*io.PipeWriter).Close)

    return w

}

让它工作的更好方法是什么?


鸿蒙传说
浏览 103回答 1
1回答

繁星coding

这样的事情怎么样:type myLogWriter struct {    logFunc func(string)    line    string}func (w *myLogWriter) Write(b []byte) (int, error) {    l := len(b)    for len(b) != 0 {        i := bytes.Index(b, []byte{'\n'})        if i == -1 {            w.line += string(b)            break        } else {            w.logFunc(w.line + string(b[:i]))            b = b[i+1:]            w.line = ""        }    }    return l, nil}func NewLogWriter(f func(string)) *myLogWriter {    return &myLogWriter{        logFunc: f,    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答