]> git.itanic.dy.fi Git - rrdd/blobdiff - debug.c
onewire_parser.c: Fix compiler warnings about string lengths
[rrdd] / debug.c
diff --git a/debug.c b/debug.c
index c139080a18fa743d9563334ec7435b0f8d7cfc41..201f7ef2d1a233cdaa70e877bee2fdaf19448224 100644 (file)
--- a/debug.c
+++ b/debug.c
@@ -1,8 +1,12 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 #include <time.h>
 #include <unistd.h>
 #include <stdarg.h>
-#include "process.h"
+#include <pthread.h>
 
+#include "process.h"
 #include "debug.h"
 
 const char red_color[] = {
@@ -17,16 +21,32 @@ const char normal_color[] = {
        0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x37, 0x3b, 0x34, 0x30, 0x6d, 0x0,
 };
 
-int trace_level = 1;
+int trace_level = TRACE_INFO;
+static int logfile_fd = STDERR_FILENO;
+
+static const char *assign_color(int color)
+{
+       switch (color) {
+       case 1:
+               return red_color;
+       case 2:
+               return green_color;
+       default:
+       return normal_color;
+       }
+}
 
 void print_trace(const char *file, int line, int color, int l,
                const char *fmt, ...)
 {
         va_list args;
        time_t t = time(0);
-       char indent[16] = { "               " };
        char time[32];
        char trace[1024];
+       char all_trace[1538];
+       char thread_name[16];
+       const char *color_str = assign_color(color);
+       int ret;
 
        if (l > trace_level)
                return;
@@ -35,12 +55,40 @@ void print_trace(const char *file, int line, int color, int l,
        vsnprintf(trace, sizeof(trace), fmt, args);
         va_end(args);
 
-       strftime(time, sizeof(time), "%d.%m.%Y %T ", localtime(&t));
-       indent[get_parent_count()] = 0;
+       strftime(time, sizeof(time), "%d.%m.%Y %T", localtime(&t));
+
+       pthread_getname_np(pthread_self(), thread_name, sizeof(thread_name));
 
-       fprintf(stderr, "%s%s %s[%5d.%d] %s:%d %s %s",
-               green_color, time, indent,
-               getpid(), get_parent_count(),
+       ret = snprintf(all_trace, sizeof(all_trace),
+               "%s%s [%s] %s:%d %s %s",
+               color_str, time,
+               thread_name,
                file, line, normal_color, trace);
-       fflush(stderr);
+
+       ret = write(logfile_fd, all_trace, ret);
+       /*
+        * If write failed, well, not much point in trying to print a
+        * trace about it.. So we just ignore the return value
+        */
+}
+
+int open_log_file(const char *logfile)
+{
+       int fd;
+
+       pr_info("Switching logging to file: %s\n", logfile);
+
+       fd = open(logfile, O_WRONLY | O_CREAT | O_APPEND, 0666);
+       if (fd < 0) {
+               pr_err("Failed to open logfile %s: %m\n", logfile);
+               return fd;
+       }
+
+       if (logfile_fd != STDERR_FILENO)
+               close(logfile_fd);
+       logfile_fd = fd;
+
+       pr_info("Opened file %s for logging\n", logfile);
+
+       return 0;
 }