mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-11-04 03:27:23 -05:00 
			
		
		
		
	Merge pull request #1404 from mholt/combinedrollers
Create only one log roller per file across whole process (fixes #1363)
This commit is contained in:
		
						commit
						d8f92baee2
					
				@ -2,6 +2,7 @@ package httpserver
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/mholt/caddy"
 | 
						"github.com/mholt/caddy"
 | 
				
			||||||
@ -19,14 +20,30 @@ type LogRoller struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetLogWriter returns an io.Writer that writes to a rolling logger.
 | 
					// GetLogWriter returns an io.Writer that writes to a rolling logger.
 | 
				
			||||||
 | 
					// This should be called only from the main goroutine (like during
 | 
				
			||||||
 | 
					// server setup) because this method is not thread-safe; it is careful
 | 
				
			||||||
 | 
					// to create only one log writer per log file, even if the log file
 | 
				
			||||||
 | 
					// is shared by different sites or middlewares. This ensures that
 | 
				
			||||||
 | 
					// rolling is synchronized, since a process (or multiple processes)
 | 
				
			||||||
 | 
					// should not create more than one roller on the same file at the
 | 
				
			||||||
 | 
					// same time. See issue #1363.
 | 
				
			||||||
func (l LogRoller) GetLogWriter() io.Writer {
 | 
					func (l LogRoller) GetLogWriter() io.Writer {
 | 
				
			||||||
	return &lumberjack.Logger{
 | 
						absPath, err := filepath.Abs(l.Filename)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							absPath = l.Filename // oh well, hopefully they're consistent in how they specify the filename
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						lj, has := lumberjacks[absPath]
 | 
				
			||||||
 | 
						if !has {
 | 
				
			||||||
 | 
							lj = &lumberjack.Logger{
 | 
				
			||||||
			Filename:   l.Filename,
 | 
								Filename:   l.Filename,
 | 
				
			||||||
			MaxSize:    l.MaxSize,
 | 
								MaxSize:    l.MaxSize,
 | 
				
			||||||
			MaxAge:     l.MaxAge,
 | 
								MaxAge:     l.MaxAge,
 | 
				
			||||||
			MaxBackups: l.MaxBackups,
 | 
								MaxBackups: l.MaxBackups,
 | 
				
			||||||
			LocalTime:  l.LocalTime,
 | 
								LocalTime:  l.LocalTime,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							lumberjacks[absPath] = lj
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return lj
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ParseRoller parses roller contents out of c.
 | 
					// ParseRoller parses roller contents out of c.
 | 
				
			||||||
@ -62,3 +79,7 @@ func ParseRoller(c *caddy.Controller) (*LogRoller, error) {
 | 
				
			|||||||
		LocalTime:  true,
 | 
							LocalTime:  true,
 | 
				
			||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// lumberjacks maps log filenames to the logger
 | 
				
			||||||
 | 
					// that is being used to keep them rolled/maintained.
 | 
				
			||||||
 | 
					var lumberjacks = make(map[string]*lumberjack.Logger)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user