package main //import "time" import "os" import "github.com/romana/rlog" func someRecursiveFunction(x int) { // The Trace log functions allow you to set a log level with a numeric // level, which could be determined at run time. Here, we are tracing or // logging the first few levels of the recursive function (to whatever // levels was determined via the RLOG_TRACE_LEVEL variable), but after that // will stop logging, even though the function itself may decend further. rlog.Tracef(x, "We're %d levels down now...", x) if x < 10 { someRecursiveFunction(x + 1) } else { rlog.Infof("Reached end of recursion at level %d", x) } } func main() { // Show different log levels rlog.Info("Start of program") rlog.Info("rlog is controlled via environment variables.") rlog.Info("Try the following settings:") rlog.Info(" export RLOG_LOG_LEVEL=DEBUG") rlog.Info(" export RLOG_TRACE_LEVEL=5") rlog.Info(" export RLOG_CALLER_INFO=yes") rlog.Debug("You only see this if you did 'export RLOG_LOG_LEVEL=DEBUG'") rlog.Infof("Format %s are possible %d", "strings", 123) rlog.Warn("Warning level log message") rlog.Error("Error level log message") rlog.Critical("Critical level log message") // Example of how to change settings programmatically from within // the running program: Modify your own environment variables. // Note that if the config file specifies the value with a '!' then // this value cannot be changed by modifying the environment variable. rlog.Debug("You can't see this if the log level is higher than DEBUG.") os.Setenv("RLOG_LOG_LEVEL", "DEBUG") rlog.UpdateEnv() rlog.Debug("You can see this message, because we changed level to DEBUG.") // Example of selective trace logging rlog.Trace(1, "Trace messages have their own numeric levels") rlog.Trace(1, "To see them set RLOG_TRACE_LEVEL to the cut-off number") someRecursiveFunction(1) // Example of redirecting log output to a new file at runtime newLogFile, err := os.OpenFile("/tmp/rlog-output.log", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777) if err == nil { rlog.Info("About to change log output. Check /tmp/rlog-output.log...") rlog.SetOutput(newLogFile) rlog.Info("This should go to the new logfile") } // Now redirecting it back to stderr. Any additional file logging will be // closed with this call. rlog.SetOutput(os.Stderr) rlog.Info("Back to stderr") // To test out changing the log configuration of a running process, set the // RLOG_CONF_FILE environment variable to an absolute path for a // configuration file that you can create and edit. Also, you might want to // set RLOG_CONF_CHECK_INTERVAL to a smaller number, so you don't have to // wait 15 seconds every time you change a setting. // Then uncomment the loop below (and the 'time' import at the top) and run // the example program. /* rlog.SetConfFile("some-other-rlog.conf") for { time.Sleep(time.Second * 1) rlog.Debug("A debug log message") rlog.Info("An info log message") } */ }