diff --git a/log/README_ETHEREUM.md b/log/README_ETHEREUM.md
index 6a0b0141b177b1806d61d685b8ecca6e2451c168..f6c42ccc03da654e5a078484aea615313bc0c35c 100644
--- a/log/README_ETHEREUM.md
+++ b/log/README_ETHEREUM.md
@@ -2,3 +2,4 @@ This package is a fork of https://github.com/inconshreveable/log15, with some
 minor modifications required by the go-ethereum codebase:
 
  * Support for log level `trace`
+ * Modified behavior to exit on `critical` failure
diff --git a/log/format.go b/log/format.go
index 376376183cbf23b62c93dfdc24aa7e3162d6c12c..9dcfc8d13cd2eb720b2fde4d76154dd57dc18c09 100644
--- a/log/format.go
+++ b/log/format.go
@@ -58,6 +58,8 @@ func TerminalFormat() Format {
 			color = 32
 		case LvlDebug:
 			color = 36
+		case LvlTrace:
+			color = 34
 		}
 
 		b := &bytes.Buffer{}
diff --git a/log/logger.go b/log/logger.go
index a9d42b8da2210c1ac6e2ed6fed9f3aa205978c65..a7f7d9df7fdd4d1cc88b94349e373f3e36a7e1b0 100644
--- a/log/logger.go
+++ b/log/logger.go
@@ -2,6 +2,7 @@ package log
 
 import (
 	"fmt"
+	"os"
 	"time"
 
 	"github.com/go-stack/stack"
@@ -20,11 +21,14 @@ const (
 	LvlWarn
 	LvlInfo
 	LvlDebug
+	LvlTrace
 )
 
 // Returns the name of a Lvl
 func (l Lvl) String() string {
 	switch l {
+	case LvlTrace:
+		return "trce"
 	case LvlDebug:
 		return "dbug"
 	case LvlInfo:
@@ -44,6 +48,8 @@ func (l Lvl) String() string {
 // Useful for parsing command line args and configuration files.
 func LvlFromString(lvlString string) (Lvl, error) {
 	switch lvlString {
+	case "trace", "trce":
+		return LvlTrace, nil
 	case "debug", "dbug":
 		return LvlDebug, nil
 	case "info":
@@ -87,6 +93,7 @@ type Logger interface {
 	SetHandler(h Handler)
 
 	// Log a message at the given level with context key/value pairs
+	Trace(msg string, ctx ...interface{})
 	Debug(msg string, ctx ...interface{})
 	Info(msg string, ctx ...interface{})
 	Warn(msg string, ctx ...interface{})
@@ -128,6 +135,10 @@ func newContext(prefix []interface{}, suffix []interface{}) []interface{} {
 	return newCtx
 }
 
+func (l *logger) Trace(msg string, ctx ...interface{}) {
+	l.write(msg, LvlTrace, ctx)
+}
+
 func (l *logger) Debug(msg string, ctx ...interface{}) {
 	l.write(msg, LvlDebug, ctx)
 }
@@ -146,6 +157,7 @@ func (l *logger) Error(msg string, ctx ...interface{}) {
 
 func (l *logger) Crit(msg string, ctx ...interface{}) {
 	l.write(msg, LvlCrit, ctx)
+	os.Exit(1)
 }
 
 func (l *logger) GetHandler() Handler {
diff --git a/log/root.go b/log/root.go
index 39b4c9429488bd758a96818c7dfd0f34280be344..6814cc2736d85b6bc918926c3bce641209ca8f87 100644
--- a/log/root.go
+++ b/log/root.go
@@ -41,6 +41,11 @@ func Root() Logger {
 // etc.) to keep the call depth the same for all paths to logger.write so
 // runtime.Caller(2) always refers to the call site in client code.
 
+// Trace is a convenient alias for Root().Trace
+func Trace(msg string, ctx ...interface{}) {
+	root.write(msg, LvlTrace, ctx)
+}
+
 // Debug is a convenient alias for Root().Debug
 func Debug(msg string, ctx ...interface{}) {
 	root.write(msg, LvlDebug, ctx)
@@ -64,4 +69,5 @@ func Error(msg string, ctx ...interface{}) {
 // Crit is a convenient alias for Root().Crit
 func Crit(msg string, ctx ...interface{}) {
 	root.write(msg, LvlCrit, ctx)
+	os.Exit(1)
 }
diff --git a/log/syslog.go b/log/syslog.go
index 4f1097ff9269833402e30397a022a28a561144a8..71a17b30b3e084553b07f89441c82e1b8271e317 100644
--- a/log/syslog.go
+++ b/log/syslog.go
@@ -38,6 +38,8 @@ func sharedSyslog(fmtr Format, sysWr *syslog.Writer, err error) (Handler, error)
 			syslogFn = sysWr.Info
 		case LvlDebug:
 			syslogFn = sysWr.Debug
+		case LvlTrace:
+			syslogFn = func(m string) error { return nil } // There's no syslog level for trace
 		}
 
 		s := strings.TrimSpace(string(fmtr.Format(r)))