Abdelkader Chelouah wrote:
> > Hi,
> >
> > slapd 2.4.44
> >
> > OpenLDAP instance configure as a proxy (back-ldap)
> >
> >
> > From time to time, bind operations can take more than 5 sec. These 
> > latencies do not seem to come from a CPU or memory problem. I'm trying to 
> > see if the network
> > can be the root cause of the issue. To debug the fonction ldap_sasl_bind 
> > (libraries/libldap/sasl.c), I activated trace loglevel (logs are manage by 
> > rsyslog). In
> > the definition of ldap_sasl_bind, there is
> >
> > Debug( LDAP_DEBUG_TRACE, "ldap_sasl_bind\n", 0, 0, 0 );
> >
> > A least the message "ldap_sasl_bind" should appear in logs, which is not 
> > the case. Actually, Debug (which is first defined in include/ldap_log.h) is 
> > redefined
> > in libraries/libldap/ldap-int.h
> >
> > ...
> >
> > #include "ldap_log.h"
> >
> > #undef Debug
> >
> > #ifdef LDAP_DEBUG
> >
> > #define DebugTest( level ) \
> >         ( ldap_debug & level )
> >
> > #define Debug( level, fmt, arg1, arg2, arg3 ) \
> >         do { if ( ldap_debug & level ) \
> >         ldap_log_printf( NULL, (level), (fmt), (arg1), (arg2), (arg3) ); \
> >         } while ( 0 )
> >
> > #define LDAP_Debug( subsystem, level, fmt, arg1, arg2, arg3 )\
> >         ldap_log_printf( NULL, (level), (fmt), (arg1), (arg2), (arg3) )
> > configure
> > #else
> >
> > #define DebugTest( level )                                    (0 == 1)
> > #define Debug( level, fmt, arg1, arg2, arg3 )                 ((void)0)
> > #define LDAP_Debug( subsystem, level, fmt, arg1, arg2, arg3 ) ((void)0)
> >
> > #endif /* LDAP_DEBUG */
> >
> > ...
> >
> > A a result, the message is send to standard output. By using rsyslog, it is 
> > not possible to catch any message inside ldap_sasl_bind.
> >
> >
> > How to get stdout and stderr messages and still use rsyslog to manage 
> > openldap logs ?

> syslog is not fast enough to handle the debug traffic.

> You could use ber_set_option() to override the log output functions, and have 
> them write
> messages both to rsyslog and stderr. But using syslog on every debug message 
> will slow
> things down more than 10x.

Hi,

I'am also interressed to enable stderr and stdout to rsyslog.

I try to figure out how to use ber_set_option(), but i'am pretty sur i miss 
something in my analysis.

Starting from the function ldap_sasl_bind in file libraries/libldap/sasl.c

+ Debug( LDAP_DEBUG_TRACE, "ldap_sasl_bind\n", 0, 0, 0 );

Debug is macro define in first place in include/ldap_log.h and override by 
libraries/libldap/ldap-int.h

So Debug is replace by ldap_log_printf() which is defined in 
libraries/libldap/print.c,  ldap_log_printf() make some check and get varargs 
and send to pointer function 'ber_pvt_log_print'
ber_pvt_log_print  is pointer to  ber_error_print()  in file 
libraries/liblber/bprint.c. So the target is to change ber_pvt_log_print

In function ber_set_option() we can redefine the print function 
ber_pvt_log_print to write messages both to rsyslog and stderr.

(in /servers/slapd/main.c) ber_set_option(NULL, LBER_OPT_LOG_PRINT_FN, 
&print_syslog);

The function is pretty basic :

void    print_syslog( LDAP_CONST char *data )

{

        Log0(LDAP_DEBUG_ANY, ldap_syslog_level, data);

        return ;

}

Of course i declare prototype in header file. Is it what you have in mind or 
should i use a function in OpenLDAP  ?

Reply via email to