(now time.Time, subdir, suffix, logFileOverride string, maxFiles int, maxSizeMB float64, maxAge time.Duration)
| 196 | } |
| 197 | |
| 198 | func (c *loggingFlags) setupLogFileBasedLogger(now time.Time, subdir, suffix, logFileOverride string, maxFiles int, maxSizeMB float64, maxAge time.Duration) zapcore.WriteSyncer { |
| 199 | var logFileName, symlinkName string |
| 200 | |
| 201 | if logFileOverride != "" { |
| 202 | var err error |
| 203 | |
| 204 | logFileName, err = filepath.Abs(logFileOverride) |
| 205 | if err != nil { |
| 206 | fmt.Fprintln(os.Stderr, "Unable to resolve logs path", err) |
| 207 | } |
| 208 | } |
| 209 | |
| 210 | if logFileName == "" { |
| 211 | logBaseName := fmt.Sprintf("%v%v-%v-%v%v", logFileNamePrefix, now.Format("20060102-150405"), os.Getpid(), suffix, logFileNameSuffix) |
| 212 | logFileName = filepath.Join(c.logDir, subdir, logBaseName) |
| 213 | symlinkName = "latest.log" |
| 214 | } |
| 215 | |
| 216 | logDir := filepath.Dir(logFileName) |
| 217 | logFileBaseName := filepath.Base(logFileName) |
| 218 | |
| 219 | if err := os.MkdirAll(logDir, logsDirMode); err != nil { |
| 220 | fmt.Fprintln(os.Stderr, "Unable to create logs directory:", err) |
| 221 | } |
| 222 | |
| 223 | if err := cachedir.WriteCacheMarker(logDir); err != nil { |
| 224 | fmt.Fprintf(os.Stderr, "Unable to create cache marker in log directory %q: %s", logDir, err) |
| 225 | } |
| 226 | |
| 227 | sweepLogWG := &sync.WaitGroup{} |
| 228 | doSweep := func() {} |
| 229 | |
| 230 | // do not scrub directory if custom log file has been provided. |
| 231 | if logFileOverride == "" && shouldSweepLog(maxFiles, maxAge) { |
| 232 | doSweep = func() { |
| 233 | sweepLogDir(context.TODO(), logDir, maxFiles, maxSizeMB, maxAge) |
| 234 | } |
| 235 | } |
| 236 | |
| 237 | odf := &onDemandFile{ |
| 238 | logDir: logDir, |
| 239 | logFileBaseName: logFileBaseName, |
| 240 | symlinkName: symlinkName, |
| 241 | maxSegmentSize: c.logFileMaxSegmentSize, |
| 242 | startSweep: func() { sweepLogWG.Go(doSweep) }, |
| 243 | } |
| 244 | |
| 245 | if c.waitForLogSweep { |
| 246 | // wait for log sweep at the end |
| 247 | c.cliApp.RegisterOnExit(odf.closeSegmentAndSweep) |
| 248 | c.cliApp.RegisterOnExit(sweepLogWG.Wait) |
| 249 | } else { |
| 250 | // old behavior: start log sweep in parallel to program but don't wait at the end. |
| 251 | odf.startSweep() |
| 252 | } |
| 253 | |
| 254 | return odf |
| 255 | } |
no test coverage detected