/*
- * Copyright (C) 1995-2006, Index Data ApS
+ * Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: log.c,v 1.43 2006-11-27 14:09:32 adam Exp $
+ * $Id: log.c,v 1.49 2007-03-22 09:13:13 adam Exp $
*/
/**
#include <time.h>
#include <yaz/nmem.h>
#include <yaz/log.h>
+#include <yaz/snprintf.h>
#include <yaz/xmalloc.h>
static NMEM_MUTEX log_mutex = 0;
static int l_level = YLOG_DEFAULT_LEVEL;
-enum l_file_type { use_stderr, use_none, use_file };
+enum l_file_type { use_stderr, use_none, use_file };
static enum l_file_type yaz_file_type = use_stderr;
static FILE *yaz_global_log_file = NULL;
static void rotate_log(const char *cur_fname)
{
int i;
+
#ifdef WIN32
/* windows can't rename a file if it is open */
- fclose(yaz_global_log_file);
- yaz_global_log_file = 0;
+ yaz_log_close();
#endif
for (i = 0; i<9; i++)
{
char new_filename[512];
static char cur_filename[512] = "";
+ if (yaz_file_type != use_file)
+ return;
+
if (l_fname && *l_fname)
{
strftime(new_filename, sizeof(new_filename)-1, l_fname, tm);
}
}
- if (l_max_size > 0 && yaz_global_log_file && yaz_file_type == use_file)
+ if (l_max_size > 0 && yaz_global_log_file)
{
long flen = ftell(yaz_global_log_file);
if (flen > l_max_size)
force = 1;
}
}
- if (force && yaz_file_type == use_file && *cur_filename)
+ if (force && *cur_filename)
{
+ FILE *new_file;
+#ifdef WIN32
yaz_log_close();
- yaz_global_log_file = fopen(cur_filename, filemode);
- if (l_level & YLOG_FLUSH)
- setvbuf(yaz_global_log_file, 0, _IONBF, 0);
+#endif
+ new_file = fopen(cur_filename, filemode);
+ if (new_file)
+ {
+ yaz_log_close();
+ yaz_global_log_file = new_file;
+ if (l_level & YLOG_FLUSH)
+ setvbuf(yaz_global_log_file, 0, _IONBF, 0);
+ }
+ else
+ {
+ /* disable log rotate */
+ l_max_size = 0;
+ }
}
}
#ifdef WIN32
DWORD tid = GetCurrentThreadId();
#else
- long tid = 0;
#if YAZ_POSIX_THREADS
- tid = pthread_self();
+ pthread_t tid = pthread_self();
+#else
+ long tid = 0;
#endif
#endif
memcpy(fmt2, fmt, cp-fmt);
level &= ~mask_names[i].mask;
}
}
-
- if (l_level & YLOG_NOTIME)
- tbuf[0] = '\0';
- else
- yaz_strftime(tbuf, TIMEFORMAT_LEN-1, l_actual_format, tm);
- tbuf[TIMEFORMAT_LEN-1] = '\0';
-
- fprintf(file, "%s %s%s %s%s\n", tbuf, l_prefix, flags, l_prefix2,
+
+ tbuf[0] = '\0';
+ if (!(l_level & YLOG_NOTIME))
+ {
+ yaz_strftime(tbuf, TIMEFORMAT_LEN-2, l_actual_format, tm);
+ tbuf[TIMEFORMAT_LEN-2] = '\0';
+ }
+ if (tbuf[0])
+ strcat(tbuf, " ");
+ fprintf(file, "%s%s%s %s%s\n", tbuf, l_prefix, flags, l_prefix2,
log_message);
if (l_level & YLOG_FLUSH)
fflush(file);
if (!(level & l_level))
return;
va_start(ap, fmt);
-#ifdef WIN32
- _vsnprintf(buf, sizeof(buf)-1, fmt, ap);
-#else
-/* !WIN32 */
-#if HAVE_VSNPRINTF
- vsnprintf(buf, sizeof(buf), fmt, ap);
-#else
- vsprintf(buf, fmt, ap);
-#endif
-#endif
-/* WIN32 */
+
+ yaz_vsnprintf(buf, sizeof(buf)-1, fmt, ap);
if (o_level & YLOG_ERRNO)
{
strcat(buf, " [");