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  }