// timestamped adds a timestamp to the beginning of log lines func timestamped(orig io.Writer) io.Writer { return wfilter.SimplePrepender(orig, func(w io.Writer) (int, error) { ts := time.Now() runningSecs := ts.Sub(processStart).Seconds() secs := int(math.Mod(runningSecs, 60)) mins := int(runningSecs / 60) return fmt.Fprintf(w, "%s - %dm%ds ", ts.In(time.UTC).Format(logTimestampFormat), mins, secs) }) }
func Init() error { logdir := appdir.Logs("Lantern") log.Debugf("Placing logs in %v", logdir) if _, err := os.Stat(logdir); err != nil { if os.IsNotExist(err) { // Create log dir if err := os.MkdirAll(logdir, 0755); err != nil { return fmt.Errorf("Unable to create logdir at %s: %s", logdir, err) } } } logFile = rotator.NewSizeRotator(filepath.Join(logdir, "lantern.log")) // Set log files to 4 MB logFile.RotationSize = 4 * 1024 * 1024 // Keep up to 5 log files logFile.MaxRotation = 5 // Loggly has its own timestamp so don't bother adding it in message, // moreover, golog always write each line in whole, so we need not to care about line breaks. // timestamped adds a timestamp to the beginning of log lines timestamped := func(orig io.Writer) io.Writer { return wfilter.SimplePrepender(orig, func(w io.Writer) (int, error) { ts := time.Now() runningSecs := ts.Sub(processStart).Seconds() secs := int(math.Mod(runningSecs, 60)) mins := int(runningSecs / 60) return fmt.Fprintf(w, "%s - %dm%ds ", ts.In(time.UTC).Format(logTimestampFormat), mins, secs) }) } errorOut = timestamped(NonStopWriter(os.Stderr, logFile)) debugOut = timestamped(NonStopWriter(os.Stdout, logFile)) golog.SetOutputs(errorOut, debugOut) return nil }