[logger] Add prefix identifier in logs for botanist.

This change modifies logger creation to allow for custom prefixes and, specifically, prepends "botanist" to related log entries.

Bug: IN-1171
Change-Id: I0f42e09e5008732275c8743ceb150770fa373655
diff --git a/cmd/botanist/main.go b/cmd/botanist/main.go
index fc085e1..906c04d 100644
--- a/cmd/botanist/main.go
+++ b/cmd/botanist/main.go
@@ -39,7 +39,7 @@
 
 	flag.Parse()
 
-	log := logger.NewLogger(level, color.NewColor(colors), os.Stdout, os.Stderr)
+	log := logger.NewLogger(level, color.NewColor(colors), os.Stdout, os.Stderr, "botanist ")
 	ctx := logger.WithLogger(context.Background(), log)
 	ctx = command.CancelOnSignals(ctx, syscall.SIGTERM)
 	os.Exit(int(subcommands.Execute(ctx)))
diff --git a/cmd/botanist/zedboot.go b/cmd/botanist/zedboot.go
index 42d85c1..0b765f8 100644
--- a/cmd/botanist/zedboot.go
+++ b/cmd/botanist/zedboot.go
@@ -17,7 +17,6 @@
 	"strings"
 	"time"
 
-	"fuchsia.googlesource.com/tools/tarutil"
 	"fuchsia.googlesource.com/tools/botanist/target"
 	"fuchsia.googlesource.com/tools/build"
 	"fuchsia.googlesource.com/tools/command"
@@ -25,6 +24,7 @@
 	"fuchsia.googlesource.com/tools/netutil"
 	"fuchsia.googlesource.com/tools/runner"
 	"fuchsia.googlesource.com/tools/runtests"
+	"fuchsia.googlesource.com/tools/tarutil"
 
 	"github.com/google/subcommands"
 )
@@ -195,7 +195,7 @@
 		return fmt.Errorf("failed to load target config file %q", cmd.configFile)
 	}
 	opts := target.Options{
-		Netboot:  cmd.netboot,
+		Netboot: cmd.netboot,
 	}
 
 	var devices []*target.DeviceTarget
diff --git a/cmd/buildidtool/main.go b/cmd/buildidtool/main.go
index 2324752..596816a 100644
--- a/cmd/buildidtool/main.go
+++ b/cmd/buildidtool/main.go
@@ -160,7 +160,7 @@
 }
 
 func main() {
-	l := logger.NewLogger(level, color.NewColor(colors), os.Stderr, os.Stderr)
+	l := logger.NewLogger(level, color.NewColor(colors), os.Stderr, os.Stderr, "")
 	// Parse flags and check for errors.
 	flag.Parse()
 	if buildIDDir == "" {
diff --git a/cmd/symbolize/main.go b/cmd/symbolize/main.go
index bee802c..8887c1e 100644
--- a/cmd/symbolize/main.go
+++ b/cmd/symbolize/main.go
@@ -93,7 +93,7 @@
 
 	// Setup logger and context
 	painter := color.NewColor(colors)
-	log := logger.NewLogger(level, painter, os.Stdout, os.Stderr)
+	log := logger.NewLogger(level, painter, os.Stdout, os.Stderr, "")
 	ctx := logger.WithLogger(context.Background(), log)
 
 	// Construct the nodes of the pipeline
diff --git a/logger/logger.go b/logger/logger.go
index 30bbc66..8dfb6e1 100644
--- a/logger/logger.go
+++ b/logger/logger.go
@@ -25,6 +25,7 @@
 	goLogger      *goLog.Logger
 	goErrorLogger *goLog.Logger
 	color         color.Color
+	prefix        string
 }
 
 type LogLevel int
@@ -79,7 +80,11 @@
 	return nil
 }
 
