diff --git a/include/libcamera/internal/global_configuration.h b/include/libcamera/internal/global_configuration.h
index 41ac57cf..67684762 100644
--- a/include/libcamera/internal/global_configuration.h
+++ b/include/libcamera/internal/global_configuration.h
@@ -13,6 +13,8 @@
 
 #include "libcamera/internal/yaml_parser.h"
 
+#include "libcamera/base/utils.h"
+
 namespace libcamera {
 
 class GlobalConfiguration
@@ -28,7 +30,20 @@ public:
 
 	static unsigned int version();
 	static Configuration configuration();
-	static std::optional<std::string> option(const char *const confPath);
+
+	/**
+	 * \brief Retrieve string configuration identified by the given string
+	 * ...
+	 */
+	template<typename T>
+	static std::optional<T> option(const char *const confPath)
+	{
+		YamlObject *c = &const_cast<YamlObject &>(configuration());
+		for (auto part : utils::details::StringSplitter(confPath, "."))
+			c = &const_cast<YamlObject &>((*c)[part]);
+		return c->get<T>();
+	}
+
 	static std::optional<std::string> envOption(const char *const envVariable,
 						    const char *const confPath);
 
diff --git a/src/libcamera/base/global_configuration.cpp b/src/libcamera/base/global_configuration.cpp
index b29f452b..1e7a4caa 100644
--- a/src/libcamera/base/global_configuration.cpp
+++ b/src/libcamera/base/global_configuration.cpp
@@ -18,8 +18,6 @@
 
 #include "libcamera/internal/yaml_parser.h"
 
-#include "libcamera/base/utils.h"
-
 namespace libcamera {
 
 LOG_DEFINE_CATEGORY(Configuration)
@@ -119,19 +117,6 @@ GlobalConfiguration::Configuration GlobalConfiguration::get()
 	return (*instance().configuration_);
 }
 
-/**
- * \brief Retrieve string configuration identified by the given string
- * ...
- */
-std::optional<std::string> GlobalConfiguration::option(
-	const char *const confPath)
-{
-	YamlObject *c = &const_cast<YamlObject &>(configuration());
-	for (auto part : utils::details::StringSplitter(confPath, "."))
-		c = &const_cast<YamlObject &>((*c)[part]);
-	return c->get<std::string>();
-}
-
 /**
  * \brief Retrieve string configuration from the given environment variable or configuration
  * ...
@@ -143,7 +128,7 @@ std::optional<std::string> GlobalConfiguration::envOption(
 	const char *envValue = utils::secure_getenv(envVariable);
 	if (envValue)
 		return std::optional{ std::string{ envValue } };
-	return option(confPath);
+	return option<std::string>(confPath);
 }
 
 /**
diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp
index a373d38b..19403378 100644
--- a/src/libcamera/base/log.cpp
+++ b/src/libcamera/base/log.cpp
@@ -590,6 +590,8 @@ void Logger::logSetLevel(const char *category, const char *level)
 Logger::Logger()
 {
 	bool color = !utils::secure_getenv("LIBCAMERA_LOG_NO_COLOR");
+	if (color)
+		color = GlobalConfiguration::option<bool>("log.color").value_or(true);
 	logSetStream(&std::cerr, color);
 
 	parseLogFile();
