From cf86dbaf75f4c81e406036b6695c717cf4fd1331 Mon Sep 17 00:00:00 2001
From: Brian Bockelman <bbockelm@cse.unl.edu>
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 <stdint.h>
#endif
+#include <ctime>
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<void*>(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<DprintfSyslog*>(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 <syslog.h>
+
+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<DprintfSyslog*>(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 <bbockelm@cse.unl.edu>
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 <bbockelm@cse.unl.edu>
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<void*>(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<DprintfSyslog*>(it->userData);
+#endif
}
}
delete debugLogsOld;
--
1.7.4.1