+#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[] = {
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;
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;
}