@marcel91200 / caddy Mirror · read-only / commits / bf8c3c25
Fork 0

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

Mirrored from https://github.com/Slazee/caddy.git

Synced Nov 14, 05:15 UTC

log: improve rounding logic for log rolling directives (#3367)

* For `roll_size` and `roll_keep_for` directives, round up instead of down. For example, if a user wants to be able to look back on 36 hours of logs, but you must round to a 24-hour multiple, then it's better to round up to 48 hours (which includes the desired 36 hours) instead of down to 24 hours. * `roll_size` had an off-by-one error that caused the size to be as much as 1 MB larger than requested. For example, requests of `1MB` and `1.1MB` both became 2 MB. Now `1MB` means 1 MB, and `1.1MB` is rounded up to 2 MB.

Jeremy Lin committed May 7, 2020 at 12:06 UTC bf8c3c25c1631360133137e8e9d30ca158c6cb73
1 file changed +15 -4
modules/logging/filewriter.go
+15 -4
@@ -17,6 +17,7 @@ package logging
17 import (
18 "fmt"
19 "io"
20 + "math"
21 "os"
22 "path/filepath"
23 "strconv"
@@ -138,8 +139,15 @@ func (fw FileWriter) OpenWriter() (io.WriteCloser, error) {
139 // roll_keep_for <days>
140 // }
141 //
141 -// The roll_size value will be rounded down to number of megabytes (MiB).
142 -// The roll_keep_for duration will be rounded down to number of days.
142 +// The roll_size value has megabyte resolution.
143 +// Fractional values are rounded up to the next whole megabyte (MiB).
144 +//
145 +// The roll_keep_for duration has day resolution.
146 +// Fractional values are rounded up to the next whole number of days.
147 +//
148 +// If any of the roll_size, roll_keep, or roll_keep_for subdirectives are
149 +// omitted or set to a zero value, then Caddy's default value for that
150 +// subdirective is used.
151 func (fw *FileWriter) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
152 for d.Next() {
153 if !d.NextArg() {
@@ -168,7 +176,7 @@ func (fw *FileWriter) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
176 if err != nil {
177 return d.Errf("parsing size: %v", err)
178 }
171 - fw.RollSizeMB = int(size)/1024/1024 + 1
179 + fw.RollSizeMB = int(math.Ceil(float64(size) / humanize.MiByte))
180
181 case "roll_keep":
182 var keepStr string
@@ -190,7 +198,10 @@ func (fw *FileWriter) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
198 if err != nil {
199 return d.Errf("parsing roll_keep_for duration: %v", err)
200 }
193 - fw.RollKeepDays = int(keepFor.Hours()) / 24
201 + if keepFor < 0 {
202 + return d.Errf("negative roll_keep_for duration: %v", keepFor)
203 + }
204 + fw.RollKeepDays = int(math.Ceil(keepFor.Hours() / 24))
205 }
206 }
207 }