Index: uspace/srv/logger/logger.h
===================================================================
--- uspace/srv/logger/logger.h	(revision 14de4106e8e7a38504393b69ef6f5e22a95d977c)
+++ uspace/srv/logger/logger.h	(revision 76d92db112f9f96e53f73ce4e71c158bbd030916)
@@ -42,5 +42,5 @@
 #include <fibril_synch.h>
 
-#define DEFAULT_LOGGING_LEVEL LVL_WARN
+#define DEFAULT_LOGGING_LEVEL LVL_NOTE
 
 #define NAME "logger"
@@ -67,5 +67,5 @@
 
 void namespace_wait_for_reader_change(logging_namespace_t *, bool *);
-bool namespace_has_reader(logging_namespace_t *);
+bool namespace_has_reader(logging_namespace_t *, log_level_t);
 void namespace_add_message(logging_namespace_t *, const char *, log_level_t);
 log_message_t *namespace_get_next_message(logging_namespace_t *);
Index: uspace/srv/logger/main.c
===================================================================
--- uspace/srv/logger/main.c	(revision 14de4106e8e7a38504393b69ef6f5e22a95d977c)
+++ uspace/srv/logger/main.c	(revision 76d92db112f9f96e53f73ce4e71c158bbd030916)
@@ -74,5 +74,5 @@
 static int handle_receive_message(logging_namespace_t *namespace, int level)
 {
-	bool skip_message = (level > DEFAULT_LOGGING_LEVEL) && !namespace_has_reader(namespace);
+	bool skip_message = (level > DEFAULT_LOGGING_LEVEL) && !namespace_has_reader(namespace, level);
 	if (skip_message) {
 		/* Abort the actual message buffer transfer. */
Index: uspace/srv/logger/namespace.c
===================================================================
--- uspace/srv/logger/namespace.c	(revision 14de4106e8e7a38504393b69ef6f5e22a95d977c)
+++ uspace/srv/logger/namespace.c	(revision 76d92db112f9f96e53f73ce4e71c158bbd030916)
@@ -40,4 +40,5 @@
  */
 
+
 struct logging_namespace {
 	fibril_mutex_t guard;
@@ -45,4 +46,6 @@
 	fibril_condvar_t reader_appeared_cv;
 	bool has_reader;
+	FILE *logfile;
+	log_level_t logfile_level;
 	const char *name;
 	link_t link;
@@ -107,4 +110,21 @@
 		return NULL;
 	}
+
+	char *logfilename;
+	int rc = asprintf(&logfilename, "/log/%s", name);
+	if (rc < 0) {
+		free(namespace->name);
+		free(namespace);
+		return NULL;
+	}
+	namespace->logfile = fopen(logfilename, "a");
+	free(logfilename);
+	if (namespace->logfile == NULL) {
+		free(namespace->name);
+		free(namespace);
+		return NULL;
+	}
+
+	namespace->logfile_level = DEFAULT_LOGGING_LEVEL;
 
 	fibril_mutex_initialize(&namespace->guard);
@@ -153,4 +173,5 @@
 
 	// TODO - destroy pending messages
+	fclose(namespace->logfile);
 	free(namespace->name);
 	free(namespace);
@@ -223,8 +244,9 @@
 }
 
-bool namespace_has_reader(logging_namespace_t *namespace)
-{
-	fibril_mutex_lock(&namespace->guard);
-	bool has_reader = namespace->has_reader;
+bool namespace_has_reader(logging_namespace_t *namespace, log_level_t level)
+{
+	fibril_mutex_lock(&namespace->guard);
+	bool has_reader = namespace->has_reader
+	    || level <= namespace->logfile_level;
 	fibril_mutex_unlock(&namespace->guard);
 	return has_reader;
@@ -247,4 +269,8 @@
 	if (level <= DEFAULT_LOGGING_LEVEL) {
 		printf("[%s %d]: %s\n", namespace->name, level, message);
+	}
+	if (level <= namespace->logfile_level) {
+		fprintf(namespace->logfile, "[%d]: %s\n", level, message);
+		fflush(namespace->logfile);
 	}
 
