aboutsummaryrefslogtreecommitdiff
path: root/middleware/pkg/roller/roller.go
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/pkg/roller/roller.go')
-rw-r--r--middleware/pkg/roller/roller.go62
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,
+ }
+}