]> git.itanic.dy.fi Git - rrdd/blobdiff - debug.c
debug: Add support for log files
[rrdd] / debug.c
diff --git a/debug.c b/debug.c
index 6c7042eda7af35cb91e2c0dd3c321afca9c08c7b..55fdd14937c8dd9d7080584b60a093412e5d5bef 100644 (file)
--- a/debug.c
+++ b/debug.c
@@ -1,3 +1,6 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 #include <time.h>
 #include <unistd.h>
 #include <stdarg.h>
@@ -18,6 +21,7 @@ const char normal_color[] = {
 };
 
 int trace_level = 1;
+int logfile_fd = STDERR_FILENO;
 
 static const char *assign_color(int color)
 {
@@ -38,7 +42,9 @@ void print_trace(const char *file, int line, int color, int l,
        time_t t = time(0);
        char time[32];
        char trace[1024];
+       char all_trace[1538];
        const char *color_str = assign_color(color);
+       int ret;
 
        if (l > trace_level)
                return;
@@ -49,9 +55,36 @@ void print_trace(const char *file, int line, int color, int l,
 
        strftime(time, sizeof(time), "%d.%m.%Y %T", localtime(&t));
 
-       fprintf(stderr, "%s%s [%5d.%d] %s:%d %s %s",
+       ret = snprintf(all_trace, sizeof(all_trace),
+               "%s%s [%5d.%d] %s:%d %s %s",
                color_str, time,
                getpid(), get_parent_count(),
                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;
 }