1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
// ログをファイルと標準出力に出して、ログファイルはローテーションする // Output the log to a file and standard output, and rotate the log file package main import ( "io" "os" "path/filepath" "runtime" "syscall" log "github.com/sirupsen/logrus" "gopkg.in/natefinch/lumberjack.v2" ) func init() { exePath, err := os.Executable() if err != nil { log.Fatal(err) } logPath := filepath.Join(filepath.Dir(exePath), "log") if err = makeDirAll(logPath); err != nil { log.Fatalln(err) } basename := filepath.Base(exePath) logPath = filepath.Join(logPath, basename[:len(basename)-len(filepath.Ext(basename))]+".log") logger := lumberjack.Logger{ Filename: logPath, MaxSize: 3, // MB MaxBackups: 3, MaxAge: 28, // days Compress: true, } if runtime.GOOS == "windows" { // -ldflags="-H windowsgui" 指定の場合 // io.MultiWriter(os.Stdout, &logger) を利用すると log ファイルに出力されない log.SetOutput(&logger) } else { // 複数の出力先を指定 log.SetOutput(io.MultiWriter(os.Stdout, &logger)) } log.SetReportCaller(true) log.SetFormatter(&log.TextFormatter{DisableColors: true}) } // working windows? func makeDirAll(path string) error { if _, err := os.Stat(path); err != nil && os.IsNotExist(err) { defaultUmask := syscall.Umask(0) err := os.MkdirAll(path, 0755) syscall.Umask(defaultUmask) return err } return nil } func main() { log.Infoln("start logging") log.Warnln("warn") log.Errorln("error") } |
—