* Copyright (C) 1995-2006, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: log.c,v 1.41 2006-10-04 07:42:13 adam Exp $
+ * $Id: log.c,v 1.42 2006-10-09 11:21:37 adam Exp $
*/
/**
#include <yaz/xmalloc.h>
static NMEM_MUTEX log_mutex = 0;
-static int mutex_init_flag = 0; /* not yet initialized */
#define HAS_STRERROR 1
#endif
-static int default_log_level(void)
-{
- char *env = getenv("YAZ_LOG");
- if (env != 0)
- return yaz_log_mask_str_x(env, YLOG_DEFAULT_LEVEL);
- else
- return YLOG_DEFAULT_LEVEL;
-}
-
-
-static int l_level = -1; /* will be set from default_log_level() */
+static int l_level = YLOG_DEFAULT_LEVEL;
enum l_file_type { use_stderr, use_none, use_file };
static enum l_file_type yaz_file_type = use_stderr;
static unsigned int next_log_bit = YLOG_LAST_BIT<<1; /* first dynamic bit */
-static void init_mutex(void)
+static void internal_log_init(void)
{
+ static int mutex_init_flag = 0; /* not yet initialized */
+ char *env;
+
if (mutex_init_flag)
return;
+ mutex_init_flag = 1; /* here, 'cause nmem_mutex_create may call yaz_log */
+
nmem_mutex_create(&log_mutex);
- mutex_init_flag = 1;
+
+ env = getenv("YAZ_LOG");
+ if (env)
+ l_level = yaz_log_mask_str_x(env, l_level);
}
+
FILE *yaz_log_file(void)
{
FILE *f = 0;
void yaz_log_init_file(const char *fname)
{
- init_mutex();
+ internal_log_init();
yaz_log_close();
if (fname)
void yaz_log_init_level(int level)
{
- init_mutex();
- if (l_level < 0)
- l_level = default_log_level();
+ internal_log_init();
if ( (l_level & YLOG_FLUSH) != (level & YLOG_FLUSH) )
{
l_level = level;
}
else
l_level = level;
+
if (l_level & YLOG_LOGLVL)
{ /* dump the log level bits */
const char *bittype = "Static ";
void yaz_log_init(int level, const char *prefix, const char *fname)
{
- init_mutex();
+ internal_log_init();
yaz_log_init_level(level);
yaz_log_init_prefix(prefix);
if (fname && *fname)
{
yaz_log_close();
yaz_global_log_file = fopen(cur_filename, filemode);
- if (l_level < 0) l_level = default_log_level();
if (l_level & YLOG_FLUSH)
setvbuf(yaz_global_log_file, 0, _IONBF, 0);
}
struct tm *tm;
#endif
- init_mutex();
+ internal_log_init();
nmem_mutex_enter(log_mutex);
fprintf(file, "%s %s%s %s%s\n", tbuf, l_prefix, flags, l_prefix2,
log_message);
- if (l_level & (YLOG_FLUSH|YLOG_DEBUG) )
+ if (l_level & YLOG_FLUSH)
fflush(file);
}
nmem_mutex_leave(log_mutex);
FILE *file;
int o_level = level;
- if (l_level < 0)
- l_level = default_log_level();
+ internal_log_init();
if (!(level & l_level))
return;
va_start(ap, fmt);
static int define_module_bit(const char *name)
{
int i;
- init_mutex();
+
nmem_mutex_enter(log_mutex);
for (i = 0; mask_names[i].name; i++)
if (0 == strcmp(mask_names[i].name, name))
int i;
char clean[255];
char *n = clean_name(name, strlen(name), clean, sizeof(clean));
- init_mutex();
+ internal_log_init();
nmem_mutex_enter(log_mutex);
for (i = 0; mask_names[i].name; i++)
}
nmem_mutex_leave(log_mutex);
yaz_log(YLOG_LOGLVL, "returning NO log bit for '%s' %s", n,
- strcmp(n, name) ? name : "" );
+ strcmp(n, name) ? name : "" );
return 0;
}
int yaz_log_mask_str(const char *str)
{
- return yaz_log_mask_str_x(str, default_log_level());
+ internal_log_init(); /* since l_level may be affected */
+ return yaz_log_mask_str_x(str, l_level);
}
int yaz_log_mask_str_x(const char *str, int level)
{
const char *p;
+ internal_log_init();
while (*str)
{
int negated = 0;
* NT threaded server code by
* Chas Woodfield, Fretwell Downing Informatics.
*
- * $Id: statserv.c,v 1.44 2006-09-29 13:20:23 adam Exp $
+ * $Id: statserv.c,v 1.45 2006-10-09 11:21:37 adam Exp $
*/
/**
/*
* default behavior.
*/
-#define STAT_DEFAULT_LOG_LEVEL "none,fatal,warn,log,server,session,request"
-/* the 'none' clears yaz' own default settings, including [log] */
+#define STAT_DEFAULT_LOG_LEVEL "server,session,request"
int check_options(int argc, char **argv);
statserv_options_block control_block = {
int ret = 0, r;
char *arg;
- if (getenv("YAZ_LOG") == 0) {
- /*
- * Set default log level. We want to avoid doing this if the
- * user has already explicitly specified a preferred default
- * log-level, hence the inelegant peek at the YAZ_LOG
- * environment variable that will subsequently be interpreted
- * by the YAZ logging module itself.
- */
- yaz_log_init_level(yaz_log_mask_str(STAT_DEFAULT_LOG_LEVEL));
- }
-
+ yaz_log_init_level(yaz_log_mask_str(STAT_DEFAULT_LOG_LEVEL));
get_logbits(1);
+
while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:A:p:DC:f:m:r:",
argv, argc, &arg)) != -2)
{
}
yaz_log_time_format(arg);
break;
- case 'v': {
- int default_level = yaz_log_mask_str(STAT_DEFAULT_LOG_LEVEL);
- yaz_log_init_level(yaz_log_mask_str_x(arg, default_level));
+ case 'v':
+ yaz_log_init_level(yaz_log_mask_str(arg));
get_logbits(1);
break;
- }
case 'a':
option_copy(control_block.apdufile, arg);
break;