From cf86dbaf75f4c81e406036b6695c717cf4fd1331 Mon Sep 17 00:00:00 2001 From: Brian Bockelman Date: Wed, 24 Oct 2012 20:28:09 -0500 Subject: [PATCH 1/3] First attempt at syslog code for dprintf. --- src/condor_includes/dprintf_internal.h | 11 ++++- src/condor_utils/dprintf_setup.cpp | 16 ++++++ src/condor_utils/dprintf_syslog.cpp | 19 +++++++ src/condor_utils/dprintf_syslog.h | 82 ++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 1 deletions(-) create mode 100644 src/condor_utils/dprintf_syslog.cpp create mode 100644 src/condor_utils/dprintf_syslog.h diff --git a/src/condor_includes/dprintf_internal.h b/src/condor_includes/dprintf_internal.h index c26a886..b0ecf48 100644 --- a/src/condor_includes/dprintf_internal.h +++ b/src/condor_includes/dprintf_internal.h @@ -17,6 +17,9 @@ * ***************************************************************/ +#ifndef __dprintf_internal_h_ +#define __dprintf_internal_h_ + // This #define doesn't actually do anything. This value needs to be // defined before any system header files are included in the source file // to have any effect. @@ -27,6 +30,7 @@ typedef _Longlong int64_t; #else #include #endif +#include struct DebugFileInfo; @@ -37,7 +41,8 @@ enum DebugOutput FILE_OUT, STD_OUT, STD_ERR, - OUTPUT_DEBUG_STR + OUTPUT_DEBUG_STR, + SYSLOG }; /* future @@ -70,6 +75,7 @@ struct DebugFileInfo bool want_truncate; bool accepts_all; bool dont_panic; + void *userData; DebugFileInfo() : outputTarget(FILE_OUT), debugFP(0), @@ -79,6 +85,7 @@ struct DebugFileInfo want_truncate(false), accepts_all(false), dont_panic(false), + userData(NULL), dprintfFunc(NULL) {} DebugFileInfo(const DebugFileInfo &dfi) : outputTarget(dfi.outputTarget), debugFP(NULL), choice(dfi.choice), @@ -115,3 +122,5 @@ void _dprintf_global_func(int cat_and_flags, int hdr_flags, time_t clock_now, st void dprintf_to_outdbgstr(int cat_and_flags, int hdr_flags, time_t clock_now, struct tm *tm, const char* message, DebugFileInfo* dbgInfo); #endif +#endif + diff --git a/src/condor_utils/dprintf_setup.cpp b/src/condor_utils/dprintf_setup.cpp index 440ef98..b1ccd3a 100644 --- a/src/condor_utils/dprintf_setup.cpp +++ b/src/condor_utils/dprintf_setup.cpp @@ -24,6 +24,7 @@ #include "condor_sys_types.h" #include "condor_debug.h" #include "dprintf_internal.h" +#include "dprintf_syslog.h" #include "condor_constants.h" #if HAVE_BACKTRACE @@ -134,6 +135,13 @@ void dprintf_set_outputs(const struct dprintf_output_settings *p_info, int c_inf it->dprintfFunc = dprintf_to_outdbgstr; } #endif + else if (logPath == "SYSLOG") + { + // Intention is to eventually user-selected + it->dprintfFunc = DprintfSyslog::Log; + it->outputTarget = SYSLOG; + it->userData = static_cast(DprintfSyslogFactory::NewLog(LOG_DAEMON)); + } else { it->outputTarget = FILE_OUT; @@ -211,6 +219,14 @@ void dprintf_set_outputs(const struct dprintf_output_settings *p_info, int c_inf if(debugLogsOld) { + + for (it = debugLogsOld->begin(); it != debugLogsOld->end(); it++) + { + if ((it->outputTarget == SYSLOG) && (it->userData)) + { + delete static_cast(it->userData); + } + } delete debugLogsOld; } diff --git a/src/condor_utils/dprintf_syslog.cpp b/src/condor_utils/dprintf_syslog.cpp new file mode 100644 index 0000000..d0189f8 --- /dev/null +++ b/src/condor_utils/dprintf_syslog.cpp @@ -0,0 +1,19 @@ + +#include "condor_common.h" +#include "condor_debug.h" +#include "dprintf_syslog.h" + +DprintfSyslogFactory * DprintfSyslogFactory::m_singleton = NULL; + +void +DprintfSyslog::Log(const char * message) +{ + syslog(LOG_INFO, "%s", message); +} + +DprintfSyslog::~DprintfSyslog() +{ + DprintfSyslogFactory &factory = DprintfSyslogFactory::getInstance(); + factory.DecCount(); +} + diff --git a/src/condor_utils/dprintf_syslog.h b/src/condor_utils/dprintf_syslog.h new file mode 100644 index 0000000..a10d42d --- /dev/null +++ b/src/condor_utils/dprintf_syslog.h @@ -0,0 +1,82 @@ + +#include "dprintf_internal.h" +#include + +class DprintfSyslogFactory; + +class DprintfSyslog +{ + friend class DprintfSyslogFactory; + +public: + static void Log(int, int, time_t, struct tm*, const char * message, DebugFileInfo* info) + { + if (!info || !info->userData) + { + return; + } + DprintfSyslog * logger = static_cast(info->userData); + logger->Log(message); + } + + ~DprintfSyslog(); + +protected: + DprintfSyslog() {} + +private: + void Log(const char *); +}; + +class DprintfSyslogFactory +{ + friend class DprintfSyslog; + +public: + static DprintfSyslog *NewLog(int facility) + { + DprintfSyslogFactory & factory = getInstance(); + return factory.NewDprintfSyslog(facility); + } + +protected: + void DecCount() + { + m_count--; + if (m_count == 0) + { + closelog(); + } + } + + static DprintfSyslogFactory & getInstance() + { + if (!m_singleton) + { + m_singleton = new DprintfSyslogFactory(); + } + return *m_singleton; + } + +private: + DprintfSyslog * NewDprintfSyslog(int facility) + { + DprintfSyslog * logger = new DprintfSyslog(); + if (!logger) return NULL; + if (m_count == 0) + { + openlog("condor", LOG_PID|LOG_NDELAY, facility); + } + m_count++; + return logger; + } + + DprintfSyslogFactory() : + m_count(0) + { + } + + static DprintfSyslogFactory *m_singleton; + + unsigned int m_count; +}; -- 1.7.4.1 From 5b17f58b41722735bf1a7da34c728bfe3114479b Mon Sep 17 00:00:00 2001 From: Brian Bockelman Date: Wed, 24 Oct 2012 20:46:52 -0500 Subject: [PATCH 2/3] Don't provide an ident - it defaults to the binary name, which is more useful anyway. --- src/condor_utils/dprintf_syslog.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/condor_utils/dprintf_syslog.h b/src/condor_utils/dprintf_syslog.h index a10d42d..364a228 100644 --- a/src/condor_utils/dprintf_syslog.h +++ b/src/condor_utils/dprintf_syslog.h @@ -65,7 +65,7 @@ private: if (!logger) return NULL; if (m_count == 0) { - openlog("condor", LOG_PID|LOG_NDELAY, facility); + openlog(NULL, LOG_PID|LOG_NDELAY, facility); } m_count++; return logger; -- 1.7.4.1 From d082fcc410b3729241dbe82912f526d51a96a2f5 Mon Sep 17 00:00:00 2001 From: Brian Bockelman Date: Tue, 30 Oct 2012 18:15:21 -0500 Subject: [PATCH 3/3] Prevent dprintf_syslog from compiling on Windows. --- src/condor_utils/CMakeLists.txt | 4 +++- src/condor_utils/dprintf_setup.cpp | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/condor_utils/CMakeLists.txt b/src/condor_utils/CMakeLists.txt index 7ce1fd6..7de76fb 100644 --- a/src/condor_utils/CMakeLists.txt +++ b/src/condor_utils/CMakeLists.txt @@ -84,10 +84,12 @@ endif() ################################################## # condorapi & tests -condor_selective_glob("my_username.*;condor_event.*;file_sql.*;misc_utils.*;user_log_header.*;write_user_log*;read_user_log*;iso_dates.*;file_lock.*;format_time.*;utc_time.*;stat_wrapper*;log_rotate.*;dprintf*;sig_install.*;basename.*;mkargv.*;except.*;strupr.*;lock_file.*;rotate_file.*;strcasestr.*;strnewp.*;condor_environ.*;setsyscalls.*;passwd_cache.*;uids.c*;chomp.*;subsystem_info.*;my_subsystem.*;distribution.*;my_distribution.*;get_random_num.*;libcondorapi_stubs.*;seteuid.*;setegid.*;condor_open.*;classad_merge.*;condor_attributes.*;simple_arg.*;compat_classad.*;compat_classad_util.*;classad_oldnew.*;condor_snutils.*;stringSpace.*;string_list.*;stl_string_utils.*;MyString.*;condor_xml_classads.*;directory*;param_functions.*;filename_tools_cpp.*;filename_tools.*;stat_info.*;${SAFE_OPEN_SRC}" ApiSrcs) +condor_selective_glob("my_username.*;condor_event.*;file_sql.*;misc_utils.*;user_log_header.*;write_user_log*;read_user_log*;iso_dates.*;file_lock.*;format_time.*;utc_time.*;stat_wrapper*;log_rotate.*;dprintf.cpp;dprintf_c*;dprintf_setup.cpp;sig_install.*;basename.*;mkargv.*;except.*;strupr.*;lock_file.*;rotate_file.*;strcasestr.*;strnewp.*;condor_environ.*;setsyscalls.*;passwd_cache.*;uids.c*;chomp.*;subsystem_info.*;my_subsystem.*;distribution.*;my_distribution.*;get_random_num.*;libcondorapi_stubs.*;seteuid.*;setegid.*;condor_open.*;classad_merge.*;condor_attributes.*;simple_arg.*;compat_classad.*;compat_classad_util.*;classad_oldnew.*;condor_snutils.*;stringSpace.*;string_list.*;stl_string_utils.*;MyString.*;condor_xml_classads.*;directory*;param_functions.*;filename_tools_cpp.*;filename_tools.*;stat_info.*;${SAFE_OPEN_SRC}" ApiSrcs) if(WINDOWS) condor_selective_glob("directory.WINDOWS.*;directory_util.*;dynuser.WINDOWS.*;lock_file.WINDOWS.*;lsa_mgr.*;my_dynuser.*;ntsysinfo.WINDOWS.*;posix.WINDOWS.*;stat.WINDOWS.*;store_cred.*;token_cache.WINDOWS.*;truncate.WINDOWS.*" ApiSrcs) set_property( TARGET utils_genparams PROPERTY FOLDER "libraries" ) +else() + condor_selective_glob("dprintf_syslog*" ApiSrcs) endif() condor_static_lib( condorapi "${ApiSrcs}" ) diff --git a/src/condor_utils/dprintf_setup.cpp b/src/condor_utils/dprintf_setup.cpp index b1ccd3a..b5938e2 100644 --- a/src/condor_utils/dprintf_setup.cpp +++ b/src/condor_utils/dprintf_setup.cpp @@ -24,7 +24,9 @@ #include "condor_sys_types.h" #include "condor_debug.h" #include "dprintf_internal.h" +#if !defined(WIN32) #include "dprintf_syslog.h" +#endif #include "condor_constants.h" #if HAVE_BACKTRACE @@ -134,7 +136,7 @@ void dprintf_set_outputs(const struct dprintf_output_settings *p_info, int c_inf it->outputTarget = OUTPUT_DEBUG_STR; it->dprintfFunc = dprintf_to_outdbgstr; } -#endif +#else else if (logPath == "SYSLOG") { // Intention is to eventually user-selected @@ -142,6 +144,7 @@ void dprintf_set_outputs(const struct dprintf_output_settings *p_info, int c_inf it->outputTarget = SYSLOG; it->userData = static_cast(DprintfSyslogFactory::NewLog(LOG_DAEMON)); } +#endif else { it->outputTarget = FILE_OUT; @@ -224,7 +227,9 @@ void dprintf_set_outputs(const struct dprintf_output_settings *p_info, int c_inf { if ((it->outputTarget == SYSLOG) && (it->userData)) { +#if !defined(WIN32) delete static_cast(it->userData); +#endif } } delete debugLogsOld; -- 1.7.4.1