diff --git a/test/log.cpp b/test/log.cpp
new file mode 100644
index 0000000..ffe066f
--- /dev/null
+++ b/test/log.cpp
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * log_api.cpp - log API test
+ */
+
+#include <algorithm>
+#include <fcntl.h>
+#include <iostream>
+#include <list>
+#include <sstream>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <libcamera/logging.h>
+
+#include "log.h"
+#include "test.h"
+
+using namespace std;
+using namespace libcamera;
+
+LOG_DEFINE_CATEGORY(LogAPITest)
+
+class LogAPITest : public Test
+{
+protected:
+	int run() override
+	{
+		int fd = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
+		if (fd < 0) {
+			cerr << "Failed to open tmp log file" << endl;
+			return TestFail;
+		}
+
+		char path[32];
+		snprintf(path, sizeof(path), "/proc/self/fd/%u", fd);
+
+		logSetFile(path);
+
+		logSetLevel("LogAPITest", "DEBUG");
+		LOG(LogAPITest, Info) << "good 1";
+
+		logSetLevel("LogAPITest", "WARN");
+		LOG(LogAPITest, Info) << "bad";
+
+		logSetLevel("LogAPITest", "ERROR");
+		LOG(LogAPITest, Error) << "good 3";
+		LOG(LogAPITest, Info) << "bad";
+
+		logSetLevel("LogAPITest", "WARN");
+		LOG(LogAPITest, Warning) << "good 5";
+		LOG(LogAPITest, Info) << "bad";
+
+		char buf[1000];
+		memset(buf, 0, sizeof(buf));
+		lseek(fd, 0, SEEK_SET);
+		read(fd, buf, sizeof(buf));
+		close(fd);
+
+		std::list<int> goodList = { 1, 3, 5 };
+		std::basic_istringstream<char> iss((std::string(buf)));
+		char str[100];
+		while (iss.getline(str, sizeof(str))) {
+			char tmp = std::string(str).back();
+			int i = tmp - '0';
+			int j = goodList.front();
+			goodList.pop_front();
+			if (i != j)
+				return TestFail;
+		}
+
+		if (!goodList.empty())
+			return TestFail;
+
+		return TestPass;
+	}
+};
+
+TEST_REGISTER(LogAPITest)
diff --git a/test/meson.build b/test/meson.build
index 60ce960..d308ac9 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -21,6 +21,7 @@ public_tests = [
 
 internal_tests = [
     ['camera-sensor',                   'camera-sensor.cpp'],
+    ['log',                             'log.cpp'],
     ['message',                         'message.cpp'],
     ['signal-threads',                  'signal-threads.cpp'],
     ['threads',                         'threads.cpp'],
