package log // implements 'daemon' mode so switches to fmt // instead of log so that timestamps are not printed twice import ( "fmt" "io" reallog "log" "net/http" "time" ) func DaemonMode(b bool) { daemonMode = b } var captureMode io.Writer func CaptureMode(w io.Writer) { captureMode = w } var flusher http.Flusher func HttpMode(w http.ResponseWriter) { var ok bool httpMode = w if w == nil { flusher = nil return } flusher, ok = w.(http.Flusher) if !ok { http.Error(w, "Streaming unsupported!", http.StatusInternalServerError) flusher = nil return } } func DaemonShow() bool { if daemonMode { fmt.Println("daemonMode=true") return true } else { fmt.Println("daemonMode=false") return false } } func realPrintln(a ...any) { if daemonMode { // in daemon mode, don't put timestamps on each line if captureMode == nil { fmt.Println(a...) } else { fmt.Fprintln(captureMode, a...) } } else { // put timestamps on each line if captureMode == nil { reallog.Println(a...) } else { // TODO: add datestamp fmt.Fprintln(captureMode, a...) } } if httpMode != nil { now := time.Now() timestamp := now.Format("2006/01/02 15:04:05") // bummer. other date doesn't work? s := timestamp + " " + fmt.Sprint(a...) fmt.Fprintln(httpMode, s) if flusher != nil { flusher.Flush() // Flush the data to the client } } } func realPrintf(s string, a ...any) { if daemonMode { // in daemon mode, don't put timestamps on each line if captureMode == nil { fmt.Printf(s, a...) } else { fmt.Fprintf(captureMode, s, a...) } } else { // put timestamps on each line if captureMode == nil { reallog.Printf(s, a...) } else { fmt.Fprintf(captureMode, s, a...) } } if httpMode != nil { now := time.Now() timestamp := now.Format("2006/01/02 15:04:05") // bummer. other date doesn't work? s := timestamp + " " + fmt.Sprintf(s, a...) fmt.Fprintln(httpMode, s) if flusher != nil { flusher.Flush() // Flush the data to the client } } } func realSprint(a ...any) string { return fmt.Sprint(a...) } func realSprintf(s string, a ...any) string { return fmt.Sprintf(s, a...) } func realSprintln(a ...any) string { return fmt.Sprintln(a...) } func realFatalln(a ...any) { reallog.Fatalln(a...) } func realFatalf(s string, a ...any) { reallog.Fatalf(s, a...) } func realFatal(s string, a ...any) { reallog.Fatalf(s, a...) }