| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | package middleware
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							|  |  |  | 	"io"
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 	"strconv"
 | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 	"github.com/mholt/caddy"
 | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 	"gopkg.in/natefinch/lumberjack.v2"
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 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
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | // 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,
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 |