diff --git a/cmd/zedmon/common.go b/cmd/zedmon/common.go
index 2562aa4..6572f1a 100644
--- a/cmd/zedmon/common.go
+++ b/cmd/zedmon/common.go
@@ -33,6 +33,7 @@
 	"flag"
 	"fmt"
 	"io/ioutil"
+	"log"
 	"os"
 
 	"fuchsia.googlesource.com/zedmon"
@@ -40,6 +41,10 @@
 
 var configFileName string
 
+func init() {
+	log.SetOutput(os.Stderr)
+}
+
 func setCommonFlags(flags *flag.FlagSet) {
 	flags.StringVar(&configFileName, "config", "", "Config file.")
 }
diff --git a/cmd/zedmon/gpio.go b/cmd/zedmon/gpio.go
index fc6ac48..8a041ab 100644
--- a/cmd/zedmon/gpio.go
+++ b/cmd/zedmon/gpio.go
@@ -31,7 +31,7 @@
 import (
 	"context"
 	"flag"
-	"fmt"
+	"log"
 	"strconv"
 
 	"fuchsia.googlesource.com/zedmon"
@@ -54,24 +54,24 @@
 func (*gpioCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
 	zedmon, err := zedmon.OpenZedmon(getConfig())
 	if err != nil {
-		fmt.Printf("Can't open zendmon: %v", err)
+		log.Printf("Can't open zendmon: %v", err)
 		return subcommands.ExitFailure
 	}
 	defer zedmon.Close()
 
 	args := f.Args()
 	if len(args) != 2 {
-		fmt.Println("Wrong number of arguments.")
+		log.Println("Wrong number of arguments.")
 		return subcommands.ExitUsageError
 	}
 
 	index, err := strconv.Atoi(args[0])
 	if err != nil {
-		fmt.Printf("Can't parse index %s: %v", args[0], err)
+		log.Printf("Can't parse index %s: %v", args[0], err)
 		return subcommands.ExitUsageError
 	}
 	if !(0 <= index && index <= 254) {
-		fmt.Printf("Index out of range: %v", index)
+		log.Printf("Index out of range: %v", index)
 		return subcommands.ExitUsageError
 	}
 
@@ -82,13 +82,13 @@
 	case "0":
 		state = false
 	default:
-		fmt.Printf("Unknown state %s\n", args[1])
+		log.Printf("Unknown state %s", args[1])
 		return subcommands.ExitUsageError
 	}
 
 	err = zedmon.SetOuput(uint8(index+1), state)
 	if err != nil {
-		fmt.Println(err.Error())
+		log.Println(err.Error())
 		return subcommands.ExitFailure
 	}
 
diff --git a/cmd/zedmon/list.go b/cmd/zedmon/list.go
index 6187837..ccceeeb 100644
--- a/cmd/zedmon/list.go
+++ b/cmd/zedmon/list.go
@@ -31,7 +31,7 @@
 import (
 	"context"
 	"flag"
-	"fmt"
+	"log"
 
 	"fuchsia.googlesource.com/zedmon"
 	"github.com/google/subcommands"
@@ -52,12 +52,12 @@
 func (*listCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
 	devs, err := zedmon.Enumerate()
 	if err != nil {
-		fmt.Printf("Can't enumerate zendmon: %v", err)
+		log.Printf("Can't enumerate zendmon: %v", err)
 		return subcommands.ExitFailure
 	}
 
 	for _, dev := range devs {
-		fmt.Printf("%s\n", dev.Serial)
+		log.Println(dev.Serial)
 	}
 
 	return subcommands.ExitSuccess
diff --git a/cmd/zedmon/record.go b/cmd/zedmon/record.go
index 06da362..240b5ce 100644
--- a/cmd/zedmon/record.go
+++ b/cmd/zedmon/record.go
@@ -32,7 +32,7 @@
 	"context"
 	"encoding/csv"
 	"flag"
-	"fmt"
+	"log"
 	"os"
 	"os/signal"
 	"strconv"
@@ -57,24 +57,24 @@
 func (*recordCmd) Execute(_ context.Context, _ *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
 	zedmon, err := zedmon.OpenZedmon(getConfig())
 	if err != nil {
-		fmt.Printf("Can't open zendmon: %v", err)
+		log.Printf("Can't open zendmon: %v", err)
 		return subcommands.ExitFailure
 	}
 	defer zedmon.Close()
 
 	f, err := os.OpenFile("zedmon.csv", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
 	if err != nil {
-		fmt.Printf("Can't open zedmon.csv: %v", err)
+		log.Printf("Can't open zedmon.csv: %v", err)
 		return subcommands.ExitFailure
 	}
 	defer f.Close()
 
 	offset, delta, err := zedmon.GetTimeOffset()
 	if err != nil {
-		fmt.Printf("Get time offset: %v", err)
+		log.Printf("Get time offset: %v", err)
 		return subcommands.ExitFailure
 	}
-	fmt.Printf("Time offset: %dns ± %dns\n", offset.Nanoseconds(), delta.Nanoseconds())
+	log.Printf("Time offset: %dns ± %dns\n", offset.Nanoseconds(), delta.Nanoseconds())
 
 	termChan := make(chan os.Signal, 1)
 	signal.Notify(termChan, os.Interrupt)
@@ -82,14 +82,14 @@
 	writer := csv.NewWriter(f)
 	defer writer.Flush()
 
-	fmt.Printf("Starting report recording. Send ^C to stop.\n")
+	log.Println("Starting report recording. Send ^C to stop.")
 	zedmon.EnableReporting()
 
 RecordSampling:
 	for {
 		reports, err := zedmon.ReadReports()
 		if err != nil {
-			fmt.Printf("Error reading reports: %v\n", err)
+			log.Printf("Error reading reports: %v", err)
 			continue
 		}
 		for _, report := range reports {
@@ -107,7 +107,7 @@
 		default:
 		}
 	}
-	fmt.Printf("Stopping report recording.\n")
+	log.Println("Stopping report recording.")
 
 	return subcommands.ExitSuccess
 }
diff --git a/cmd/zedmon/relay.go b/cmd/zedmon/relay.go
index 6133813..12c53f7 100644
--- a/cmd/zedmon/relay.go
+++ b/cmd/zedmon/relay.go
@@ -31,7 +31,7 @@
 import (
 	"context"
 	"flag"
-	"fmt"
+	"log"
 
 	"fuchsia.googlesource.com/zedmon"
 	"github.com/google/subcommands"
@@ -53,14 +53,14 @@
 func (*relayCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
 	zedmon, err := zedmon.OpenZedmon(getConfig())
 	if err != nil {
-		fmt.Printf("Can't open zendmon: %v", err)
+		log.Printf("Can't open zendmon: %v", err)
 		return subcommands.ExitFailure
 	}
 	defer zedmon.Close()
 
 	args := f.Args()
 	if len(args) != 1 {
-		fmt.Println("Wrong number of arguments.")
+		log.Println("Wrong number of arguments.")
 		return subcommands.ExitUsageError
 	}
 
@@ -71,13 +71,13 @@
 	case "off":
 		state = false
 	default:
-		fmt.Printf("Unknown state %s\n", args[0])
+		log.Printf("Unknown state %s", args[0])
 		return subcommands.ExitUsageError
 	}
 
 	err = zedmon.SetOuput(0, state)
 	if err != nil {
-		fmt.Println(err.Error())
+		log.Println(err.Error())
 		return subcommands.ExitFailure
 	}
 
diff --git a/lib/data_type.go b/lib/data_type.go
index c7b3e45..e1f34ad 100644
--- a/lib/data_type.go
+++ b/lib/data_type.go
@@ -84,6 +84,6 @@
 		err := binary.Read(r, binary.LittleEndian, &val)
 		return float64(val), err
 	default:
-		return 0.0, fmt.Errorf("Can't decode type %d.", dt)
+		return 0.0, fmt.Errorf("Can't decode type %d", dt)
 	}
 }
diff --git a/lib/zedmon.go b/lib/zedmon.go
index d520289..cf68a17 100644
--- a/lib/zedmon.go
+++ b/lib/zedmon.go
@@ -125,7 +125,7 @@
 		data[1] = 0x00
 		_, err := z.outEp.Write(data)
 		if err != nil {
-			log.Printf("Sync Send Error: %v\n", err)
+			log.Printf("Sync send error: %v", err)
 			continue
 		}
 		buf := make([]byte, z.inEp.Desc.MaxPacketSize)
@@ -136,7 +136,7 @@
 		if usbErr, ok := err.(gousb.TransferStatus); ok && usbErr == gousb.TransferTimedOut {
 			continue
 		}
-		log.Printf("Sync Read Error: %v\n", err)
+		log.Printf("Sync read error: %v", err)
 	}
 }
 
@@ -151,12 +151,12 @@
 		start := time.Now()
 		_, err := z.outEp.Write(data)
 		if err != nil {
-			log.Printf("Sync Send Error: %v\n", err)
+			log.Printf("Sync Send Error: %v", err)
 			return 0, 0, err
 		}
 		buf := z.read()
 		if buf == nil {
-			return 0, 0, fmt.Errorf("Can't read packet\n")
+			return 0, 0, fmt.Errorf("Can't read packet")
 		}
 		end := time.Now()
 		reader := bytes.NewReader(buf[1:])
@@ -271,7 +271,7 @@
 // Returns: offset after this field, error
 func (z *Zedmon) getFormatReport(index uint, offset *int) (bool, error) {
 	if index >= 0xff {
-		return false, fmt.Errorf("Index %d out of range.", index)
+		return false, fmt.Errorf("Index %d out of range", index)
 	}
 
 	data := make([]byte, 2)
@@ -295,7 +295,7 @@
 
 	dataType := DataType(packet.ValueType)
 	if dataType.Size() < 0 {
-		return false, fmt.Errorf("Can't handle Value type %d.", dataType)
+		return false, fmt.Errorf("Can't handle Value type %d", dataType)
 	}
 
 	// TODO: validate Unit
@@ -335,7 +335,7 @@
 			}
 		}
 	}
-	return 0, 0, 0, fmt.Errorf("Can't find zedmon interface.")
+	return 0, 0, 0, fmt.Errorf("Can't find zedmon interface")
 }
 
 func (z *Zedmon) enumerateFields() error {
