diff --git a/Makefile b/Makefile
index aaacac019d4c700c80097fc0802b55abb2d58fac..6496bf21a3cba9aed9e4dc2febe680387c5c9bfa 100644
--- a/Makefile
+++ b/Makefile
@@ -6,6 +6,9 @@ SOURCES = $(shell ls *.c 2> /dev/null | sed /sem.c/d | sed /jbuffer.c/d)
 BINS    = $(SOURCES:%.c=%)
 
 OUT		= bin
+# supported targets all clean dev
+# (dev sets -DDEV used in log.c)
+
 
 # $@ := target name
 # $^ := dependencie list
@@ -13,6 +16,9 @@ OUT		= bin
 
 all: $(OUT) $(BINS:%=$(OUT)/%) Zettel.html
 
+dev: CFLAGS += -DDEV
+dev: all
+
 $(OUT):
 	mkdir -p $(OUT)
 
@@ -38,4 +44,4 @@ $(OUT)/sem.o: sem.h
 clean:
 	rm -rf $(OUT) Zettel.html Readme.md
 
-.PHONY: all clean
+.PHONY: all clean dev
diff --git a/log.c b/log.c
new file mode 100644
index 0000000000000000000000000000000000000000..b270b51d2a87a81e48efaa6c3e57baf8f04ef9c1
--- /dev/null
+++ b/log.c
@@ -0,0 +1,44 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DIE(msg) \
+    fprintf(stderr, "ERROR: %s:%s:%d: ", __FILE__, __func__, __LINE__); \
+    perror(msg); \
+    exit(EXIT_FAILURE);
+
+#define DIE_M(msg) \
+    fprintf(stderr, "ERROR: %s:%s:%d: ", __FILE__, __func__, __LINE__); \
+    fprintf(stderr, "%s\n", msg); \
+    exit(EXIT_FAILURE);
+
+#ifdef DEV
+
+#define WARN(msg) \
+    fprintf(stderr, "WARN: %s:%s:%d: ", __FILE__, __func__, __LINE__); \
+    perror(msg);
+
+#define WARN_M(msg) \
+    fprintf(stderr, "WARN: %s:%s:%d: ", __FILE__, __func__, __LINE__); \
+    fprintf(stderr, "%s\n", msg);
+
+
+/** debug info + perror goes to stderr to seperate from program output */
+#define INFO(msg) \
+    fprintf(stderr, "INFO: %s:%s:%d: ", __FILE__, __func__, __LINE__); \
+    perror(msg);
+
+/** debug info goes to stderr to seperate from program output */
+#define INFO_M(msg) \
+    fprintf(stderr, "INFO: %s:%s:%d: ", __FILE__, __func__, __LINE__); \
+    fprintf(stderr, "%s\n", msg);
+#else
+#define WARN(msg)
+#define WARN_M(msg)
+#define INFO(msg)
+#define INFO_M(msg)
+#endif
+
+int main() {
+    INFO("inf");
+    DIE_M("test");
+}
\ No newline at end of file
diff --git a/sscanf.c b/sscanf.c
index 855058ff2fd794d95053dd87f8aca0d0ee598642..64e784716217ecf7d88a7bc6dda0b124771dafed 100644
--- a/sscanf.c
+++ b/sscanf.c
@@ -13,4 +13,4 @@ int main() {
     if(res != 4) printf("err:%d\n", res);
 
     printf("Host:%s\nPath:%s\n%s:%d\n", host, path, var, version);
-}
\ No newline at end of file
+}