static int splen;
static int logfile_rotfail, logfile_openfail;
-typedef enum { LFMT_DEFAULT, LFMT_DEBUG, LFMT_SYSLOG_UTC, LFMT_SYSLOG_LOCAL } LogFormat;
+typedef enum { LFMT_DEBUG, LFMT_SYSLOG, LFMT_RFC3339 } LogFormat;
static LogFormat logfile_format;
+#define LFMT_LOCALTIME 0x80
+#define LFMT_DEFAULT LFMT_DEBUG
+#define LFMT_SYSLOG_LOCAL (LFMT_SYSLOG|LFMT_LOCALTIME)
+#define LFMT_SYSLOG_UTC (LFMT_SYSLOG)
+#define LFMT_RFC3339_UTC (LFMT_RFC3339)
+
static slap_verbmasks logformat_key[] = {
{ BER_BVC("default"), LFMT_DEFAULT },
{ BER_BVC("debug"), LFMT_DEBUG },
{ BER_BVC("syslog-utc"), LFMT_SYSLOG_UTC },
{ BER_BVC("syslog-localtime"), LFMT_SYSLOG_LOCAL },
+ { BER_BVC("rfc3339-utc"), LFMT_RFC3339_UTC },
{ BER_BVNULL, 0 }
};
static int logpathlen;
#define SYSLOG_STAMP "Mmm dd hh:mm:ss"
+#ifdef HAVE_CLOCK_GETTIME
+#define RFC3339_FRAC ".fffffffffZ"
+#else
+#define RFC3339_FRAC ".ffffffZ"
+#endif
+#define RFC3339_BASE "YYYY-mm-ddTHH:MM:SS"
+#define RFC3339_STAMP RFC3339_BASE RFC3339_FRAC
void
slap_debug_print( const char *data )
#ifdef HAVE_CLOCK_GETTIME
struct timespec tv;
#define TS "%08x"
+#define TSf ".%09ldZ"
#define Tfrac tv.tv_nsec
#define gettime(tv) clock_gettime( CLOCK_REALTIME, tv )
#else
struct timeval tv;
#define TS "%05x"
+#define TSf ".%06ldZ"
#define Tfrac tv.tv_usec
#define gettime(tv) gettimeofday( tv, NULL )
#endif
if ( logfile_format > LFMT_DEBUG ) {
struct tm tm;
- if ( logfile_format == LFMT_SYSLOG_UTC )
+ if ( !( logfile_format & LFMT_LOCALTIME ) )
ldap_pvt_gmtime( &tv.tv_sec, &tm );
else
ldap_pvt_localtime( &tv.tv_sec, &tm );
#else
ptr = syslog_prefix;
#endif
- strftime( ptr, sizeof( SYSLOG_STAMP ),
- "%b %d %H:%M:%S", &tm );
- ptr[ sizeof( SYSLOG_STAMP )-1 ] = ' ';
+ if ( logfile_format & LFMT_SYSLOG ) {
+ ptr += strftime( ptr, sizeof( SYSLOG_STAMP ),
+ "%b %d %H:%M:%S", &tm );
+ } else {
+ ptr += strftime( ptr, sizeof( RFC3339_BASE ),
+ "%Y-%m-%dT%H:%M:%S", &tm );
+ ptr += snprintf( ptr, sizeof( RFC3339_FRAC ), TSf, Tfrac );
+ }
+ *ptr = ' ';
#ifdef _WIN32
len = datalen + splen;
#else
}
if ( syslog_prefix )
ch_free( syslog_prefix );
- len = strlen( global_host ) + 1 + strlen( serverName ) + 1 + sizeof("[123456789]:") +
- sizeof( SYSLOG_STAMP );
- syslog_prefix = ch_malloc( len );
- splen = sprintf( syslog_prefix, SYSLOG_STAMP " %s %s[%d]: ", global_host, serverName, getpid() );
logfile_format = logformat_key[i].mask;
+ len = strlen( global_host ) + 1 + strlen( serverName ) + 1 + sizeof(("[123456789]:")) +
+ (( logfile_format & LFMT_RFC3339) ? sizeof( RFC3339_STAMP ) : sizeof( SYSLOG_STAMP ));
+ syslog_prefix = ch_malloc( len );
+ splen = sprintf( syslog_prefix, "%s %s %s[%d]: ", ( logfile_format & LFMT_RFC3339 ) ?
+ RFC3339_STAMP : SYSLOG_STAMP, global_host, serverName, getpid() );
}
break;