diff options
Diffstat (limited to 'middleware/pkg/roller/roller.go')
-rw-r--r-- | middleware/pkg/roller/roller.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/middleware/pkg/roller/roller.go b/middleware/pkg/roller/roller.go new file mode 100644 index 000000000..c60494736 --- /dev/null +++ b/middleware/pkg/roller/roller.go @@ -0,0 +1,62 @@ +package roller + +import ( + "io" + "strconv" + + "github.com/mholt/caddy" + "gopkg.in/natefinch/lumberjack.v2" +) + +func Parse(c *caddy.Controller) (*LogRoller, error) { + var size, age, keep int + // This is kind of a hack to support nested blocks: + // As we are already in a block: either log or errors, + // c.nesting > 0 but, as soon as c meets a }, it thinks + // the block is over and return false for c.NextBlock. + for c.NextBlock() { + what := c.Val() + if !c.NextArg() { + return nil, c.ArgErr() + } + value := c.Val() + var err error + switch what { + case "size": + size, err = strconv.Atoi(value) + case "age": + age, err = strconv.Atoi(value) + case "keep": + keep, err = strconv.Atoi(value) + } + if err != nil { + return nil, err + } + } + return &LogRoller{ + MaxSize: size, + MaxAge: age, + MaxBackups: keep, + LocalTime: true, + }, nil +} + +// LogRoller implements a middleware that provides a rolling logger. +type LogRoller struct { + Filename string + MaxSize int + MaxAge int + MaxBackups int + LocalTime bool +} + +// GetLogWriter returns an io.Writer that writes to a rolling logger. +func (l LogRoller) GetLogWriter() io.Writer { + return &lumberjack.Logger{ + Filename: l.Filename, + MaxSize: l.MaxSize, + MaxAge: l.MaxAge, + MaxBackups: l.MaxBackups, + LocalTime: l.LocalTime, + } +} |