我正在尝试为 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 回答
![?](http://img1.sycdn.imooc.com/5c4aa098000126bb09600960-100-100.jpg)
繁星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,
}
}
- 1 回答
- 0 关注
- 102 浏览
添加回答
举报
0/150
提交
取消