替换Go默认日志的*os.File
我正在尝试为Go的内置记录器编写一个包装器。 这是为了具有兼容性替换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
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方法中得到的任何内容,直到看到换行符,然后使用整行调用函数。