From eb734a167b5919aa16da2fcb9bf5d515b6bd66dc Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Tue, 27 Dec 2005 16:29:37 +0000 Subject: [PATCH] add severity-aware logging (ITS#4282) --- configure | 13 ++- configure.in | 7 +- include/ldap_log.h | 191 +++++++++++++++++++++++++++++--------- include/portable.hin | 3 + libraries/liblber/debug.c | 17 ---- servers/slapd/main.c | 46 ++++++++- servers/slapd/slap.h | 70 +++++++++++++- 7 files changed, 278 insertions(+), 69 deletions(-) diff --git a/configure b/configure index f531e94234..26696d6ff6 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in OpenLDAP: pkg/ldap/configure.in,v 1.609 2005/11/26 16:04:57 ando Exp . +# From configure.in OpenLDAP: pkg/ldap/configure.in,v 1.610 2005/12/16 15:52:59 ando Exp . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59. # @@ -1006,7 +1006,7 @@ if test -n "$ac_init_help"; then Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-debug enable debugging [yes] + --enable-debug enable debugging no|yes|traditional [yes] --enable-dynamic enable linking built binaries with dynamic libs [no] --enable-syslog enable syslog support [auto] --enable-proctitle enable proctitle support [yes] @@ -2176,7 +2176,7 @@ if test "${enable_debug+set}" = set; then enableval="$enable_debug" ol_arg=invalid - for ol_val in auto yes no ; do + for ol_val in no yes traditional ; do if test "$enableval" = "$ol_val" ; then ol_arg="$ol_val" fi @@ -44024,6 +44024,13 @@ _ACEOF fi if test "$ol_enable_debug" != no ; then + if test "$ol_enable_debug" = traditional; then + +cat >>confdefs.h <<\_ACEOF +#define OLD_DEBUG 1 +_ACEOF + + fi cat >>confdefs.h <<\_ACEOF #define LDAP_DEBUG 1 diff --git a/configure.in b/configure.in index 4998dc195d..cde34c5c87 100644 --- a/configure.in +++ b/configure.in @@ -222,7 +222,8 @@ AC_SUBST(ldap_subdir)dnl dnl ---------------------------------------------------------------- dnl General "enable" options -OL_ARG_ENABLE(debug,[ --enable-debug enable debugging], yes)dnl +dnl set default to traditional to enable the original debug style +OL_ARG_ENABLE(debug,[ --enable-debug enable debugging], yes, [no yes traditional])dnl OL_ARG_ENABLE(dynamic,[ --enable-dynamic enable linking built binaries with dynamic libs], no)dnl OL_ARG_ENABLE(syslog,[ --enable-syslog enable syslog support], auto)dnl OL_ARG_ENABLE(proctitle,[ --enable-proctitle enable proctitle support], yes)dnl @@ -2640,6 +2641,10 @@ if test "$ol_enable_slapi" != no ; then fi if test "$ol_enable_debug" != no ; then + if test "$ol_enable_debug" = traditional; then + AC_DEFINE(OLD_DEBUG,1, + [define to use the original debug style]) + fi AC_DEFINE(LDAP_DEBUG,1, [define this to add debugging code]) fi diff --git a/include/ldap_log.h b/include/ldap_log.h index 12ec9e326f..84f886e324 100644 --- a/include/ldap_log.h +++ b/include/ldap_log.h @@ -23,8 +23,8 @@ * is provided ``as is'' without express or implied warranty. */ -#ifndef _LDAP_LOG_H -#define _LDAP_LOG_H +#ifndef LDAP_LOG_H +#define LDAP_LOG_H #include #include @@ -39,19 +39,71 @@ LDAP_BEGIN_DECL * debugging levels begin with LDAP_LEVEL_ENTRY * */ -#define LDAP_LEVEL_EMERG 0 -#define LDAP_LEVEL_ALERT 1 -#define LDAP_LEVEL_CRIT 2 -#define LDAP_LEVEL_ERR 3 -#define LDAP_LEVEL_WARNING 4 -#define LDAP_LEVEL_NOTICE 5 -#define LDAP_LEVEL_INFO 6 -#define LDAP_LEVEL_ENTRY 7 /* log function entry points */ -#define LDAP_LEVEL_ARGS 8 /* log function call parameters */ -#define LDAP_LEVEL_RESULTS 9 /* Log function results */ -#define LDAP_LEVEL_DETAIL1 10 /* log level 1 function operational details */ -#define LDAP_LEVEL_DETAIL2 11 /* Log level 2 function operational details */ +/* + * The "OLD_DEBUG" means that all logging occurs at LOG_DEBUG + */ + +#ifdef OLD_DEBUG +/* original behavior: all logging occurs at the same severity level */ +#if defined(LDAP_DEBUG) && defined(LDAP_SYSLOG) +#define LDAP_LEVEL_EMERG ldap_syslog_level +#define LDAP_LEVEL_ALERT ldap_syslog_level +#define LDAP_LEVEL_CRIT ldap_syslog_level +#define LDAP_LEVEL_ERR ldap_syslog_level +#define LDAP_LEVEL_WARNING ldap_syslog_level +#define LDAP_LEVEL_NOTICE ldap_syslog_level +#define LDAP_LEVEL_INFO ldap_syslog_level +#define LDAP_LEVEL_DEBUG ldap_syslog_level +#else /* !LDAP_DEBUG || !LDAP_SYSLOG */ +#define LDAP_LEVEL_EMERG (7) +#define LDAP_LEVEL_ALERT (7) +#define LDAP_LEVEL_CRIT (7) +#define LDAP_LEVEL_ERR (7) +#define LDAP_LEVEL_WARNING (7) +#define LDAP_LEVEL_NOTICE (7) +#define LDAP_LEVEL_INFO (7) +#define LDAP_LEVEL_DEBUG (7) +#endif /* !LDAP_DEBUG || !LDAP_SYSLOG */ + +#else /* ! OLD_DEBUG */ +/* map syslog onto LDAP severity levels */ +#ifdef LOG_DEBUG +#define LDAP_LEVEL_EMERG LOG_EMERG +#define LDAP_LEVEL_ALERT LOG_ALERT +#define LDAP_LEVEL_CRIT LOG_CRIT +#define LDAP_LEVEL_ERR LOG_ERR +#define LDAP_LEVEL_WARNING LOG_WARNING +#define LDAP_LEVEL_NOTICE LOG_NOTICE +#define LDAP_LEVEL_INFO LOG_INFO +#define LDAP_LEVEL_DEBUG LOG_DEBUG +#else /* ! LOG_DEBUG */ +#define LDAP_LEVEL_EMERG (0) +#define LDAP_LEVEL_ALERT (1) +#define LDAP_LEVEL_CRIT (2) +#define LDAP_LEVEL_ERR (3) +#define LDAP_LEVEL_WARNING (4) +#define LDAP_LEVEL_NOTICE (5) +#define LDAP_LEVEL_INFO (6) +#define LDAP_LEVEL_DEBUG (7) +#endif /* ! LOG_DEBUG */ +#endif /* ! OLD_DEBUG */ +#if 0 +/* in case we need to reuse the unused bits of severity */ +#define LDAP_LEVEL_MASK(s) ((s) & 0x7) +#else +#define LDAP_LEVEL_MASK(s) (s) +#endif + +/* (yet) unused */ +#define LDAP_LEVEL_ENTRY (0x08) /* log function entry points */ +#define LDAP_LEVEL_ARGS (0x10) /* log function call parameters */ +#define LDAP_LEVEL_RESULTS (0x20) /* Log function results */ +#define LDAP_LEVEL_DETAIL1 (0x40) /* log level 1 function operational details */ +#define LDAP_LEVEL_DETAIL2 (0x80) /* Log level 2 function operational details */ +/* end of (yet) unused */ + +/* original subsystem selection mechanism */ #define LDAP_DEBUG_TRACE 0x0001 #define LDAP_DEBUG_PACKETS 0x0002 #define LDAP_DEBUG_ARGS 0x0004 @@ -79,48 +131,103 @@ LDAP_BEGIN_DECL * This is a bogus extern declaration for the compiler. No need to ensure * a 'proper' dllimport. */ -# ifndef ldap_debug - extern int ldap_debug; -# endif /* !ldap_debug */ +#ifndef ldap_debug +extern int ldap_debug; +#endif /* !ldap_debug */ -# ifdef LDAP_SYSLOG - extern int ldap_syslog; - extern int ldap_syslog_level; +#ifdef LDAP_SYSLOG +extern int ldap_syslog; +extern int ldap_syslog_level; -# ifdef HAVE_EBCDIC -# define syslog eb_syslog - extern void eb_syslog(int pri, const char *fmt, ...); -# endif +#ifdef HAVE_EBCDIC +#define syslog eb_syslog +extern void eb_syslog(int pri, const char *fmt, ...); +#endif /* HAVE_EBCDIC */ -# endif /* LDAP_SYSLOG */ +#endif /* LDAP_SYSLOG */ /* this doesn't below as part of ldap.h */ -# ifdef LDAP_SYSLOG -# define Debug( level, fmt, arg1, arg2, arg3 ) \ +#ifdef LDAP_SYSLOG +#define Log1( level, severity, fmt, arg1 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1) ); \ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (arg1) ); \ + } while ( 0 ) +#define Log2( level, severity, fmt, arg1, arg2 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2) ); \ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (arg1), (arg2) ); \ + } while ( 0 ) +#define Log3( level, severity, fmt, arg1, arg2, arg3 ) \ do { \ if ( ldap_debug & (level) ) \ lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3) ); \ if ( ldap_syslog & (level) ) \ - syslog( ldap_syslog_level, (fmt), (arg1), (arg2), (arg3) ); \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (arg1), (arg2), (arg3) ); \ + } while ( 0 ) +#define Log4( level, severity, fmt, arg1, arg2, arg3, arg4 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3), (arg4) ); \ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (arg1), (arg2), (arg3), (arg4) ); \ + } while ( 0 ) +#define Log5( level, severity, fmt, arg1, arg2, arg3, arg4, arg5 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3), (arg4), (arg5) ); \ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (arg1), (arg2), (arg3), (arg4), (arg5) ); \ } while ( 0 ) +#define Debug( level, fmt, arg1, arg2, arg3 ) \ + Log3( (level), ldap_syslog_level, (fmt), (arg1), (arg2), (arg3) ) +#define LogTest(level) ( ( ldap_debug | ldap_syslog ) & (level) ) -# else -# define Debug( level, fmt, arg1, arg2, arg3 ) \ +#else /* ! LDAP_SYSLOG */ +#define Log1( level, severity, fmt, arg1 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1) ); \ + } while ( 0 ) +#define Log2( level, severity, fmt, arg1, arg2 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2) ); \ + } while ( 0 ) +#define Log3( level, severity, fmt, arg1, arg2, arg3 ) \ do { \ if ( ldap_debug & (level) ) \ lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3) ); \ } while ( 0 ) -# endif - -#else /* LDAP_DEBUG */ -# define Debug( level, fmt, arg1, arg2, arg3 ) - -#endif /* LDAP_DEBUG */ - -#ifndef LDAP_LOG -#define LDAP_LOG(a, b, fmt, arg1, arg2, arg3) -#define LDAP_LOGS_TEST(a, b) 0 -#endif +#define Log4( level, severity, fmt, arg1, arg2, arg3, arg4 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3), (arg4) ); \ + } while ( 0 ) +#define Log5( level, severity, fmt, arg1, arg2, arg3, arg4, arg5 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3), (arg4), (arg5) ); \ + } while ( 0 ) +#define Debug( level, fmt, arg1, arg2, arg3 ) \ + Log3( (level), (fmt), (arg1), (arg2), (arg3) ) +#define LogTest(level) ( ldap_debug & (level) ) +#endif /* ! LDAP_SYSLOG */ +#else /* ! LDAP_DEBUG */ +/* TODO: in case LDAP_DEBUG is undefined, make sure logs with appropriate + * severity gets thru anyway */ +#define Log1( level, severity, fmt, arg1 ) +#define Log2( level, severity, fmt, arg1, arg2 ) +#define Log3( level, severity, fmt, arg1, arg2, arg3 ) +#define Log4( level, severity, fmt, arg1, arg2, arg3, arg4 ) +#define Log5( level, severity, fmt, arg1, arg2, arg3, arg4, arg5 ) +#define Debug( level, fmt, arg1, arg2, arg3 ) +#define LogTest(level) ( 0 ) +#endif /* ! LDAP_DEBUG */ LDAP_LUTIL_F(int) lutil_debug_file LDAP_P(( FILE *file )); @@ -130,4 +237,4 @@ LDAP_LUTIL_F(void) lutil_debug LDAP_P(( LDAP_END_DECL -#endif /* _LDAP_LOG_H */ +#endif /* LDAP_LOG_H */ diff --git a/include/portable.hin b/include/portable.hin index 7a66d3a100..6058195fe6 100644 --- a/include/portable.hin +++ b/include/portable.hin @@ -891,6 +891,9 @@ /* define if you have (or want) no threads */ #undef NO_THREADS +/* define to use the original debug style */ +#undef OLD_DEBUG + /* Package */ #undef OPENLDAP_PACKAGE diff --git a/libraries/liblber/debug.c b/libraries/liblber/debug.c index de6f947145..f61df96f97 100644 --- a/libraries/liblber/debug.c +++ b/libraries/liblber/debug.c @@ -34,23 +34,6 @@ static FILE *log_file = NULL; -#ifdef LDAP_SYSLOG -static int use_syslog = 0; - -static int debug2syslog(int l) { - switch (l) { - case LDAP_LEVEL_EMERG: return LOG_EMERG; - case LDAP_LEVEL_ALERT: return LOG_ALERT; - case LDAP_LEVEL_CRIT: return LOG_CRIT; - case LDAP_LEVEL_ERR: return LOG_ERR; - case LDAP_LEVEL_WARNING: return LOG_WARNING; - case LDAP_LEVEL_NOTICE: return LOG_NOTICE; - case LDAP_LEVEL_INFO: return LOG_INFO; - } - return LOG_DEBUG; -} -#endif - int lutil_debug_file( FILE *file ) { log_file = file; diff --git a/servers/slapd/main.c b/servers/slapd/main.c index 088a590bfe..7295ad853d 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -182,7 +182,9 @@ parse_syslog_user( const char *arg, int *syslogUser ) int i = verb_to_mask( optarg, syslogUsers ); if ( BER_BVISNULL( &syslogUsers[ i ].word ) ) { - Debug( LDAP_DEBUG_ANY, "unrecognized syslog user \"%s\".\n", optarg, 0, 0 ); + Debug( LDAP_DEBUG_ANY, + "unrecognized syslog user \"%s\".\n", + optarg, 0, 0 ); return 1; } @@ -192,6 +194,33 @@ parse_syslog_user( const char *arg, int *syslogUser ) } #endif /* LOG_LOCAL4 */ +static int +parse_syslog_level( const char *arg, int *levelp ) +{ + static slap_verbmasks str2syslog_level[] = { + { BER_BVC( "EMERG" ), LOG_EMERG }, + { BER_BVC( "ALERT" ), LOG_ALERT }, + { BER_BVC( "CRIT" ), LOG_CRIT }, + { BER_BVC( "ERR" ), LOG_ERR }, + { BER_BVC( "WARNING" ), LOG_WARNING }, + { BER_BVC( "NOTICE" ), LOG_NOTICE }, + { BER_BVC( "INFO" ), LOG_INFO }, + { BER_BVC( "DEBUG" ), LOG_DEBUG }, + { BER_BVNULL, 0 } + }; + int i = verb_to_mask( arg, str2syslog_level ); + if ( BER_BVISNULL( &str2syslog_level[ i ].word ) ) { + Debug( LDAP_DEBUG_ANY, + "unknown syslog level \"%s\".\n", + arg, 0, 0 ); + return 1; + } + + *levelp = str2syslog_level[ i ].mask; + + return 0; +} + int parse_debug_level( const char *arg, int *levelp ) { @@ -400,11 +429,14 @@ int main( int argc, char **argv ) #ifdef HAVE_CHROOT "r:" #endif +#ifdef LDAP_SYSLOG + "S:" +#endif #ifdef LOG_LOCAL4 - "l:" + "l:" #endif #if defined(HAVE_SETUID) && defined(HAVE_SETGID) - "u:g:" + "u:g:" #endif )) != EOF ) { switch ( i ) { @@ -514,6 +546,14 @@ int main( int argc, char **argv ) } break; +#if defined(LDAP_DEBUG) && defined(LDAP_SYSLOG) + case 'S': + if ( parse_syslog_level( optarg, &ldap_syslog_level ) ) { + goto destroy; + } + break; +#endif /* LDAP_DEBUG && LDAP_SYSLOG */ + #ifdef LOG_LOCAL4 case 'l': /* set syslog local user */ if ( parse_syslog_user( optarg, &syslogUser ) ) { diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 8392477e71..bb6a91ff51 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -2675,16 +2675,75 @@ typedef struct slap_conn { } Connection; #if defined(LDAP_SYSLOG) && defined(LDAP_DEBUG) -#define Statslog( level, fmt, connid, opid, arg1, arg2, arg3 ) \ +#define Statslog1( level, severity, fmt, connid, opid, arg1 ) \ + do { \ + if ( ldap_debug & (level) ) \ + fprintf( stderr, (fmt), (connid), (opid), (arg1) );\ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (connid), (opid), \ + (arg1) ); \ + } while (0) +#define Statslog2( level, severity, fmt, connid, opid, arg1, arg2 ) \ + do { \ + if ( ldap_debug & (level) ) \ + fprintf( stderr, (fmt), (connid), (opid), (arg1), (arg2) );\ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (connid), (opid), \ + (arg1), (arg2) ); \ + } while (0) +#define Statslog3( level, severity, fmt, connid, opid, arg1, arg2, arg3 ) \ do { \ if ( ldap_debug & (level) ) \ fprintf( stderr, (fmt), (connid), (opid), (arg1), (arg2), (arg3) );\ if ( ldap_syslog & (level) ) \ - syslog( ldap_syslog_level, (fmt), (connid), (opid), (arg1), \ - (arg2), (arg3) ); \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (connid), (opid), \ + (arg1), (arg2), (arg3) ); \ + } while (0) +#define Statslog4( level, severity, fmt, connid, opid, arg1, arg2, arg3, arg4 ) \ + do { \ + if ( ldap_debug & (level) ) \ + fprintf( stderr, (fmt), (connid), (opid), (arg1), (arg2), (arg3), (arg4) );\ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (connid), (opid), \ + (arg1), (arg2), (arg3), (arg4) ); \ + } while (0) +#define Statslog5( level, severity, fmt, connid, opid, arg1, arg2, arg3, arg4, arg5 ) \ + do { \ + if ( ldap_debug & (level) ) \ + fprintf( stderr, (fmt), (connid), (opid), (arg1), (arg2), (arg3), (arg4), (arg5) );\ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (connid), (opid), \ + (arg1), (arg2), (arg3), (arg4), (arg5) ); \ } while (0) +#define Statslog( level, fmt, connid, opid, arg1, arg2, arg3 ) \ + Statslog3( (level), ldap_syslog_level, (fmt), (connid), (opid), (arg1), (arg2), (arg3) ) #define StatslogTest( level ) ((ldap_debug | ldap_syslog) & (level)) #elif defined(LDAP_DEBUG) +#define Statslog1( level, severity, fmt, connid, opid, arg1 ) \ + do { \ + if ( ldap_debug & (level) ) \ + fprintf( stderr, (fmt), (connid), (opid), (arg1) );\ + } while (0) +#define Statslog2( level, severity, fmt, connid, opid, arg1, arg2 ) \ + do { \ + if ( ldap_debug & (level) ) \ + fprintf( stderr, (fmt), (connid), (opid), (arg1), (arg2) );\ + } while (0) +#define Statslog3( level, severity, fmt, connid, opid, arg1, arg2, arg3 ) \ + do { \ + if ( ldap_debug & (level) ) \ + fprintf( stderr, (fmt), (connid), (opid), (arg1), (arg2), (arg3) );\ + } while (0) +#define Statslog4( level, severity, fmt, connid, opid, arg1, arg2, arg3, arg4 ) \ + do { \ + if ( ldap_debug & (level) ) \ + fprintf( stderr, (fmt), (connid), (opid), (arg1), (arg2), (arg3), (arg4) );\ + } while (0) +#define Statslog5( level, severity, fmt, connid, opid, arg1, arg2, arg3, arg4, arg5 ) \ + do { \ + if ( ldap_debug & (level) ) \ + fprintf( stderr, (fmt), (connid), (opid), (arg1), (arg2), (arg3), (arg4), (arg5) );\ + } while (0) #define Statslog( level, fmt, connid, opid, arg1, arg2, arg3 ) \ do { \ if ( ldap_debug & (level) ) \ @@ -2692,6 +2751,11 @@ typedef struct slap_conn { } while (0) #define StatslogTest( level ) (ldap_debug & (level)) #else +#define Statslog1( level, severity, fmt, connid, opid, arg1 ) +#define Statslog2( level, severity, fmt, connid, opid, arg1, arg2 ) +#define Statslog3( level, severity, fmt, connid, opid, arg1, arg2, arg3 ) +#define Statslog4( level, severity, fmt, connid, opid, arg1, arg2, arg3, arg4 ) +#define Statslog5( level, severity, fmt, connid, opid, arg1, arg2, arg3, arg4, arg5 ) #define Statslog( level, fmt, connid, opid, arg1, arg2, arg3 ) #define StatslogTest( level ) (0) #endif -- 2.39.5