为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
鸿蒙传说 2023-06-19 14:01:18
我正在尝试为 Go 的内置记录器编写一个包装器。这就是要有相容性。package mainimport (    "log"    "os")var(    mylog *log.Logger)func main() {    mylog = log.New(os.Stdout, "", 0)    mylog.Printf("test")}我不想使用os.Stdout,而是想创建一个东西。与os.Stdout类似,但打印时带有如下前缀。package mainimport(     "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}让它工作的更好方法是什么?
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

这样的事情怎么样:


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,

    }

}

查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信