запись в лог с 1) настраиваемым конфигом и 2) дровосеком - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь создать настроенный zap logger с 1) настроенными *zap.Config и 2) lumberjack, но не могу найти подходящий пример для применения обеих конфигураций.

, поскольку config.Build делаетне принимать WriteSync в качестве ввода.Вы знаете, как этого добиться?

func genBaseLoggerZap() Logger {
    ex, err := os.Executable()
    if err != nil {
        Fatalf("Failed to get os.Executable, err: %v", err)
    }
    zlManager.outputPath = path.Join(filepath.Dir(ex), zlManager.outputPath)
        // Want to add sync here..
    zapcore.AddSync(&lumberjack.Logger{
        Filename:   zlManager.outputPath + "123",
        MaxSize:    500,
        MaxBackups: 10,
        MaxAge:     28,
    })
    return genLoggerZap(BaseLogger, genDefaultConfig())
}

// genLoggerZap creates a zapLogger with given ModuleID and Config.
func genLoggerZap(mi ModuleID, cfg *zap.Config) Logger {
    logger, err := cfg.Build()
    if err != nil {
        Fatalf("Failed to generate zap logger, err: %v", err)
    }
    newLogger := &zapLogger{mi, cfg, logger.Sugar()}
    newLogger.register()
    return newLogger
}

1 Ответ

0 голосов
/ 28 января 2019

Пользовательские журналы можно добавить с помощью функции zap.RegisterSink и поля Config.OutputPaths.RegisterSink сопоставляет схемы URL с конструкторами Sink, а OutputPaths настраивает назначения журналов (закодированные как URL).

Удобно, что *lumberjack.Logger уже реализует почти весь интерфейс zap.Sink.Отсутствует только метод Sync, который можно легко добавить с помощью типа тонкой оболочки.

package main

import (
    "net/url"

    "go.uber.org/zap"
    lumberjack "gopkg.in/natefinch/lumberjack.v2"
)

type lumberjackSink struct {
    *lumberjack.Logger
}

// Sync implements zap.Sink. The remaining methods are implemented 
// by the embedded *lumberjack.Logger.
func (lumberjackSink) Sync() error { return nil }

func main() {
    zap.RegisterSink("lumberjack", func(u *url.URL) (zap.Sink, error) {
        return lumberjackSink{
            Logger: &lumberjack.Logger{
                Filename: u.Opaque,

                // Use query parameters or hardcoded values for remaining
                // fields.
            },
        }, nil
    })

    config := zap.NewProductionConfig()

    // Add a URL with the "lumberjack" scheme.
    config.OutputPaths = append(config.OutputPaths, "lumberjack:foo.log")

    log, _ := config.Build()
    log.Info("test", zap.String("foo", "bar"))
}
...