我正在嘗試為 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,
? ? }
}
- 1 回答
- 0 關注
- 130 瀏覽
添加回答
舉報
0/150
提交
取消