diff --git a/include/libcamera/logging.h b/include/libcamera/logging.h
new file mode 100644
index 0000000..47c5e49
--- /dev/null
+++ b/include/libcamera/logging.h
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2018, Google Inc.
+ *
+ * log.h - Logging infrastructure
+ */
+#ifndef __LIBCAMERA_LOGGING_H__
+#define __LIBCAMERA_LOGGING_H__
+
+namespace libcamera {
+
+void logSetFile(const char *file);
+void logSetLevel(const char *category, const char *level);
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_LOGGING_H__ */
diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
index 972513f..920eb5f 100644
--- a/include/libcamera/meson.build
+++ b/include/libcamera/meson.build
@@ -9,6 +9,7 @@ libcamera_api = files([
     'geometry.h',
     'ipa/ipa_interface.h',
     'ipa/ipa_module_info.h',
+    'logging.h',
     'object.h',
     'request.h',
     'signal.h',
diff --git a/src/libcamera/log.cpp b/src/libcamera/log.cpp
index 0ba276e..dca4936 100644
--- a/src/libcamera/log.cpp
+++ b/src/libcamera/log.cpp
@@ -69,6 +69,9 @@ private:
 	void parseLogLevels();
 	static LogSeverity parseLogLevel(const std::string &level);
 
+	friend void logSetFile(const char *file);
+	friend void logSetLevel(const char *category, const char *level);
+
 	friend LogCategory;
 	void registerCategory(LogCategory *category);
 	void unregisterCategory(LogCategory *category);
@@ -80,6 +83,57 @@ private:
 	std::ostream *output_;
 };
 
+/**
+ * \brief Set the log file
+ * \param[in] file
+ */
+void logSetFile(const char *file)
+{
+	if (std::string(file).empty())
+		return;
+
+	Logger *logger = Logger::instance();
+	std::ofstream &file_ = logger->file_;
+	file_.close();
+	file_.open(file);
+	if (file_.good())
+		logger->output_ = &file_;
+}
+
+/**
+ * \brief Set the log level
+ * \param[in] category Logging category
+ * \param[in] level Log level
+ *
+ * This function sets the log level of \a category to \a level.
+ * \a level should be one of the following strings:
+ * - "DEBUG"
+ * - "INFO"
+ * - "WARN"
+ * - "ERROR"
+ * - "FATAL"
+ *
+ * "*" is not a valid \a category for this function.
+ */
+void logSetLevel(const char *category, const char *level)
+{
+	Logger *logger = Logger::instance();
+	std::string cat(category);
+	std::string lev(level);
+
+	/* Both the category and the level must be specified. */
+	if (cat.empty() || lev.empty())
+		return;
+
+	LogSeverity severity = Logger::parseLogLevel(lev);
+	if (severity == LogInvalid)
+		return;
+
+	for (LogCategory *c : logger->categories_)
+		if (!strcmp(c->name(), category))
+			c->setSeverity(severity);
+}
+
 /**
  * \brief Retrieve the logger instance
  *
