YAZ  5.34.0
Macros | Enumerations | Functions | Variables
log.c File Reference

Logging utility. More...

#include <yaz/yconfig.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <errno.h>
#include <time.h>
#include <yaz/yaz-iconv.h>
#include <yaz/thread_id.h>
#include <yaz/log.h>
#include <yaz/mutex.h>
#include <yaz/snprintf.h>
#include <yaz/xmalloc.h>

Go to the source code of this file.

Macros

#define TIMEFORMAT_LEN   50
 
#define TID_LEN   30
 
#define MAX_MASK_NAMES   35 /* 32 bits plus a few combo names */
 

Enumerations

enum  l_file_type { use_stderr , use_none , use_file }
 

Functions

static void yaz_log_open (void)
 
void yaz_log_lock (void)
 Lock for YAZ log writes. More...
 
void yaz_log_unlock (void)
 Unlock for YAZ log writes. More...
 
void yaz_log_init_globals (void)
 
FILE * yaz_log_file (void)
 returns FILE handle for log or NULL if no file is in use More...
 
void yaz_log_close (void)
 
void yaz_log_deinit_globals (void)
 
void yaz_log_init_file (const char *fname)
 sets log file More...
 
static void rotate_log (const char *cur_fname)
 
void yaz_log_init_level (int level)
 sets log level More...
 
void yaz_log_init_prefix (const char *prefix)
 sets log message prefix More...
 
void yaz_log_init_prefix2 (const char *prefix)
 sets second log message prefix More...
 
void yaz_log_init (int level, const char *prefix, const char *fname)
 sets level, prefix and filename for logging More...
 
void yaz_log_init_max_size (int mx)
 sets limit in bytes for size for log file More...
 
void yaz_log_set_handler (void(*func)(int, const char *, void *), void *info)
 sets custom log handler More...
 
void log_event_start (void(*func)(int, const char *, void *), void *info)
 
void log_event_end (void(*func)(int, const char *, void *), void *info)
 
static void yaz_log_open_check (struct tm *tm, int force, const char *filemode)
 
static void yaz_log_do_reopen (const char *filemode)
 
void yaz_log_reopen ()
 reopen current log file (unless disabled or stderr) More...
 
void yaz_log_trunc ()
 Truncate the log file. More...
 
static void yaz_strftime (char *dst, size_t sz, const char *fmt, const struct tm *tm)
 
static void yaz_log_to_file (int level, const char *fmt, va_list ap, const char *error_cp)
 
void yaz_log (int level, const char *fmt,...)
 Writes log message. More...
 
void yaz_log_time_format (const char *fmt)
 sets time format for log mesages More...
 
static char * clean_name (const char *name, size_t len, char *namebuf, size_t buflen)
 
static int define_module_bit (const char *name)
 
int yaz_log_module_level (const char *name)
 returns level for module More...
 
int yaz_log_mask_str (const char *str)
 converts log level string to log level (integer) More...
 
int yaz_log_mask_str_x (const char *str, int level)
 converts log level string to log level with "start" level More...
 

Variables

static int l_level = YLOG_DEFAULT_LEVEL
 
struct {
   enum l_file_type   type
 
   FILE *   log_file
 
   char   l_prefix [512]
 
   char   l_prefix2 [512]
 
   char   l_fname [512]
 
yaz_log_info
 
static void(* start_hook_func )(int, const char *, void *) = NULL
 
static void * start_hook_info
 
static void(* end_hook_func )(int, const char *, void *) = NULL
 
static void * end_hook_info
 
static void(* hook_func )(int, const char *, void *) = NULL
 
static void * hook_info
 
static char l_old_default_format [] = "%H:%M:%S-%d/%m"
 
static char l_new_default_format [] = "%Y%m%d-%H%M%S"
 
static char l_custom_format [TIMEFORMAT_LEN] = ""
 
static char * l_actual_format = l_old_default_format
 
static int l_max_size = 0
 
struct {
   int   mask
 
