diff --git a/recording-daemon/Makefile b/recording-daemon/Makefile
index 82d84e380..e36a2b6a9 100644
--- a/recording-daemon/Makefile
+++ b/recording-daemon/Makefile
@@ -25,7 +25,7 @@ LDFLAGS+=	`mysql_config --libs`
 include ../lib/lib.Makefile
 
 SRCS=		epoll.c garbage.c inotify.c main.c metafile.c stream.c recaux.c packet.c \
-		decoder.c output.c mix.c resample.c db.c
+		decoder.c output.c mix.c resample.c db.c log.c
 LIBSRCS=	loglib.c auxlib.c rtplib.c
 OBJS=		$(SRCS:.c=.o) $(LIBSRCS:.c=.o)
 
diff --git a/recording-daemon/db.c b/recording-daemon/db.c
index 1d2075bec..076fe6e69 100644
--- a/recording-daemon/db.c
+++ b/recording-daemon/db.c
@@ -56,7 +56,7 @@ static int check_conn() {
 	if (!c_mysql_host || !c_mysql_db)
 		return -1;
 
-	ilog(LOG_DEBUG, "connecting to MySQL");
+	dbg("connecting to MySQL");
 
 	mysql_conn = mysql_init(NULL);
 	if (!mysql_conn)
@@ -93,7 +93,7 @@ static int check_conn() {
 				"(?,?,?)"))
 		goto err;
 
-	ilog(LOG_DEBUG, "Connection to MySQL established");
+	dbg("Connection to MySQL established");
 
 	return 0;
 
diff --git a/recording-daemon/log.c b/recording-daemon/log.c
new file mode 100644
index 000000000..2a14a3494
--- /dev/null
+++ b/recording-daemon/log.c
@@ -0,0 +1,28 @@
+#include "log.h"
+#include <syslog.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include "loglib.h"
+
+
+__thread const char *log_info_call, *log_info_stream;
+__thread unsigned long log_info_ssrc;
+
+
+void __ilog(int prio, const char *fmt, ...) {
+        va_list ap;
+	char prefix[300] = "";
+	char *pp = prefix;
+	char *endp = prefix + sizeof(prefix);
+
+	if (log_info_call)
+		pp += snprintf(pp, endp - pp, "[C %s] ", log_info_call);
+	if (log_info_stream)
+		pp += snprintf(pp, endp - pp, "[S %s] ", log_info_stream);
+	if (log_info_ssrc)
+		pp += snprintf(pp, endp - pp, "[0x%lx] ", log_info_ssrc);
+
+        va_start(ap, fmt);
+        __vpilog(prio, prefix, fmt, ap);
+        va_end(ap);
+}
diff --git a/recording-daemon/log.h b/recording-daemon/log.h
index 0a5f6a35a..84fa24ac0 100644
--- a/recording-daemon/log.h
+++ b/recording-daemon/log.h
@@ -8,7 +8,11 @@
 #include <string.h>
 #include <stdlib.h>
 
-#define __ilog(...) __ilog_np(__VA_ARGS__)
 #define dbg(fmt, ...) ilog(LOG_DEBUG, fmt, ##__VA_ARGS__)
 
+void __ilog(int prio, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
+
+extern __thread const char *log_info_call, *log_info_stream;
+extern __thread unsigned long log_info_ssrc;
+
 #endif
diff --git a/recording-daemon/packet.c b/recording-daemon/packet.c
index 4670b7052..be9bc7d0d 100644
--- a/recording-daemon/packet.c
+++ b/recording-daemon/packet.c
@@ -230,10 +230,12 @@ void packet_process(stream_t *stream, unsigned char *buf, unsigned len) {
 		goto err;
 
 	packet->seq = ntohs(packet->rtp->seq_num);
+	unsigned long ssrc_num = ntohl(packet->rtp->ssrc);
+	log_info_ssrc = ssrc_num;
 	dbg("packet parsed successfully, seq %u", packet->seq);
 
 	// insert into ssrc queue
-	ssrc_t *ssrc = ssrc_get(stream, ntohl(packet->rtp->ssrc));
+	ssrc_t *ssrc = ssrc_get(stream, ssrc_num);
 
 	// check seq for dupes
 	if (G_UNLIKELY(ssrc->seq == -1)) {
@@ -255,15 +257,18 @@ seq_ok:
 
 	// got a new packet, run the decoder
 	ssrc_run(ssrc);
+	log_info_ssrc = 0;
 	return;
 
 dupe:
 	dbg("skipping dupe packet (new seq %i prev seq %i)", packet->seq, ssrc->seq);
 	pthread_mutex_unlock(&ssrc->lock);
+	log_info_ssrc = 0;
 	return;
 
 err:
 	ilog(LOG_WARN, "Failed to parse packet headers");
 ignore:
 	packet_free(packet);
+	log_info_ssrc = 0;
 }
diff --git a/recording-daemon/stream.c b/recording-daemon/stream.c
index 342f49d9a..0df86ca55 100644
--- a/recording-daemon/stream.c
+++ b/recording-daemon/stream.c
@@ -40,6 +40,9 @@ static void stream_handler(handler_t *handler) {
 	stream_t *stream = handler->ptr;
 	unsigned char *buf = NULL;
 
+	log_info_call = stream->metafile->name;
+	log_info_stream = stream->name;
+
 	//dbg("poll event for %s", stream->name);
 
 	pthread_mutex_lock(&stream->lock);
@@ -63,11 +66,15 @@ static void stream_handler(handler_t *handler) {
 	// got a packet
 	pthread_mutex_unlock(&stream->lock);
 	packet_process(stream, buf, ret);
+	log_info_call = NULL;
+	log_info_stream = NULL;
 	return;
 
 out:
 	pthread_mutex_unlock(&stream->lock);
 	free(buf);
+	log_info_call = NULL;
+	log_info_stream = NULL;
 }