Add lock/unlock for YAZ log writes YAZ-843
[yaz-moved-to-github.git] / include / yaz / log.h
index 37b97f7..9268287 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2010 Index Data.
+ * Copyright (C) Index Data.
  * All rights reserved.
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -48,14 +48,16 @@ YAZ_BEGIN_CDECL
 #define YLOG_LOG    0x00000008
 /** \brief log level: append system error message */
 #define YLOG_ERRNO  0x00000010
+/** \brief log level: append thread Id */
+#define YLOG_TID    0x00000020
 /** \brief log level: application */
-#define YLOG_APP    0x00000040 
+#define YLOG_APP    0x00000040
 /** \brief log level: malloc debug */
 #define YLOG_MALLOC 0x00000080
 /** \brief log level: do not output date and time */
 #define YLOG_NOTIME 0x00000100
 /** \brief log level: application 2 */
-#define YLOG_APP2   0x00000200 
+#define YLOG_APP2   0x00000200
 /** \brief log level: application 3 */
 #define YLOG_APP3   0x00000400
 /** \brief log level: flush */
@@ -78,12 +80,19 @@ YAZ_BEGIN_CDECL
 /** \brief sets level, prefix and filename for logging
     \param level log level
     \param prefix log message prefix
-    \param fname filename 
+    \param fname filename
+
+    If fname is NULL, the filename logging is not changed.
 */
 YAZ_EXPORT void yaz_log_init(int level, const char *prefix, const char *fname);
 
-/** \brief sets log to a file 
-    \param fname filename 
+/** \brief sets log file
+    \param fname filename
+
+    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.
 */
 YAZ_EXPORT void yaz_log_init_file(const char *fname);
 
@@ -92,7 +101,7 @@ YAZ_EXPORT void yaz_log_init_file(const char *fname);
 */
 YAZ_EXPORT void yaz_log_init_level(int level);
 
-/** \brief sets log message prefix 
+/** \brief sets log message prefix
     \param prefix log message prefix
 */
 YAZ_EXPORT void yaz_log_init_prefix(const char *prefix);
@@ -112,7 +121,7 @@ YAZ_EXPORT void yaz_log_init_prefix2(const char *prefix);
 */
 YAZ_EXPORT void yaz_log_time_format(const char *fmt);
 
-/** \brief sets limit in bytes for size for log file 
+/** \brief sets limit in bytes for size for log file
     \param mx size in bytes
 
     Sets the max size for a log file. Zero means no limit.
@@ -123,7 +132,7 @@ YAZ_EXPORT void yaz_log_init_max_size(int mx);
 /** \brief Writes log message
     \param level log level mask
     \param fmt format 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().
@@ -137,12 +146,12 @@ YAZ_EXPORT void yaz_log(int level, const char *fmt, ...)
 /** \brief converts log level string to log level (integer)
     \param str log level string
     \return 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() 
+    picked, and given to that name, to be found with yaz_log_module_level()
 */
 YAZ_EXPORT int yaz_log_mask_str(const char *str);
 
@@ -152,13 +161,13 @@ YAZ_EXPORT int yaz_log_mask_str(const char *str);
     \return log level mask
 
     yaz_log_mask_str_x() is like yaz_log_mask_str(), but with a given start
-    value
+    value.
 */
 YAZ_EXPORT int yaz_log_mask_str_x(const char *str, int level);
 
-
 /** \brief returns level for module
     \param name module 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
@@ -169,7 +178,7 @@ YAZ_EXPORT int yaz_log_mask_str_x(const char *str, int level);
 YAZ_EXPORT int yaz_log_module_level(const char *name);
 
 /** \brief returns FILE handle for log or NULL if no file is in use
-    \retval FILE FILE handle in use
+    \retval FILE FILE handle in use (possibly stderr)
     \retval NULL log is currently not written to a file
 */
 YAZ_EXPORT FILE *yaz_log_file(void);
@@ -177,81 +186,47 @@ YAZ_EXPORT FILE *yaz_log_file(void);
 /** \brief sets custom log handler
     \param func custom log handler
     \param info custom 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
 */
 YAZ_EXPORT void yaz_log_set_handler(void (*func)(int, const char *,
                                                  void *), void *info);
 
+/** \brief reopen current log file (unless disabled or stderr)
+ */
 YAZ_EXPORT void yaz_log_reopen(void);
 
 /** \brief Truncate the log file */
 YAZ_EXPORT void yaz_log_trunc(void);
 
+/** \brief installs hook to be called before each log msg
+    \param func function to be called
+    \param info user data to be passed to function
+ */
 YAZ_EXPORT void log_event_start(void (*func)(int level, const char *msg,
                                              void *info), void *info);
 
+/** \brief installs hook to be called after each log msg
+    \param func function to be called
+    \param info user data to be passed to function
+ */
 YAZ_EXPORT void log_event_end(void (*func)(int level, const char *msg,
                                            void *info), void *info);
 
-
-/** \brief Makes Libxml2/Libxslt log errors via yaz_log
+/** \brief Makes Libxml2 and Libxslt log errors through yaz_log
     \param prefix prefix to use for log messages (may be 0)
-    \param log_level log level to use for messages
+    \param log_level log level to use for Libxml2/Libxslt messages
 */
 YAZ_EXPORT void yaz_log_xml_errors(const char *prefix, int log_level);
 
-/* by default, do not enable the old LOG_-defines */
-#ifndef YAZ_USE_NEW_LOG
-#define YAZ_USE_NEW_LOG 1
-#endif
-
-#if YAZ_USE_NEW_LOG
-
-#else
-
-#include <yaz/xmalloc.h>
-
-/** The old LOG_ bit names are here for compatibility only. They may 
-    conflict with bits defined in syslog.h, or other places. 'LOG'
-    really is not such a good name. YLOG must be more unique
+/** \brief Lock for YAZ log writes
 */
+YAZ_EXPORT void yaz_log_lock(void);
 
-/** \brief old log level */
-#define LOG_FATAL  YLOG_FATAL
-/** \brief old log level */
-#define LOG_DEBUG  YLOG_DEBUG
-/** \brief old log level */
-#define LOG_WARN   YLOG_WARN
-/** \brief old log level */
-#define LOG_LOG    YLOG_LOG
-/** \brief old log level */
-#define LOG_ERRNO  YLOG_ERRNO 
-/** \brief old log level */
-#define LOG_FILE   0x00000020
-/** \brief old log level */
-#define LOG_APP    YLOG_APP
-/** \brief old log level */
-#define LOG_MALLOC YLOG_MALLOC
-/** \brief old log level */
-#define LOG_NOTIME YLOG_NOTIME
-/** \brief old log level */
-#define LOG_APP2   YLOG_APP2
-/** \brief old log level */
-#define LOG_APP3   YLOG_APP3
-/** \brief old log level */
-#define LOG_FLUSH  YLOG_FLUSH 
-/** \brief old log level */
-#define LOG_ALL    YLOG_ALL
-/** \brief old log level */
-#define LOG_DEFAULT_LEVEL YLOG_DEFAULT_LEVEL
-
-/** \brief logf is deprecated, as it conflicts with a math function */
-#define logf yaz_log
-
-#endif /* if !YAZ_USE_NEW_LOG  */
-
+/** \brief Unlock for YAZ log writes
+*/
+YAZ_EXPORT void yaz_log_unlock(void);
 YAZ_END_CDECL
 
 #endif