65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package httpserver
|
|
|
|
import (
|
|
"io"
|
|
"strconv"
|
|
|
|
"github.com/mholt/caddy"
|
|
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
|
)
|
|
|
|
// LogRoller implements a type 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,
|
|
}
|
|
}
|
|
|
|
// ParseRoller parses roller contents out of c.
|
|
func ParseRoller(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
|
|
}
|