Замена для * os.File of Go по умолчанию журнала - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь написать оболочку для встроенного регистратора 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
}

Какой лучший способ заставить его работать?

Спасибо

1 Ответ

1 голос
/ 12 мая 2019

Как насчет этого:

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

См. https://play.golang.org/p/L6PG1gCK1er.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...