-func NewLogger(loggerLevel LogLevel, color color.Color, outWriter, errWriter io.Writer) *Logger {
+// NewLogger creates a new logger instance. The loggerLevel variable sets the log level for the logger.
+// The color variable specifies the visual color of displayed log output.
+// The outWriter and errWriter variables set the destination to which non-error and error data will be written.
+// The prefix appears on the same line directly preceding any log data.
+func NewLogger(loggerLevel LogLevel, color color.Color, outWriter, errWriter io.Writer, prefix string) *Logger {
 	if outWriter == nil {
 		outWriter = os.Stdout
 	}
@@ -91,12 +96,13 @@
 		goLogger:      goLog.New(outWriter, "", goLog.LstdFlags),
 		goErrorLogger: goLog.New(errWriter, "", goLog.LstdFlags),
 		color:         color,
+		prefix:        prefix,
 	}
 	return l
 }
 
 func (l *Logger) log(prefix, format string, a ...interface{}) {
-	l.goLogger.Printf("%s%s", prefix, fmt.Sprintf(format, a...))
+	l.goLogger.Printf("%s%s%s", l.prefix, prefix, fmt.Sprintf(format, a...))
 }
 
 func (l *Logger) Logf(loglevel LogLevel, format string, a ...interface{}) {
@@ -168,7 +174,7 @@
 
 func (l *Logger) Errorf(format string, a ...interface{}) {
 	if l.LoggerLevel >= ErrorLevel {
-		l.goErrorLogger.Printf("%s%s", l.color.Red("ERROR: "), fmt.Sprintf(format, a...))
+		l.goErrorLogger.Printf("%s%s%s", l.prefix, l.color.Red("ERROR: "), fmt.Sprintf(format, a...))
 	}
 }
 
@@ -178,7 +184,7 @@
 
 func (l *Logger) Fatalf(format string, a ...interface{}) {
 	if l.LoggerLevel >= FatalLevel {
-		l.goErrorLogger.Fatalf("%s%s", l.color.Red("FATAL: "), fmt.Sprintf(format, a...))
+		l.goErrorLogger.Fatalf("%s%s%s", l.prefix, l.color.Red("FATAL: "), fmt.Sprintf(format, a...))
 	}
 }
 
diff --git a/logger/logger_test.go b/logger/logger_test.go
index fa0ad70..daad642 100644
--- a/logger/logger_test.go
+++ b/logger/logger_test.go
@@ -10,7 +10,7 @@
 )
 
 func TestWithContext(t *testing.T) {
-	logger := NewLogger(DebugLevel, color.NewColor(color.ColorAuto), os.Stdout, os.Stderr)
+	logger := NewLogger(DebugLevel, color.NewColor(color.ColorAuto), os.Stdout, os.Stderr, "")
 	ctx := context.Background()
 	if v, ok := ctx.Value(globalLoggerKeyType{}).(*Logger); ok || v != nil {
 		t.Fatalf("Default context should not have globalLoggerKeyType. Expected: \nnil\n but got: \n%+v ", v)
@@ -23,11 +23,17 @@
 }
 
 func TestNewLogger(t *testing.T) {
-	logger := NewLogger(InfoLevel, color.NewColor(color.ColorAuto), nil, nil)
+	prefix := "testprefix "
+
+	logger := NewLogger(InfoLevel, color.NewColor(color.ColorAuto), nil, nil, prefix)
 	logFlags, errFlags := logger.goLogger.Flags(), logger.goErrorLogger.Flags()
 
 	if logFlags != goLog.LstdFlags || errFlags != goLog.LstdFlags {
 		t.Fatalf("New loggers should have the proper flags set for both standard and error logging. Expected: \n%+v and %+v\n but got: \n%+v and %+v", goLog.LstdFlags, goLog.LstdFlags, logFlags, errFlags)
 	}
 
+	logPrefix := logger.prefix
+	if logPrefix != prefix {
+		t.Fatalf("New loggers should use the specified prefix on creation. Expected: \n%+v\n but got: \n%+v", prefix, logPrefix)
+	}
 }