diff options
author | William R. Otte <wotte@dre.vanderbilt.edu> | 2008-03-04 14:51:23 +0000 |
---|---|---|
committer | William R. Otte <wotte@dre.vanderbilt.edu> | 2008-03-04 14:51:23 +0000 |
commit | 99aa8c60282c7b8072eb35eb9ac815702f5bf586 (patch) | |
tree | bda96bf8c3a4c2875a083d7b16720533c8ffeaf4 /ACE/ace/Log_Msg_UNIX_Syslog.cpp | |
parent | c4078c377d74290ebe4e66da0b4975da91732376 (diff) | |
download | ATCD-99aa8c60282c7b8072eb35eb9ac815702f5bf586.tar.gz |
undoing accidental deletion
Diffstat (limited to 'ACE/ace/Log_Msg_UNIX_Syslog.cpp')
-rw-r--r-- | ACE/ace/Log_Msg_UNIX_Syslog.cpp | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/ACE/ace/Log_Msg_UNIX_Syslog.cpp b/ACE/ace/Log_Msg_UNIX_Syslog.cpp new file mode 100644 index 00000000000..dba78bcd571 --- /dev/null +++ b/ACE/ace/Log_Msg_UNIX_Syslog.cpp @@ -0,0 +1,207 @@ +// $Id$ + +#include "ace/config-all.h" + +#if !defined (ACE_LACKS_UNIX_SYSLOG) + +#include "ace/ACE.h" +#include "ace/Log_Msg.h" +#include "ace/Log_Msg_UNIX_Syslog.h" +#include "ace/Log_Record.h" +#include "ace/OS_NS_string.h" +#include "ace/os_include/os_syslog.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL + +// NOTE: +// The ACE_Log_Msg_UNIX_Syslog class can use the openlog(), +// setlogmask(), syslog() and closelog() routines in a thread safe +// manner (versus using openlog_r(), et. al.), as the ACE_Log_Msg +// class uses the lock provided by its local ACE_Log_Msg_Manager +// class when calling the methods of the backend classes. As a +// result, logging semantics with respect to the UNIX syslog +// facility, will be the same for all threads in a process. This +// should not be too limiting, as the ACE_Log_Msg class itself can +// be used to control thread specific logging behavior. + +ACE_Log_Msg_UNIX_Syslog::ACE_Log_Msg_UNIX_Syslog (void) +{ +} + +ACE_Log_Msg_UNIX_Syslog::~ACE_Log_Msg_UNIX_Syslog (void) +{ + (void) this->close (); +} + +int +ACE_Log_Msg_UNIX_Syslog::open (const ACE_TCHAR * logger_key) +{ + if (logger_key == 0) + logger_key = ACE_Log_Msg::program_name (); + + // Initialize the UNIX syslog facility. Default the syslog log + // options LOG_CONS and LOG_PID to be set. There really should be a + // logging strategy option to control the syslog log options, + // however, we'll take the easy way out for now. +#if defined (ACE_USES_WCHAR) + openlog (ACE_TEXT_ALWAYS_CHAR (logger_key), + LOG_CONS|LOG_PID, + ACE_DEFAULT_SYSLOG_FACILITY); +#else + openlog (const_cast<char *> (logger_key), + LOG_CONS|LOG_PID, + ACE_DEFAULT_SYSLOG_FACILITY); +#endif /* ACE_USES_WCHAR */ + + // Enable logging of all syslog priorities. If logging of all + // priorities is not desired, use the ACE_Log_Msg::priority_mask() + // method to control the log output sent to the syslog daemon via + // the log() method, or use the system's syslog.conf file to select + // desired level of information. + +#if !defined (ACE_LACKS_SETLOGMASK) + (void) setlogmask (LOG_UPTO (LOG_DEBUG)); +#endif /* ACE_LACKS_SETLOGMASK */ + + return 0; +} + +int +ACE_Log_Msg_UNIX_Syslog::reset (void) +{ + return this->close (); +} + +int +ACE_Log_Msg_UNIX_Syslog::close (void) +{ + closelog(); + return 0; +} + +ssize_t +ACE_Log_Msg_UNIX_Syslog::log (ACE_Log_Record &log_record) +{ + int syslog_priority = this->convert_log_priority (log_record.type ()); + u_long flags = ACE_LOG_MSG->flags (); + + // The UNIX syslog() facility does not support multi-line messages. + // Break up the message data into separate lines and send each line + // to the syslog daemon. + + ACE_TCHAR message[ACE_Log_Record::MAXVERBOSELOGMSGLEN]; + ACE_OS::strcpy (message, log_record.msg_data ()); + ACE_TCHAR *strtokp = 0; + + for (ACE_TCHAR *line = ACE_OS::strtok_r (message, + ACE_TEXT ("\n"), + &strtokp); + line != 0; + line = ACE_OS::strtok_r (0, + ACE_TEXT ("\n"), + &strtokp)) + { + // Format the message line. Note that the processing for + // VERBOSE is the same as for VERBOSE_LITE, since syslog() + // already provides us with the hostname and PID. However, the + // timestamp is duplicated (albeit a shortened version) to + // provide a timestamp with greater precision than that provided + // by syslog(). + if (ACE_BIT_ENABLED (flags, ACE_Log_Msg::VERBOSE) + || ACE_BIT_ENABLED (flags, ACE_Log_Msg::VERBOSE_LITE)) + { + ACE_TCHAR date_and_time[35]; + if (0 == ACE::timestamp (date_and_time, sizeof (date_and_time), 1)) + ACE_OS::strcpy (date_and_time, ACE_TEXT ("<time error>")); + const ACE_TCHAR *prio_name = + ACE_Log_Record::priority_name(ACE_Log_Priority(log_record.type())); + syslog (syslog_priority, + "%s: %s: %s", + ACE_TEXT_ALWAYS_CHAR (date_and_time), + ACE_TEXT_ALWAYS_CHAR (prio_name), + ACE_TEXT_ALWAYS_CHAR (line)); + } + else // No formatting required. + syslog (syslog_priority, "%s", ACE_TEXT_ALWAYS_CHAR (line)); + } + + return 0; +} + +int +ACE_Log_Msg_UNIX_Syslog::convert_log_priority (ACE_UINT32 lm_priority) +{ + int syslog_priority; + switch (lm_priority) + { + case LM_TRACE: + case LM_DEBUG: + syslog_priority = LOG_DEBUG; + break; + case LM_STARTUP: + case LM_SHUTDOWN: + case LM_INFO: + syslog_priority = LOG_INFO; + break; + case LM_NOTICE: + syslog_priority = LOG_NOTICE; + break; + case LM_WARNING: + syslog_priority = LOG_WARNING; + break; + case LM_CRITICAL: + syslog_priority = LOG_CRIT; + break; + case LM_ALERT: + syslog_priority = LOG_ALERT; + break; + case LM_EMERGENCY: + syslog_priority = LOG_EMERG; + break; + case LM_ERROR: + default: + syslog_priority = LOG_ERR; + break; + } + + return syslog_priority; +} + +int +ACE_Log_Msg_UNIX_Syslog::convert_log_mask (int lm_mask) +{ + int syslog_mask = 0; + + if (ACE_BIT_ENABLED (lm_mask, LM_TRACE) + || ACE_BIT_ENABLED (lm_mask, LM_DEBUG)) + ACE_SET_BITS (syslog_mask, LOG_MASK(LOG_DEBUG)); + + if (ACE_BIT_ENABLED (lm_mask, LM_STARTUP) + || ACE_BIT_ENABLED (lm_mask, LM_SHUTDOWN) + || ACE_BIT_ENABLED (lm_mask, LM_INFO)) + ACE_SET_BITS (syslog_mask, LOG_MASK(LOG_INFO)); + + if (ACE_BIT_ENABLED (lm_mask, LM_NOTICE)) + ACE_SET_BITS (syslog_mask, LOG_MASK(LOG_NOTICE)); + + if (ACE_BIT_ENABLED (lm_mask, LM_ERROR)) + ACE_SET_BITS (syslog_mask, LOG_MASK(LOG_ERR)); + + if (ACE_BIT_ENABLED (lm_mask, LM_WARNING)) + ACE_SET_BITS (syslog_mask, LOG_MASK(LOG_WARNING)); + + if (ACE_BIT_ENABLED (lm_mask, LM_CRITICAL)) + ACE_SET_BITS (syslog_mask, LOG_MASK(LOG_CRIT)); + + if (ACE_BIT_ENABLED (lm_mask, LM_ALERT)) + ACE_SET_BITS (syslog_mask, LOG_MASK(LOG_ALERT)); + + if (ACE_BIT_ENABLED (lm_mask, LM_EMERGENCY)) + ACE_SET_BITS (syslog_mask, LOG_MASK(LOG_EMERG)); + + return syslog_mask; +} + +ACE_END_VERSIONED_NAMESPACE_DECL + +#endif /* !ACE_LACKS_UNIX_SYSLOG */ |