Index: uspace/srv/logger/initlvl.c
===================================================================
--- uspace/srv/logger/initlvl.c	(revision 5239e1703e8da9d0e5f2591231d7329601901a5d)
+++ uspace/srv/logger/initlvl.c	(revision 90dc45860d434f077d0d99e8a76986bb1796922e)
@@ -35,4 +35,5 @@
  */
 #include <errno.h>
+#include <str_error.h>
 #include <sysinfo.h>
 #include <str.h>
@@ -61,6 +62,7 @@
 		return;
 
-	logger_log_t *log = find_or_create_log_and_acquire(key, 0);
-	if (log == NULL)
+	logger_log_t *log;
+	rc = find_or_create_log_and_acquire(key, 0, &log);
+	if (rc != EOK)
 		return;
 
Index: uspace/srv/logger/logger.h
===================================================================
--- uspace/srv/logger/logger.h	(revision 5239e1703e8da9d0e5f2591231d7329601901a5d)
+++ uspace/srv/logger/logger.h	(revision 90dc45860d434f077d0d99e8a76986bb1796922e)
@@ -51,4 +51,6 @@
 
 typedef struct {
+	fibril_mutex_t guard;
+	char *filename;
 	FILE *logfile;
 } logger_dest_t;
@@ -67,8 +69,9 @@
 
 logger_log_t *find_log_by_name_and_acquire(const char *name);
-logger_log_t *find_or_create_log_and_acquire(const char *name, sysarg_t parent);
+int find_or_create_log_and_acquire(const char *, sysarg_t, logger_log_t **);
 logger_log_t *find_log_by_id_and_acquire(sysarg_t);
 bool shall_log_message(logger_log_t *, log_level_t);
 void log_release(logger_log_t *);
+void write_to_log(logger_log_t *, log_level_t, const char *);
 
 log_level_t get_default_logging_level(void);
Index: uspace/srv/logger/logs.c
===================================================================
--- uspace/srv/logger/logs.c	(revision 5239e1703e8da9d0e5f2591231d7329601901a5d)
+++ uspace/srv/logger/logs.c	(revision 90dc45860d434f077d0d99e8a76986bb1796922e)
@@ -42,10 +42,12 @@
 
 
-static logger_log_t *find_log_by_name_and_parent_no_lock(const char *name, logger_log_t *parent)
+static logger_log_t *find_log_by_name_and_parent_no_list_lock_and_acquire(const char *name, logger_log_t *parent)
 {
 	list_foreach(log_list, it) {
 		logger_log_t *log = list_get_instance(it, logger_log_t, link);
-		if ((parent == log->parent) && (str_cmp(log->name, name) == 0))
+		if ((parent == log->parent) && (str_cmp(log->name, name) == 0)) {
+			fibril_mutex_lock(&log->guard);
 			return log;
+		}
 	}
 
@@ -58,22 +60,18 @@
 	if (result == NULL)
 		return ENOMEM;
-	char *logfilename;
-	int rc = asprintf(&logfilename, "/log/%s", name);
+	int rc = asprintf(&result->filename, "/log/%s", name);
 	if (rc < 0) {
 		free(result);
 		return ENOMEM;
 	}
-	result->logfile = fopen(logfilename, "a");
-	free(logfilename);
-	if (result->logfile == NULL) {
-		free(result);
-		return ENOMEM;
-	}
+	result->logfile = NULL;
+	fibril_mutex_initialize(&result->guard);
 	*dest = result;
 	return EOK;
 }
 
-logger_log_t *find_or_create_log_and_acquire(const char *name, sysarg_t parent_id)
-{
+int find_or_create_log_and_acquire(const char *name, sysarg_t parent_id, logger_log_t **log_out)
+{
+	int rc;
 	logger_log_t *result = NULL;
 	logger_log_t *parent = (logger_log_t *) parent_id;
@@ -81,11 +79,15 @@
 	fibril_mutex_lock(&log_list_guard);
 
-	result = find_log_by_name_and_parent_no_lock(name, parent);
-	if (result != NULL)
+	result = find_log_by_name_and_parent_no_list_lock_and_acquire(name, parent);
+	if (result != NULL) {
+		rc = EOK;
 		goto leave;
+	}
 
 	result = calloc(1, sizeof(logger_log_t));
-	if (result == NULL)
+	if (result == NULL) {
+		rc = ENOMEM;
 		goto leave;
+	}
 
 	result->logged_level = LOG_LEVEL_USE_DEFAULT;
@@ -93,9 +95,9 @@
 	if (parent == NULL) {
 		result->full_name = str_dup(name);
-		int rc = create_dest(name, &result->dest);
+		rc = create_dest(name, &result->dest);
 		if (rc != EOK)
 			goto error_result_allocated;
 	} else {
-		int rc = asprintf(&result->full_name, "%s/%s",
+		rc = asprintf(&result->full_name, "%s/%s",
 		    parent->full_name, name);
 		if (rc < 0)
@@ -116,5 +118,10 @@
 	fibril_mutex_unlock(&log_list_guard);
 
-	return result;
+	if (rc == EOK) {
+		assert(fibril_mutex_is_locked(&result->guard));
+		*log_out = result;
+	}
+
+	return rc;
 
 error_result_allocated:
@@ -125,5 +132,5 @@
 	fibril_mutex_unlock(&log_list_guard);
 
-	return NULL;
+	return rc;
 }
 
@@ -190,4 +197,22 @@
 }
 
+void write_to_log(logger_log_t *log, log_level_t level, const char *message)
+{
+	assert(fibril_mutex_is_locked(&log->guard));
+	assert(log->dest != NULL);
+	fibril_mutex_lock(&log->dest->guard);
+	if (log->dest->logfile == NULL)
+		log->dest->logfile = fopen(log->dest->filename, "a");
+
+	if (log->dest->logfile != NULL) {
+		fprintf(log->dest->logfile, "[%s] %s: %s\n",
+		    log->full_name, log_level_str(level),
+		    (const char *) message);
+		fflush(log->dest->logfile);
+	}
+
+	fibril_mutex_unlock(&log->dest->guard);
+}
+
 /**
  * @}
Index: uspace/srv/logger/writer.c
===================================================================
--- uspace/srv/logger/writer.c	(revision 5239e1703e8da9d0e5f2591231d7329601901a5d)
+++ uspace/srv/logger/writer.c	(revision 90dc45860d434f077d0d99e8a76986bb1796922e)
@@ -56,5 +56,7 @@
 		return NULL;
 
-	logger_log_t *log = find_or_create_log_and_acquire(name, parent);
+	logger_log_t *log = NULL;
+	rc = find_or_create_log_and_acquire(name, parent, &log);
+	if (rc)
 
 	free(name);
@@ -82,8 +84,5 @@
 	    log->full_name, log_level_str(level),
 	    (const char *) message);
-	fprintf(log->dest->logfile, "[%s] %s: %s\n",
-	    log->full_name, log_level_str(level),
-	    (const char *) message);
-	fflush(log->dest->logfile);
+	write_to_log(log, level, message);
 
 	rc = EOK;
