func addLoggly(logglyWriter io.Writer) { if runtime.GOOS == "android" { golog.SetOutputs(logglyWriter, os.Stdout) } else { golog.SetOutputs(NonStopWriter(errorOut, logglyWriter), debugOut) } }
func TestLoggly(t *testing.T) { var buf bytes.Buffer var result map[string]interface{} loggly := loggly.New("token not required") loggly.Writer = &buf lw := logglyErrorWriter{client: loggly} golog.SetOutputs(lw, nil) log := golog.LoggerFor("test") log.Error("") if assert.NoError(t, json.Unmarshal(buf.Bytes(), &result), "Unmarshal error") { assert.Equal(t, "ERROR test", result["locationInfo"]) assert.Regexp(t, regexp.MustCompile("logging_test.go:([0-9]+)"), result["message"]) } buf.Reset() log.Error("short message") if assert.NoError(t, json.Unmarshal(buf.Bytes(), &result), "Unmarshal error") { assert.Equal(t, "ERROR test", result["locationInfo"]) assert.Regexp(t, regexp.MustCompile("logging_test.go:([0-9]+) short message"), result["message"]) } buf.Reset() log.Error("message with: reason") if assert.NoError(t, json.Unmarshal(buf.Bytes(), &result), "Unmarshal error") { assert.Equal(t, "ERROR test", result["locationInfo"]) assert.Regexp(t, "logging_test.go:([0-9]+) message with: reason", result["message"]) } buf.Reset() log.Error("deep reason: message with: reason") if assert.NoError(t, json.Unmarshal(buf.Bytes(), &result), "Unmarshal error") { assert.Equal(t, "ERROR test", result["locationInfo"]) assert.Equal(t, "message with: reason", result["message"], "message should be last 2 chunks") } buf.Reset() log.Error("deep reason: an url https://a.com in message: reason") if assert.NoError(t, json.Unmarshal(buf.Bytes(), &result), "Unmarshal error") { assert.Equal(t, "an url https://a.com in message: reason", result["message"], "should not truncate url") } buf.Reset() log.Error("deep reason: an url 127.0.0.1:8787 in message: reason") if assert.NoError(t, json.Unmarshal(buf.Bytes(), &result), "Unmarshal error") { assert.Equal(t, "ERROR test", result["locationInfo"]) assert.Equal(t, "an url 127.0.0.1:8787 in message: reason", result["message"], "should not truncate url") } buf.Reset() longPrefix := "message with: really l" longMsg := longPrefix + strings.Repeat("o", 100) + "ng reason" log.Error(longMsg) if assert.NoError(t, json.Unmarshal(buf.Bytes(), &result), "Unmarshal error") { assert.Equal(t, "ERROR test", result["locationInfo"]) assert.Regexp(t, regexp.MustCompile("logging_test.go:([0-9]+) "+longPrefix+"(o+)"), result["message"]) assert.Equal(t, 100, len(result["message"].(string))) } }
func Init(instanceId string, version string, revisionDate string, logglyToken string) error { log.Tracef("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, "proxy.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. errorOut = timestamped{NonStopWriter(os.Stderr, logFile)} debugOut = timestamped{NonStopWriter(os.Stdout, logFile)} golog.SetOutputs(errorOut, debugOut) if logglyToken != "" { logglyWriter := &logglyErrorWriter{ versionToLoggly: fmt.Sprintf("%v (%v)", version, revisionDate), client: loggly.New(logglyToken, logglyTag), } logglyWriter.client.Defaults["instanceid"] = instanceId addLoggly(logglyWriter) } return nil }
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 1 MB logFile.RotationSize = 1 * 1024 * 1024 // Keep up to 20 log files logFile.MaxRotation = 20 // 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. errorOut = timestamped(NonStopWriter(os.Stderr, logFile)) debugOut = timestamped(NonStopWriter(os.Stdout, logFile)) golog.SetOutputs(errorOut, debugOut) return nil }
func EnableFileLogging() 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 errorOut = timestamped(NonStopWriter(os.Stderr, logFile)) debugOut = timestamped(NonStopWriter(os.Stdout, logFile)) golog.SetOutputs(errorOut, debugOut) return nil }
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 }
func removeLoggly() { golog.SetOutputs(errorOut, debugOut) }
func addLoggly(logglyWriter io.Writer) { golog.SetOutputs(NonStopWriter(errorOut, logglyWriter), debugOut) }
func initLogging() { errorOut = timestamped(os.Stderr) debugOut = timestamped(os.Stdout) golog.SetOutputs(errorOut, debugOut) }