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

替换Go默认日志的*os.File,go,logging,types,Go,Logging,Types,我正在尝试为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 i

我正在尝试为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
}
有什么更好的办法让它发挥作用


谢谢

像这样的东西怎么样:

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,
    }
}

看。

我认为你应该可以不用管道和goroutine,用一个作家来完成这件事。您必须收集Write方法中得到的任何内容,直到看到换行符,然后使用整行调用函数。