LRN: Fix automake deps to allow -j* builds again
[oweals/gnunet.git] / src / util / common_logging.c
index 74f28ff7686662434b8c71c38fe4591c6394336b..46393674178cc4d11be0550087e8c5b5ad05a1e6 100644 (file)
@@ -31,7 +31,7 @@
 #include "gnunet_time_lib.h"
 
 /**
- * After how many seconds do we always print
+ * After how many milliseconds do we always print
  * that "message X was repeated N times"?  Use 12h.
  */
 #define BULK_DELAY_THRESHOLD (12 * 60 * 60 * 1000)
@@ -134,6 +134,13 @@ static unsigned int skip_log;
  */
 static FILE *GNUNET_stderr;
 
+#ifdef WINDOWS
+/**
+ * Contains the number of performance counts per second.
+ */
+LARGE_INTEGER performance_frequency;
+#endif
+
 /**
  * Convert a textual description of a loglevel
  * to the respective GNUNET_GE_KIND.
@@ -172,13 +179,29 @@ GNUNET_log_setup (const char *comp, const char *loglevel, const char *logfile)
   FILE *altlog;
   int dirwarn;
   char *fn;
+  const char *env_loglevel;
+  int env_minlevel = 0;
+  int env_min_force_level = 100000;
 
+#ifdef WINDOWS
+  QueryPerformanceFrequency (&performance_frequency);
+#endif
   GNUNET_free_non_null (component);
   GNUNET_asprintf (&component,
                   "%s-%d",
                   comp,
                   getpid());
+  env_loglevel = getenv ("GNUNET_LOGLEVEL");
+  if (env_loglevel != NULL)
+    env_minlevel = get_type (env_loglevel);
+  env_loglevel = getenv ("GNUNET_FORCE_LOGLEVEL");
+  if (env_loglevel != NULL)
+    env_min_force_level = get_type (env_loglevel);
   min_level = get_type (loglevel);
+  if (env_minlevel > min_level)
+    min_level = env_minlevel;
+  if (env_min_force_level < min_level)
+    min_level = env_min_force_level;
   if (logfile == NULL)
     return GNUNET_OK;
   fn = GNUNET_STRINGS_filename_expand (logfile);
@@ -355,7 +378,9 @@ mylog (enum GNUNET_ErrorType kind,
        const char *comp, const char *message, va_list va)
 {
   char date[DATE_STR_SIZE];
+  char date2[DATE_STR_SIZE];
   time_t timetmp;
+  struct timeval timeofday;
   struct tm *tmptr;
   size_t size;
   char *buf;
@@ -378,8 +403,20 @@ mylog (enum GNUNET_ErrorType kind,
   time (&timetmp);
   memset (date, 0, DATE_STR_SIZE);
   tmptr = localtime (&timetmp);
+  gettimeofday(&timeofday, NULL);
   if (NULL != tmptr)
-    strftime (date, DATE_STR_SIZE, "%b %d %H:%M:%S", tmptr);
+  {
+#ifdef WINDOWS
+    LARGE_INTEGER pc;
+    pc.QuadPart = 0;
+    QueryPerformanceCounter (&pc);
+    strftime (date2, DATE_STR_SIZE, "%b %d %H:%M:%S-%%020llu", tmptr);
+    snprintf (date, sizeof (date), date2, (long long) (pc.QuadPart / (performance_frequency.QuadPart / 1000)));
+#else
+    strftime (date2, DATE_STR_SIZE, "%b %d %H:%M:%S-%%06u", tmptr);
+    snprintf (date, sizeof (date), date2, timeofday.tv_usec);
+#endif
+  }
   else
     strcpy (date, "localtime error");
   if ((0 != (kind & GNUNET_ERROR_TYPE_BULK)) &&
@@ -436,8 +473,15 @@ GNUNET_log_from (enum GNUNET_ErrorType kind,
                  const char *comp, const char *message, ...)
 {
   va_list va;
+  char comp_w_pid[128];
+
   va_start (va, message);
-  mylog (kind, comp, message, va);
+  GNUNET_snprintf (comp_w_pid,
+                  sizeof (comp_w_pid),
+                  "%s-%d",
+                  comp,
+                  getpid());
+  mylog (kind, comp_w_pid, message, va);
   va_end (va);
 }