github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/logsink/filewriter.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package logsink 5 6 import ( 7 "io" 8 "os" 9 10 "github.com/juju/errors" 11 "github.com/juju/utils" 12 "gopkg.in/natefinch/lumberjack.v2" 13 ) 14 15 // NewFileWriter returns an io.WriteCloser that will write log messages to disk. 16 func NewFileWriter(logPath string) (io.WriteCloser, error) { 17 if err := primeLogFile(logPath); err != nil { 18 // This isn't a fatal error so log and continue if priming fails. 19 logger.Warningf("Unable to prime %s (proceeding anyway): %v", logPath, err) 20 } 21 return &lumberjack.Logger{ 22 Filename: logPath, 23 MaxSize: 300, // MB 24 MaxBackups: 2, 25 Compress: true, 26 }, nil 27 } 28 29 // primeLogFile ensures the logsink log file is created with the 30 // correct mode and ownership. 31 func primeLogFile(path string) error { 32 f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0600) 33 if err != nil { 34 return errors.Trace(err) 35 } 36 f.Close() 37 err = utils.ChownPath(path, "syslog") 38 return errors.Trace(err) 39 }