   char *   name
 
mask_names [MAX_MASK_NAMES]
 
static unsigned int next_log_bit = YLOG_LAST_BIT<<1
 
static int yaz_log_reopen_flag = 0
 
static YAZ_MUTEX log_mutex = 0
 

Detailed Description

Logging utility.

Definition in file log.c.

Macro Definition Documentation

◆ MAX_MASK_NAMES

#define MAX_MASK_NAMES   35 /* 32 bits plus a few combo names */

Definition at line 81 of file log.c.

◆ TID_LEN

#define TID_LEN   30

Definition at line 68 of file log.c.

◆ TIMEFORMAT_LEN

#define TIMEFORMAT_LEN   50

Definition at line 67 of file log.c.

Enumeration Type Documentation

◆ l_file_type

Enumerator
use_stderr 
use_none 
use_file 

Definition at line 44 of file log.c.

Function Documentation

◆ clean_name()

static char* clean_name ( const char *  name,
size_t  len,
char *  namebuf,
size_t  buflen 
)
static

cleans a loglevel name from leading paths and suffixes

Definition at line 548 of file log.c.

References name.

Referenced by yaz_log_module_level().

◆ define_module_bit()

static int define_module_bit ( const char *  name)
static

Definition at line 563 of file log.c.

References malloc(), mask_names, MAX_MASK_NAMES, name, next_log_bit, yaz_log(), and YLOG_WARN.

◆ log_event_end()

void log_event_end ( void(*)(int, const char *, void *)  func,
void *  info 
)

Definition at line 310 of file log.c.

References end_hook_func, and end_hook_info.

◆ log_event_start()

void log_event_start ( void(*)(int, const char *, void *)  func,
void *  info 
)

Definition at line 304 of file log.c.

References start_hook_func, and start_hook_info.

◆ rotate_log()

static void rotate_log ( const char *  cur_fname)
static

Definition at line 190 of file log.c.

References yaz_log_close(), and yaz_snprintf().

Referenced by yaz_log_open_check().

◆ yaz_log()

void yaz_log ( int  level,
const char *  fmt,
  ... 
)

Writes log message.

Parameters
levellog level mask
fmtformat string ala printf

Writes an entry in the log. Defaults to stderr if not initialized or to a file with yaz_log_init_file(). The level must match the level set via yaz_log_init_level(), optionally defined via yaz_log_mask_str().

Definition at line 487 of file log.c.

References end_hook_func, end_hook_info, hook_func, hook_info, l_level, start_hook_func, start_hook_info, yaz_init_globals(), yaz_log_file(), yaz_log_to_file(), yaz_strerror(), yaz_vsnprintf(), and YLOG_ERRNO.

Referenced by add_listener(), addterms(), assoc_init_reset(), build_facet_response(), ccl_qual_field(), check_ip_tcpd(), check_slow(), completeBER(), completeBER_n(), config_include_one(), construct_rdf_lookup(), cont_connect(), control_association(), convert_rdf_lookup(), cql2pqf(), cql_transform_parse_tok_line(), create_association(), create_net_socket(), define_module_bit(), destroy_rdf_lookup(), diagrec(), do_close_req(), do_read(), do_write_ex(), encode_APDU(), free_block(), get_block(), get_zoom_facet_field(), gfs_server_chdir(), handle_http(), handle_srw_response(), handle_Z3950_records(), inetd_connection(), init_diagnostics(), iochan_event_loop(), ir_read(), ir_session(), listener(), log_scan_term_level(), log_warn(), new_session(), nmem_malloc(), nmem_reset(), odr_createmem(), odr_destroy(), odr_reset(), pack_records(), process_close(), process_deleteRequest(), process_ESRequest(), process_gdu_response(), process_http_request(), process_initRequest(), process_presentRequest(), process_scanRequest(), process_searchRequest(), process_sortRequest(), process_z_request(), rdf_lookup_debug_comment(), rdf_lookup_node(), read_file(), read_grs1(), readconf(), response_searchRequest(), resultset_destroy(), send_APDU(), send_package(), send_Z3950_sort(), srw_bend_explain(), srw_bend_init(), srw_bend_scan(), srw_bend_search(), srw_bend_update(), statserv_sc_main(), statserv_setcontrol(), surrogatediagrec(), tcpip_accept(), tcpip_bind(), tcpip_close(), tcpip_connect(), tcpip_get(), tcpip_listen(), tcpip_put(), tcpip_rcvconnect(), tcpip_type(), unix_accept(), unix_bind(), unix_close(), unix_connect(), unix_get(), unix_listen(), unix_put(), unix_rcvconnect(), unix_straddr1(), unix_strtoaddr(), unix_strtoaddr_ex(), unix_type(), xcalloc_f(), xfree_f(), xmalloc_f(), xml_config_bend_start(), xml_config_bend_stop(), xml_config_get_root(), xml_config_open(), xml_config_read(), xml_error_handler(), xrealloc_f(), xstrdup_f(), yaz_check_print1(), yaz_daemon(), yaz_facet_attr_get_z_attributes(), yaz_log_init_level(), yaz_log_module_level(), yaz_log_zquery_level(), yaz_mutex_enter(), yaz_mutex_leave(), yaz_sc_program(), yaz_sru_proxy_decode_facet_field(), Z3950_send_present(), Z3950_send_search(), z_External(), zlog_attributes(), zlog_structure(), ZOOM_connection_connect(), ZOOM_connection_create(), ZOOM_connection_destroy(), ZOOM_connection_do_io(), ZOOM_connection_exec_task(), ZOOM_connection_search(), ZOOM_connection_show_task(), ZOOM_connection_show_tasks(), ZOOM_connection_Z3950_search(), ZOOM_connection_Z3950_send_scan(), ZOOM_event_nonblock(), ZOOM_handle_facet_list(), ZOOM_handle_Z3950_apdu(), ZOOM_memcached_add(), ZOOM_memcached_hitcount(), ZOOM_memcached_lookup(), ZOOM_memcached_search(), ZOOM_resultset_addref(), ZOOM_resultset_create(), ZOOM_resultset_records(), ZOOM_resultset_retrieve(), ZOOM_resultset_sort1(), ZOOM_set_dset_error(), zoom_yaz_str_to_z3950oid(), ztest_esrequest(), and ztest_search().

◆ yaz_log_close()

void yaz_log_close ( void  )

Definition at line 150 of file log.c.

References use_file, and yaz_log_info.

Referenced by rotate_log(), yaz_log_deinit_globals(), yaz_log_init_file(), and yaz_log_open_check().

◆ yaz_log_deinit_globals()

void yaz_log_deinit_globals ( void  )

Definition at line 159 of file log.c.

References log_mutex, yaz_log_close(), and yaz_mutex_destroy().

Referenced by yaz_deinit_globals().

◆ yaz_log_do_reopen()

static void yaz_log_do_reopen ( const char *  filemode)
static

Definition at line 372 of file log.c.

References yaz_log_lock(), yaz_log_open_check(), and yaz_log_unlock().

Referenced by yaz_log_open(), and yaz_log_trunc().

◆ yaz_log_file()

FILE* yaz_log_file ( void  )

returns FILE handle for log or NULL if no file is in use

Return values
FILEFILE handle in use (possibly stderr)
NULLlog is currently not written to a file

Definition at line 138 of file log.c.

References use_file, use_none, use_stderr, and yaz_log_info.

Referenced by cql_transform_parse_tok_line(), create_association(), do_read(), ir_read(), yaz_daemon(), yaz_log(), yaz_log_to_file(), ZOOM_connection_connect(), and ztest_esrequest().

◆ yaz_log_init()

void yaz_log_init ( int  level,
const char *  prefix,
const char *  fname 
)

sets level, prefix and filename for logging

Parameters
levellog level
prefixlog message prefix
fnamefilename

If fname is NULL, the filename logging is not changed.

Definition at line 281 of file log.c.

References yaz_init_globals(), yaz_log_init_file(), yaz_log_init_level(), and yaz_log_init_prefix().

◆ yaz_log_init_file()

void yaz_log_init_file ( const char *  fname)

sets log file

Parameters
fnamefilename

A filename of NULL makes the log to be completely disabled. A filename which is the empty string ("") makes the system log to stderr (which is also the default). Otherwise the filename given is used.

Definition at line 168 of file log.c.

References use_file, use_none, use_stderr, yaz_init_globals(), yaz_log_close(), yaz_log_info, and yaz_log_open().

Referenced by check_options(), yaz_check_init_log(), and yaz_log_init().

◆ yaz_log_init_globals()

void yaz_log_init_globals ( void  )

Definition at line 124 of file log.c.

References l_level, log_mutex, yaz_log_lock(), yaz_log_mask_str_x(), yaz_log_unlock(), and yaz_mutex_create().

Referenced by yaz_init_globals().

◆ yaz_log_init_level()

void yaz_log_init_level ( int  level)

sets log level

Parameters
level(combination of YLOG_..)

Definition at line 228 of file log.c.

References l_level, mask, mask_names, name, yaz_init_globals(), yaz_log(), yaz_log_open(), YLOG_FLUSH, YLOG_LAST_BIT, and YLOG_LOGLVL.

Referenced by check_options(), and yaz_log_init().

◆ yaz_log_init_max_size()

void yaz_log_init_max_size ( int  mx)

sets limit in bytes for size for log file

Parameters
mxsize in bytes

Sets the max size for a log file. Zero means no limit. Negative means built-in limit (1GB)

Definition at line 290 of file log.c.

References l_max_size.

Referenced by check_options().

◆ yaz_log_init_prefix()

void yaz_log_init_prefix ( const char *  prefix)

sets log message prefix

Parameters
prefixlog message prefix

Definition at line 263 of file log.c.

References yaz_log_info, and yaz_snprintf().

Referenced by listener(), and yaz_log_init().

◆ yaz_log_init_prefix2()

void yaz_log_init_prefix2 ( const char *  prefix)

sets second log message prefix

Parameters
prefixlog message prefix

Definition at line 272 of file log.c.

References yaz_log_info, and yaz_snprintf().

◆ yaz_log_lock()

void yaz_log_lock ( void  )

Lock for YAZ log writes.

Definition at line 114 of file log.c.

References log_mutex, and yaz_mutex_enter().

Referenced by yaz_log_do_reopen(), yaz_log_init_globals(), and yaz_log_to_file().

◆ yaz_log_mask_str()

int yaz_log_mask_str ( const char *  str)

converts log level string to log level (integer)

Parameters
strlog level string
Returns
log level mask

yaz_log_mask_str() converts a comma-separated list of log levels to a bit mask. Starts from default level, and adds bits as specified, unless 'none' is specified, which clears the list. If a name matches the name of a YLOG_BIT above, that one is set. Otherwise a new value is picked, and given to that name, to be found with yaz_log_module_level()

Definition at line 606 of file log.c.

References l_level, yaz_init_globals(), and yaz_log_mask_str_x().

Referenced by check_options().

◆ yaz_log_mask_str_x()

int yaz_log_mask_str_x ( const char *  str,
int  level 
)

converts log level string to log level with "start" level

Parameters
strlog level string
levelinitialing log level
Returns
log level mask

yaz_log_mask_str_x() is like yaz_log_mask_str(), but with a given start value.

Definition at line 614 of file log.c.

Referenced by yaz_log_init_globals(), and yaz_log_mask_str().

◆ yaz_log_module_level()

int yaz_log_module_level ( const char *  name)

returns level for module

Parameters
namemodule name
Returns
log level for module

yaz_log_module_level() returns a log level mask corresponding to the module name. If that had been specified on the -v arguments (that is passed to yaz_log_mask_str()), then a non-zero mask is returned. If not, we get a zero. This can later be used in yaz_log for the level argument

Definition at line 586 of file log.c.

References clean_name(), mask, mask_names, name, yaz_init_globals(), yaz_log(), and YLOG_LOGLVL.

Referenced by bend_init(), get_logbits(), initlog(), iochan_create(), nmem_create(), odr_createmem(), odr_reset(), tcpip_init(), unix_init(), xcalloc_f(), xmalloc_f(), xmalloc_trav_f(), xrealloc_f(), and xstrdup_f().

◆ yaz_log_open()

static void yaz_log_open ( void  )
static

Definition at line 396 of file log.c.

References yaz_log_do_reopen().

Referenced by yaz_log_init_file(), and yaz_log_init_level().

◆ yaz_log_open_check()

static void yaz_log_open_check ( struct tm *  tm,
int  force,
const char *  filemode 
)
static

Definition at line 316 of file log.c.

References l_max_size, rotate_log(), use_file, yaz_log_close(), yaz_log_info, and yaz_log_reopen_flag.

Referenced by yaz_log_do_reopen(), and yaz_log_to_file().

◆ yaz_log_reopen()

void yaz_log_reopen ( void  )

reopen current log file (unless disabled or stderr)

Definition at line 391 of file log.c.

References yaz_log_reopen_flag.

◆ yaz_log_set_handler()

void yaz_log_set_handler ( void(*)(int, const char *, void *)  func,
void *  info 
)

sets custom log handler

Parameters
funccustom log handler
infocustom pointer to be passed to func handler

Allows log output to be captured to something else.. The func parameter takes a log level, a message + custom pointer

Definition at line 298 of file log.c.

References hook_func, and hook_info.

◆ yaz_log_time_format()

void yaz_log_time_format ( const char *  fmt)

sets time format for log mesages

Parameters
fmtformat (strftime)

Sets the format of the timestamp. See man 3 strftime. Calling with "old" sets to the old format "11:55:06-02/11" Calling with NULL or "" sets to the new format "20041102-115719" If not called at all, the old format is used, for backward compatibility

Definition at line 529 of file log.c.

References l_actual_format, l_custom_format, l_new_default_format, l_old_default_format, and TIMEFORMAT_LEN.

Referenced by check_options().

◆ yaz_log_to_file()

static void yaz_log_to_file ( int  level,
const char *  fmt,
va_list  ap,
const char *  error_cp 
)
static

◆ yaz_log_trunc()

void yaz_log_trunc ( void  )

Truncate the log file.

Definition at line 401 of file log.c.

References yaz_log_do_reopen().

Referenced by yaz_check_init_log().

◆ yaz_log_unlock()

void yaz_log_unlock ( void  )

Unlock for YAZ log writes.

Definition at line 119 of file log.c.

References log_mutex, and yaz_mutex_leave().

Referenced by yaz_log_do_reopen(), yaz_log_init_globals(), and yaz_log_to_file().

◆ yaz_strftime()

static void yaz_strftime ( char *  dst,
size_t  sz,
const char *  fmt,
const struct tm *  tm 
)
static

Definition at line 406 of file log.c.

Referenced by yaz_log_to_file().

Variable Documentation

◆ end_hook_func

void(* end_hook_func) (int, const char *, void *) ( int  ,
const char *  ,
void *   
) = NULL
static

Definition at line 59 of file log.c.

Referenced by log_event_end(), and yaz_log().

◆ end_hook_info

void* end_hook_info
static

Definition at line 60 of file log.c.

Referenced by log_event_end(), and yaz_log().

◆ hook_func

void(* hook_func) (int, const char *, void *) ( int  ,
const char *  ,
void *   
) = NULL
static

Definition at line 62 of file log.c.

Referenced by yaz_log(), and yaz_log_set_handler().

◆ hook_info

void* hook_info
static

Definition at line 63 of file log.c.

Referenced by yaz_log(), and yaz_log_set_handler().

◆ l_actual_format

char* l_actual_format = l_old_default_format
static

Definition at line 70 of file log.c.

Referenced by yaz_log_time_format(), and yaz_log_to_file().

◆ l_custom_format

char l_custom_format[TIMEFORMAT_LEN] = ""
static

Definition at line 69 of file log.c.

Referenced by yaz_log_time_format().

◆ l_fname

char l_fname[512]

Definition at line 51 of file log.c.

◆ l_level

int l_level = YLOG_DEFAULT_LEVEL
static

◆ l_max_size

int l_max_size = 0
static

l_max_size tells when to rotate the log. The default value is 0 which means DISABLED. This is to be preffered if YAZ runs as a server using logrotate etc. A positive size specifies the file size in bytes when a log rotate will occur. Note that in order for this to work YAZ must have permissions to do so.

Definition at line 79 of file log.c.

Referenced by yaz_log_init_max_size(), and yaz_log_open_check().

◆ l_new_default_format

char l_new_default_format[] = "%Y%m%d-%H%M%S"
static

Definition at line 66 of file log.c.

Referenced by yaz_log_time_format().

◆ l_old_default_format

char l_old_default_format[] = "%H:%M:%S-%d/%m"
static

Definition at line 65 of file log.c.

Referenced by yaz_log_time_format().

◆ l_prefix

char l_prefix[512]

Definition at line 49 of file log.c.

◆ l_prefix2

char l_prefix2[512]

Definition at line 50 of file log.c.

◆ log_file

FILE* log_file

Definition at line 48 of file log.c.

◆ log_mutex

YAZ_MUTEX log_mutex = 0
static

Definition at line 110 of file log.c.

Referenced by yaz_log_deinit_globals(), yaz_log_init_globals(), yaz_log_lock(), and yaz_log_unlock().

◆ mask

int mask

◆ 

struct { ... } mask_names[MAX_MASK_NAMES]
Initial value:
=
{
{ YLOG_FATAL, "fatal"},
{ YLOG_DEBUG, "debug"},
{ YLOG_WARN, "warn" },
{ YLOG_LOG, "log" },
{ YLOG_ERRNO, ""},
{ YLOG_MALLOC, "malloc"},
{ YLOG_TID, "tid" },
{ YLOG_APP, "app" },
{ YLOG_NOTIME, "notime" },
{ YLOG_APP2, "app2" },
{ YLOG_APP3, "app3" },
{ YLOG_ALL, "all" },
{ YLOG_FLUSH, "flush" },
{ YLOG_LOGLVL, "loglevel" },
{ 0, "none" },
{ 0, NULL }
}
#define YLOG_APP2
log level: application 2
Definition: log.h:60
#define YLOG_WARN
log level: warning
Definition: log.h:46
#define YLOG_FATAL
log level: fatal
Definition: log.h:42
#define YLOG_MALLOC
log level: malloc debug
Definition: log.h:56
#define YLOG_ERRNO
log level: append system error message
Definition: log.h:50
#define YLOG_FLUSH
log level: flush
Definition: log.h:64
#define YLOG_DEBUG
log level: debugging
Definition: log.h:44
#define YLOG_APP
log level: application
Definition: log.h:54
#define YLOG_NOTIME
log level: do not output date and time
Definition: log.h:58
#define YLOG_TID
log level: append thread Id
Definition: log.h:52
#define YLOG_ALL
Definition: log.h:69
#define YLOG_LOGLVL
dynamic log level start
Definition: log.h:66
#define YLOG_LOG
log level: log (regular)
Definition: log.h:48
#define YLOG_APP3
log level: application 3
Definition: log.h:62

Referenced by define_module_bit(), yaz_log_init_level(), yaz_log_module_level(), and yaz_log_to_file().

◆ name

char* name

◆ next_log_bit

unsigned int next_log_bit = YLOG_LAST_BIT<<1
static

Definition at line 106 of file log.c.

Referenced by define_module_bit().

◆ start_hook_func

void(* start_hook_func) (int, const char *, void *) ( int  ,
const char *  ,
void *   
) = NULL
static

Definition at line 56 of file log.c.

Referenced by log_event_start(), and yaz_log().

◆ start_hook_info

void* start_hook_info
static

Definition at line 57 of file log.c.

Referenced by log_event_start(), and yaz_log().

◆ type

enum l_file_type type

◆ 

struct { ... } yaz_log_info

◆ yaz_log_reopen_flag

int yaz_log_reopen_flag = 0
static

Definition at line 108 of file log.c.

Referenced by yaz_log_open_check(), and yaz_log_reopen().