Created
October 6, 2015 16:40
-
-
Save apokalyptik/d51defb9413870a47902 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"bufio" | |
"flag" | |
"fmt" | |
"io" | |
"log" | |
"os" | |
) | |
var doTimeStamp = true | |
var doTee = true | |
var toFile = "/tmp/output.log" | |
var logFP *os.File | |
func init() { | |
flag.BoolVar(&doTimeStamp, "ts", doTimeStamp, "add timestamps to output") | |
flag.BoolVar(&doTee, "tee", doTee, "act like tee (echo input to stdout") | |
flag.StringVar(&toFile, "f", toFile, "filename to write") | |
} | |
func main() { | |
flag.Parse() | |
if _, err := os.Stat(toFile); err == nil { | |
var filename = toFile | |
for i := uint(0); i < ^uint(0); i++ { | |
filename = fmt.Sprintf("%s.%d", toFile, i) | |
if _, err := os.Stat(filename); os.IsNotExist(err) { | |
toFile = filename | |
break | |
} | |
} | |
} | |
if fp, err := os.Create(toFile); err != nil { | |
log.Fatal(err) | |
} else { | |
logFP = fp | |
} | |
fmt.Printf("Writing to %s\n\n", toFile) | |
var writeTo io.Writer | |
if doTee { | |
writeTo = io.MultiWriter(logFP, os.Stdout) | |
} else { | |
writeTo = logFP | |
} | |
log.SetOutput(writeTo) | |
if doTimeStamp { | |
log.SetFlags(log.Ldate | log.Lmicroseconds) | |
} else { | |
log.SetFlags(0) | |
} | |
stdin := bufio.NewReader(os.Stdin) | |
for { | |
if line, err := stdin.ReadString('\n'); err == nil { | |
log.Print(line) | |
} else { | |
if line != "" { | |
log.Print(line) | |
} | |
if err != io.EOF { | |
log.SetOutput(os.Stderr) | |
log.Fatal(err) | |
} | |
return | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This little utility will redirect stdin to the specified file,
/tmp/output.log
by default. If that file exists it will write to/tmp/output.log.0
, if that exists to/tmp/output.log.1
,/tmp/output.log.2
, and so on. That way you can reuse a single command and not accidentally lose previously logged data when you forget to change the filename on your redirects... By default it also prepends every line with a timestamp, such as2015/10/06 16:43:27.355453
which is handy when trying to objectively tell whether something happened slower or faster on a given execution than in other logs, or other times in the same log...