Index: uspace/lib/c/generic/io/log.c
===================================================================
--- uspace/lib/c/generic/io/log.c	(revision f6bc83a793a7ad8abd2ad83063d699b6dfce0754)
+++ uspace/lib/c/generic/io/log.c	(revision 01b8c2e4ec8fecf9f68a17cee1ffe702d9a9cb59)
@@ -52,4 +52,7 @@
 #define MESSAGE_BUFFER_SIZE 4096
 
+FIBRIL_RWLOCK_INITIALIZE(current_observed_level_lock);
+log_level_t current_observed_level;
+
 static int logger_register(async_sess_t *session, const char *prog_name)
 {
@@ -101,4 +104,60 @@
 }
 
+static void cannot_use_level_changed_monitor(void)
+{
+	assert(false && "not implemented yet");
+}
+
+static int observed_level_changed_monitor(void *arg)
+{
+	async_sess_t *monitor_session = service_connect_blocking(EXCHANGE_SERIALIZE, SERVICE_LOGGER, LOGGER_INTERFACE_SINK, 0);
+	if (monitor_session == NULL) {
+		cannot_use_level_changed_monitor();
+		return ENOMEM;
+	}
+
+	int rc = logger_register(monitor_session, log_prog_name);
+	if (rc != EOK) {
+		cannot_use_level_changed_monitor();
+		return rc;
+	}
+
+	async_exch_t *exchange = async_exchange_begin(monitor_session);
+	if (exchange == NULL) {
+		cannot_use_level_changed_monitor();
+		return ENOMEM;
+	}
+
+	while (true) {
+		sysarg_t has_reader;
+		sysarg_t msg_rc = async_req_0_1(exchange,
+		    LOGGER_BLOCK_UNTIL_READER_CHANGED, &has_reader);
+		if (msg_rc != EOK) {
+			cannot_use_level_changed_monitor();
+			break;
+		}
+
+		fibril_rwlock_write_lock(&current_observed_level_lock);
+		if ((bool) has_reader) {
+			current_observed_level = LVL_LIMIT;
+		} else {
+			current_observed_level = LVL_NOTE;
+		}
+		fibril_rwlock_write_unlock(&current_observed_level_lock);
+	}
+
+	async_exchange_end(exchange);
+
+	return EOK;
+}
+
+static log_level_t get_current_observed_level(void)
+{
+	fibril_rwlock_read_lock(&current_observed_level_lock);
+	log_level_t level = current_observed_level;
+	fibril_rwlock_read_unlock(&current_observed_level_lock);
+	return level;
+}
+
 /** Initialize the logging system.
  *
@@ -120,4 +179,13 @@
 
 	int rc = logger_register(logger_session, log_prog_name);
+
+	current_observed_level = LVL_NOTE;
+
+	fid_t observed_level_changed_fibril = fibril_create(observed_level_changed_monitor, NULL);
+	if (observed_level_changed_fibril == 0) {
+		cannot_use_level_changed_monitor();
+	} else {
+		fibril_add_ready(observed_level_changed_fibril);
+	}
 
 	return rc;
@@ -151,4 +219,8 @@
 	assert(level < LVL_LIMIT);
 
+	if (get_current_observed_level() < level) {
+		return;
+	}
+
 	char *message_buffer = malloc(MESSAGE_BUFFER_SIZE);
 	if (message_buffer == NULL) {
Index: uspace/lib/c/include/ipc/logger.h
===================================================================
--- uspace/lib/c/include/ipc/logger.h	(revision f6bc83a793a7ad8abd2ad83063d699b6dfce0754)
+++ uspace/lib/c/include/ipc/logger.h	(revision 01b8c2e4ec8fecf9f68a17cee1ffe702d9a9cb59)
@@ -38,5 +38,6 @@
 typedef enum {
 	LOGGER_REGISTER = IPC_FIRST_USER_METHOD,
-	LOGGER_MESSAGE
+	LOGGER_MESSAGE,
+	LOGGER_BLOCK_UNTIL_READER_CHANGED
 } logger_sink_request_t;
 
