00001
00002
00003 #include "ace/Log_Record.h"
00004
00005 #include "ace/Log_Msg.h"
00006 #include "ace/ACE.h"
00007 #include "ace/OS_NS_stdio.h"
00008 #include "ace/OS_NS_time.h"
00009 #include "ace/CDR_Stream.h"
00010 #include "ace/Auto_Ptr.h"
00011 #include "ace/Truncate.h"
00012
00013 #if !defined (__ACE_INLINE__)
00014 # include "ace/Log_Record.inl"
00015 #endif
00016
00017 #if !defined (ACE_LACKS_IOSTREAM_TOTALLY)
00018
00019 # include "ace/streams.h"
00020 #endif
00021
00022 #include "ace/OS_Memory.h"
00023
00024 ACE_RCSID(ace, Log_Record, "$Id: Log_Record.cpp 79134 2007-07-31 18:23:50Z johnnyw $")
00025
00026 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00027
00028 ACE_ALLOC_HOOK_DEFINE(ACE_Log_Record)
00029
00030 namespace
00031 {
00032
00033 ACE_TCHAR const * ace_priority_names[] =
00034 {
00035 ACE_TEXT ("LM_SHUTDOWN"),
00036 ACE_TEXT ("LM_TRACE"),
00037 ACE_TEXT ("LM_DEBUG"),
00038 ACE_TEXT ("LM_INFO"),
00039 ACE_TEXT ("LM_NOTICE"),
00040 ACE_TEXT ("LM_WARNING"),
00041 ACE_TEXT ("LM_STARTUP"),
00042 ACE_TEXT ("LM_ERROR"),
00043 ACE_TEXT ("LM_CRITICAL"),
00044 ACE_TEXT ("LM_ALERT"),
00045 ACE_TEXT ("LM_EMERGENCY"),
00046 ACE_TEXT ("LM_UNK(04000)"),
00047 ACE_TEXT ("LM_UNK(010000)"),
00048 ACE_TEXT ("LM_UNK(020000)"),
00049 ACE_TEXT ("LM_UNK(040000)"),
00050 ACE_TEXT ("LM_UNK(0100000)"),
00051 ACE_TEXT ("LM_UNK(0200000)"),
00052 ACE_TEXT ("LM_UNK(0400000)"),
00053 ACE_TEXT ("LM_UNK(01000000)"),
00054 ACE_TEXT ("LM_UNK(02000000)"),
00055 ACE_TEXT ("LM_UNK(04000000)"),
00056 ACE_TEXT ("LM_UNK(010000000)"),
00057 ACE_TEXT ("LM_UNK(020000000)"),
00058 ACE_TEXT ("LM_UNK(040000000)"),
00059 ACE_TEXT ("LM_UNK(0100000000)"),
00060 ACE_TEXT ("LM_UNK(0200000000)"),
00061 ACE_TEXT ("LM_UNK(0400000000)"),
00062 ACE_TEXT ("LM_UNK(01000000000)"),
00063 ACE_TEXT ("LM_UNK(02000000000)"),
00064 ACE_TEXT ("LM_UNK(04000000000)"),
00065 ACE_TEXT ("LM_UNK(010000000000)"),
00066 ACE_TEXT ("LM_UNK(020000000000)")
00067 };
00068 }
00069
00070 const ACE_TCHAR *
00071 ACE_Log_Record::priority_name (ACE_Log_Priority p)
00072 {
00073 return ace_priority_names[ACE::log2 (p)];
00074 }
00075
00076 void
00077 ACE_Log_Record::priority_name (ACE_Log_Priority p,
00078 const ACE_TCHAR *name)
00079 {
00080
00081 ace_priority_names[ACE::log2 (p)] = name;
00082 }
00083
00084 u_long
00085 ACE_Log_Record::priority (void) const
00086 {
00087 ACE_TRACE ("ACE_Log_Record::priority");
00088
00089
00090
00091
00092 return ACE::log2 ((u_long) this->type_);
00093 }
00094
00095 void
00096 ACE_Log_Record::priority (u_long p)
00097 {
00098 ACE_TRACE ("ACE_Log_Record::priority");
00099
00100
00101
00102 this->type_ = (ACE_UINT32) p;
00103 }
00104
00105 void
00106 ACE_Log_Record::dump (void) const
00107 {
00108 #if defined (ACE_HAS_DUMP)
00109
00110
00111 ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00112 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("length_ = %d\n"), this->length_));
00113 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\ntype_ = %u\n"), this->type_));
00114 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\ntime_stamp_ = (%:, %d)\n"),
00115 this->secs_, this->usecs_));
00116 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\npid_ = %u\n"), this->pid_));
00117 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nmsg_data_ (0x%@) = %s\n"),
00118 this->msg_data_, this->msg_data_));
00119 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nmsg_data_size_ = %B\n"),
00120 this->msg_data_size_));
00121 ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00122 #endif
00123 }
00124
00125 int
00126 ACE_Log_Record::msg_data (const ACE_TCHAR *data)
00127 {
00128
00129 size_t const newlen = ACE_OS::strlen (data) + 1;
00130 if (newlen > this->msg_data_size_)
00131 {
00132 ACE_TCHAR *new_msg_data = 0;
00133 ACE_NEW_RETURN (new_msg_data, ACE_TCHAR[newlen], -1);
00134 delete [] this->msg_data_;
00135 this->msg_data_ = new_msg_data;
00136 this->msg_data_size_ = newlen;
00137 }
00138 ACE_OS::strcpy (this->msg_data_, data);
00139 this->round_up ();
00140 return 0;
00141 }
00142
00143 ACE_Log_Record::ACE_Log_Record (ACE_Log_Priority lp,
00144 time_t ts_sec,
00145 long p)
00146 : length_ (0),
00147 type_ (ACE_UINT32 (lp)),
00148 secs_ (ts_sec),
00149 usecs_ (0),
00150 pid_ (ACE_UINT32 (p)),
00151 msg_data_ (0),
00152 msg_data_size_ (0)
00153 {
00154
00155 ACE_NEW_NORETURN (this->msg_data_, ACE_TCHAR[MAXLOGMSGLEN]);
00156 if (0 != this->msg_data_)
00157 {
00158 this->msg_data_size_ = MAXLOGMSGLEN;
00159 this->msg_data_[0] = '\0';
00160 }
00161 }
00162
00163 ACE_Log_Record::ACE_Log_Record (ACE_Log_Priority lp,
00164 const ACE_Time_Value &ts,
00165 long p)
00166 : length_ (0),
00167 type_ (ACE_UINT32 (lp)),
00168 secs_ (ts.sec ()),
00169 usecs_ ((ACE_UINT32) ts.usec ()),
00170 pid_ (ACE_UINT32 (p)),
00171 msg_data_ (0),
00172 msg_data_size_ (0)
00173 {
00174
00175 ACE_NEW_NORETURN (this->msg_data_, ACE_TCHAR[MAXLOGMSGLEN]);
00176 if (0 != this->msg_data_)
00177 {
00178 this->msg_data_size_ = MAXLOGMSGLEN;
00179 this->msg_data_[0] = '\0';
00180 }
00181 }
00182
00183 void
00184 ACE_Log_Record::round_up (void)
00185 {
00186
00187
00188 size_t len = sizeof (*this) + (sizeof (ACE_TCHAR) * ((ACE_OS::strlen (this->msg_data_) + 1)));
00189
00190
00191 len = ((len + ACE_Log_Record::ALIGN_WORDB - 1)
00192 & ~(ACE_Log_Record::ALIGN_WORDB - 1));
00193 this->length_ = static_cast<ACE_UINT32> (len);
00194 }
00195
00196 ACE_Log_Record::ACE_Log_Record (void)
00197 : length_ (0),
00198 type_ (0),
00199 secs_ (0),
00200 usecs_ (0),
00201 pid_ (0),
00202 msg_data_ (0),
00203 msg_data_size_ (0)
00204 {
00205
00206 ACE_NEW_NORETURN (this->msg_data_, ACE_TCHAR[MAXLOGMSGLEN]);
00207 if (0 != this->msg_data_)
00208 {
00209 this->msg_data_size_ = MAXLOGMSGLEN;
00210 this->msg_data_[0] = '\0';
00211 }
00212 }
00213
00214 int
00215 ACE_Log_Record::format_msg (const ACE_TCHAR host_name[],
00216 u_long verbose_flag,
00217 ACE_TCHAR *verbose_msg)
00218 {
00219
00220
00221 ACE_TCHAR timestamp[26];
00222
00223
00224
00225 #if defined (ACE_WIN32) || !defined (ACE_USES_WCHAR)
00226 const ACE_TCHAR *time_fmt = ACE_TEXT ("%s.%03ld %s");
00227 const ACE_TCHAR *verbose_fmt = ACE_TEXT ("%s@%s@%u@%s@%s");
00228 const ACE_TCHAR *verbose_lite_fmt = ACE_TEXT ("%s@%s@%s");
00229 #else
00230 const ACE_TCHAR *time_fmt = ACE_TEXT ("%ls.%03ld %ls");
00231 const ACE_TCHAR *verbose_fmt = ACE_TEXT ("%ls@%ls@%u@%ls@%ls");
00232 const ACE_TCHAR *verbose_lite_fmt = ACE_TEXT ("%ls@%ls@%ls");
00233 #endif
00234
00235 if (ACE_BIT_ENABLED (verbose_flag,
00236 ACE_Log_Msg::VERBOSE)
00237 || ACE_BIT_ENABLED (verbose_flag,
00238 ACE_Log_Msg::VERBOSE_LITE))
00239 {
00240 time_t const now = this->secs_;
00241 ACE_TCHAR ctp[26];
00242
00243 if (ACE_OS::ctime_r (&now, ctp, sizeof ctp) == 0)
00244 return -1;
00245
00246
00247
00248
00249 ctp[19] = '\0';
00250 ctp[24] = '\0';
00251
00252 ACE_OS::sprintf (timestamp,
00253 time_fmt,
00254 ctp + 4,
00255 ((long) this->usecs_) / 1000,
00256 ctp + 20);
00257 }
00258
00259 if (ACE_BIT_ENABLED (verbose_flag,
00260 ACE_Log_Msg::VERBOSE))
00261 {
00262 const ACE_TCHAR *lhost_name = ((host_name == 0)
00263 ? ACE_TEXT ("<local_host>")
00264 : host_name);
00265 ACE_OS::sprintf (verbose_msg,
00266 verbose_fmt,
00267 timestamp,
00268 lhost_name,
00269 this->pid_,
00270 ACE_Log_Record::priority_name (ACE_Log_Priority (this->type_)),
00271 this->msg_data_);
00272 }
00273 else if (ACE_BIT_ENABLED (verbose_flag, ACE_Log_Msg::VERBOSE_LITE))
00274 ACE_OS::sprintf (verbose_msg,
00275 verbose_lite_fmt,
00276 timestamp,
00277 ACE_Log_Record::priority_name (ACE_Log_Priority (this->type_)),
00278 this->msg_data_);
00279 else
00280 ACE_OS::strcpy (verbose_msg, this->msg_data_);
00281 return 0;
00282 }
00283
00284 int
00285 ACE_Log_Record::print (const ACE_TCHAR host_name[],
00286 u_long verbose_flag,
00287 FILE *fp)
00288 {
00289 if (ACE_LOG_MSG->log_priority_enabled (ACE_Log_Priority (this->type_)))
00290 {
00291 ACE_TCHAR *verbose_msg = 0;
00292 ACE_NEW_RETURN (verbose_msg, ACE_TCHAR[MAXVERBOSELOGMSGLEN], -1);
00293
00294 int result = this->format_msg (host_name, verbose_flag, verbose_msg);
00295
00296 if (result == 0)
00297 {
00298 if (fp != 0)
00299 {
00300 int const verbose_msg_len =
00301 static_cast<int> (ACE_OS::strlen (verbose_msg));
00302 #if !defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
00303 int const fwrite_result = ACE_OS::fprintf (fp,
00304 ACE_TEXT ("%ls"),
00305 verbose_msg);
00306 #else
00307 int const fwrite_result = ACE_OS::fprintf (fp,
00308 ACE_TEXT ("%s"),
00309 verbose_msg);
00310 #endif
00311
00312 if (fwrite_result != verbose_msg_len)
00313 result = -1;
00314 else
00315 ACE_OS::fflush (fp);
00316 }
00317 }
00318
00319 delete [] verbose_msg;
00320
00321 return result;
00322 }
00323 else
00324 return 0;
00325 }
00326
00327 int
00328 operator<< (ACE_OutputCDR &cdr,
00329 const ACE_Log_Record &log_record)
00330 {
00331
00332
00333 ACE_CDR::ULong u_msglen =
00334 ACE_Utils::truncate_cast<ACE_CDR::ULong> (log_record.msg_data_len ());
00335
00336
00337 cdr << ACE_CDR::Long (log_record.type ());
00338 cdr << ACE_CDR::Long (log_record.pid ());
00339 cdr << ACE_CDR::LongLong (log_record.time_stamp ().sec ());
00340 cdr << ACE_CDR::Long (log_record.time_stamp ().usec ());
00341 cdr << u_msglen;
00342 #if defined (ACE_USES_WCHAR)
00343 cdr.write_wchar_array (log_record.msg_data (), u_msglen);
00344 #else
00345 cdr.write_char_array (log_record.msg_data (), u_msglen);
00346 #endif
00347 return cdr.good_bit ();
00348 }
00349
00350 int
00351 operator>> (ACE_InputCDR &cdr,
00352 ACE_Log_Record &log_record)
00353 {
00354 ACE_CDR::Long type;
00355 ACE_CDR::Long pid;
00356 ACE_CDR::LongLong sec;
00357 ACE_CDR::Long usec;
00358 ACE_CDR::ULong buffer_len;
00359
00360
00361 if ((cdr >> type) && (cdr >> pid) && (cdr >> sec) && (cdr >> usec)
00362 && (cdr >> buffer_len)) {
00363 ACE_TCHAR *log_msg;
00364 ACE_NEW_RETURN (log_msg, ACE_TCHAR[buffer_len + 1], -1);
00365 auto_ptr<ACE_TCHAR> log_msg_p (log_msg);
00366 log_record.type (type);
00367 log_record.pid (pid);
00368 log_record.time_stamp (ACE_Time_Value (ACE_Utils::truncate_cast<time_t> (sec),
00369 usec));
00370 #if defined (ACE_USES_WCHAR)
00371 cdr.read_wchar_array (log_msg, buffer_len);
00372 #else
00373 cdr.read_char_array (log_msg, buffer_len);
00374 #endif
00375 log_msg[buffer_len] = '\0';
00376 if (-1 == log_record.msg_data (log_msg))
00377 return -1;
00378 }
00379 return cdr.good_bit ();
00380 }
00381
00382 #if !defined (ACE_LACKS_IOSTREAM_TOTALLY)
00383
00384 int
00385 ACE_Log_Record::print (const ACE_TCHAR host_name[],
00386 u_long verbose_flag,
00387 ACE_OSTREAM_TYPE &s)
00388 {
00389 if (ACE_LOG_MSG->log_priority_enabled (ACE_Log_Priority (this->type_)))
00390 {
00391 ACE_TCHAR* verbose_msg = 0;
00392 ACE_NEW_RETURN (verbose_msg, ACE_TCHAR[MAXVERBOSELOGMSGLEN], -1);
00393
00394 int const result = this->format_msg (host_name, verbose_flag, verbose_msg);
00395
00396 if (result == 0)
00397 {
00398
00399 s << ACE_TEXT_ALWAYS_CHAR (verbose_msg);
00400 s.flush ();
00401 }
00402
00403 delete [] verbose_msg;
00404
00405 return result;
00406 }
00407 return 0;
00408 }
00409
00410 #endif
00411
00412 ACE_END_VERSIONED_NAMESPACE_DECL