From f4aaec9ce54a7e8f4a306deed3728fc50ac5d67b Mon Sep 17 00:00:00 2001
From: dcpu <42736967+dcpu@users.noreply.github.com>
Date: Mon, 3 Sep 2018 02:11:09 +0900
Subject: [PATCH] log: Add --log-format flag - fixes #2424

---
 docs/content/docs.md |  4 ++++
 fs/log.go            |  2 +-
 fs/log/log.go        | 23 +++++++++++++++++++++++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/docs/content/docs.md b/docs/content/docs.md
index c7e9df186..ebf9e2b1a 100644
--- a/docs/content/docs.md
+++ b/docs/content/docs.md
@@ -549,6 +549,10 @@ Note that if you are using the `logrotate` program to manage rclone's
 logs, then you should use the `copytruncate` option as rclone doesn't
 have a signal to rotate logs.
 
+### --log-format LIST ###
+
+Comma separated list of log format options. `date`, `time`, `microseconds`, `longfile`, `shortfile`, `UTC`.  The default is "`date`,`time`". 
+
 ### --log-level LEVEL ###
 
 This sets the log level for rclone.  The default log level is `NOTICE`.
diff --git a/fs/log.go b/fs/log.go
index 94f61b9a0..83d6a6f5a 100644
--- a/fs/log.go
+++ b/fs/log.go
@@ -70,7 +70,7 @@ func (l *LogLevel) Type() string {
 // LogPrint sends the text to the logger of level
 var LogPrint = func(level LogLevel, text string) {
 	text = fmt.Sprintf("%-6s: %s", level, text)
-	log.Print(text)
+	_ = log.Output(4, text)
 }
 
 // LogPrintf produces a log string from the arguments passed in
diff --git a/fs/log/log.go b/fs/log/log.go
index 43814defe..d7219528f 100644
--- a/fs/log/log.go
+++ b/fs/log/log.go
@@ -16,6 +16,7 @@ import (
 // Flags
 var (
 	logFile        = flags.StringP("log-file", "", "", "Log everything to this file")
+	logFormat      = flags.StringP("log-format", "", "date,time", "Comma separated list of log format options")
 	useSyslog      = flags.BoolP("syslog", "", false, "Use Syslog for logging")
 	syslogFacility = flags.StringP("syslog-facility", "", "DAEMON", "Facility for syslog, eg KERN,USER,...")
 )
@@ -66,6 +67,28 @@ func Trace(o interface{}, format string, a ...interface{}) func(string, ...inter
 
 // InitLogging start the logging as per the command line flags
 func InitLogging() {
+	flagsStr := "," + *logFormat + ","
+	var flags int
+	if strings.Contains(flagsStr, ",date,") {
+		flags |= log.Ldate
+	}
+	if strings.Contains(flagsStr, ",time,") {
+		flags |= log.Ltime
+	}
+	if strings.Contains(flagsStr, ",microseconds,") {
+		flags |= log.Lmicroseconds
+	}
+	if strings.Contains(flagsStr, ",longfile,") {
+		flags |= log.Llongfile
+	}
+	if strings.Contains(flagsStr, ",shortfile,") {
+		flags |= log.Lshortfile
+	}
+	if strings.Contains(flagsStr, ",UTC,") {
+		flags |= log.LUTC
+	}
+	log.SetFlags(flags)
+
 	// Log file output
 	if *logFile != "" {
 		f, err := os.OpenFile(*logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0640)