diff --git a/core-program.cabal b/core-program.cabal
--- a/core-program.cabal
+++ b/core-program.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           core-program
-version:        0.4.5.0
+version:        0.4.5.1
 synopsis:       Opinionated Haskell Interoperability
 description:    A library to help build command-line programs, both tools and
                 longer-running daemons.
diff --git a/lib/Core/Program/Context.hs b/lib/Core/Program/Context.hs
--- a/lib/Core/Program/Context.hs
+++ b/lib/Core/Program/Context.hs
@@ -51,6 +51,7 @@
 import Core.System.Base hiding (catch, throw)
 import Core.Text.Rope
 import Data.Foldable (foldrM)
+import System.IO (hIsTerminalDevice)
 import Data.Int (Int64)
 import Data.String (IsString)
 import Prettyprinter (LayoutOptions (..), PageWidth (..), layoutPretty)
@@ -164,6 +165,7 @@
     { -- runtime properties
       programNameFrom :: MVar Rope
     , terminalWidthFrom :: Int
+    , terminalColouredFrom :: Bool
     , versionFrom :: Version
     , -- only used during initial setup
       initialConfigFrom :: Config
@@ -353,6 +355,7 @@
     q <- newEmptyMVar
     i <- newMVar start
     columns <- getConsoleWidth
+    coloured <- getConsoleColoured
     level <- newEmptyMVar
     out <- newTQueueIO
     tel <- newTQueueIO
@@ -364,6 +367,7 @@
         $! Context
             { programNameFrom = n
             , terminalWidthFrom = columns
+            , terminalColouredFrom = coloured
             , versionFrom = version
             , initialConfigFrom = config
             , initialExportersFrom = []
@@ -392,7 +396,12 @@
             Nothing -> 80
     return columns
 
---
+
+getConsoleColoured :: IO Bool
+getConsoleColoured = do
+    terminal <- hIsTerminalDevice stdout
+    pure terminal
+
 
 {- |
 Process the command line options and arguments. If an invalid option is
diff --git a/lib/Core/Program/Execute.hs b/lib/Core/Program/Execute.hs
--- a/lib/Core/Program/Execute.hs
+++ b/lib/Core/Program/Execute.hs
@@ -447,6 +447,7 @@
                     formatLogMessage
                         start
                         now
+                        True
                         SeverityInternal
                         ("telemetry: sent " <> desc)
             atomically $ do
@@ -460,6 +461,7 @@
                     formatLogMessage
                         start
                         now
+                        True
                         SeverityWarn
                         ("sending telemetry failed (Exception: " <> intoRope (show e) <> "); Restarting exporter.")
             atomically $ do
diff --git a/lib/Core/Program/Logging.hs b/lib/Core/Program/Logging.hs
--- a/lib/Core/Program/Logging.hs
+++ b/lib/Core/Program/Logging.hs
@@ -179,6 +179,7 @@
     let i = startTimeFrom context
     start <- readMVar i
     let output = outputChannelFrom context
+        coloured = terminalColouredFrom context
 
     let display = case possiblelValue of
             Just value ->
@@ -187,13 +188,13 @@
                     else text <> " = " <> value
             Nothing -> text
 
-    let !result = formatLogMessage start now level display
+    let !result = formatLogMessage start now coloured level display
 
     atomically $ do
         writeTQueue output (Just result)
 
-formatLogMessage :: TimeStamp -> TimeStamp -> Severity -> Rope -> Rope
-formatLogMessage start now severity message =
+formatLogMessage :: TimeStamp -> TimeStamp -> Bool -> Severity -> Rope -> Rope
+formatLogMessage start now coloured severity message =
     let !start' = unTimeStamp start
         !now' = unTimeStamp now
         !stampZ =
@@ -219,16 +220,26 @@
             SeverityInternal -> intoEscapes dullBlue
 
         !reset = intoEscapes resetColour
-     in mconcat
-            [ intoEscapes dullWhite
-            , intoRope stampZ
-            , " ("
-            , padWithZeros 6 (show elapsed)
-            , ") "
-            , colour
-            , message
-            , reset
-            ]
+     in case coloured of
+            True ->
+                mconcat
+                    [ intoEscapes dullWhite
+                    , intoRope stampZ
+                    , " ("
+                    , padWithZeros 6 (show elapsed)
+                    , ") "
+                    , colour
+                    , message
+                    , reset
+                    ]
+            False ->
+                mconcat
+                    [ intoRope stampZ
+                    , " ("
+                    , padWithZeros 6 (show elapsed)
+                    , ") "
+                    , message
+                    ]
 
 {- |
 Utility function to prepend \'0\' characters to a string representing a
