loggingevent.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. /******************************************************************************
  2. *
  3. * package: Log4Qt
  4. * file: loggingevent.cpp
  5. * created: September 2007
  6. * author: Martin Heinrich
  7. *
  8. *
  9. * Copyright 2007 Martin Heinrich
  10. *
  11. * Licensed under the Apache License, Version 2.0 (the "License");
  12. * you may not use this file except in compliance with the License.
  13. * You may obtain a copy of the License at
  14. *
  15. * http://www.apache.org/licenses/LICENSE-2.0
  16. *
  17. * Unless required by applicable law or agreed to in writing, software
  18. * distributed under the License is distributed on an "AS IS" BASIS,
  19. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  20. * See the License for the specific language governing permissions and
  21. * limitations under the License.
  22. *
  23. *****************************************************************************/
  24. /******************************************************************************
  25. * Dependencies
  26. ******************************************************************************/
  27. #include "log4qt/loggingevent.h"
  28. #include <QtCore/QBuffer>
  29. #include <QtCore/QByteArray>
  30. #include <QtCore/QDataStream>
  31. #include <QtCore/QDebug>
  32. #include <QtCore/QMutex>
  33. #include <QtCore/QThread>
  34. #include "log4qt/helpers/datetime.h"
  35. #include "log4qt/helpers/initialisationhelper.h"
  36. #include "log4qt/logger.h"
  37. #include "log4qt/mdc.h"
  38. #include "log4qt/ndc.h"
  39. namespace Log4Qt
  40. {
  41. /**************************************************************************
  42. * Declarations
  43. **************************************************************************/
  44. LOG4QT_GLOBAL_STATIC(QMutex, sequence_guard)
  45. /**************************************************************************
  46. * C helper functions
  47. **************************************************************************/
  48. /**************************************************************************
  49. * Class implementation: LoggingEvent
  50. **************************************************************************/
  51. LoggingEvent::LoggingEvent() :
  52. mLevel(Level::NULL_INT),
  53. mpLogger(0),
  54. mMessage(),
  55. mNdc(NDC::peek()),
  56. mProperties(MDC::context()),
  57. mSequenceNumber(nextSequenceNumber()),
  58. mThreadName(),
  59. mTimeStamp(DateTime::currentDateTime().toMilliSeconds())
  60. {
  61. setThreadNameToCurrent();
  62. }
  63. LoggingEvent::LoggingEvent(const Logger *pLogger,
  64. Level level,
  65. const QString &rMessage) :
  66. mLevel(level),
  67. mpLogger(pLogger),
  68. mMessage(rMessage),
  69. mNdc(NDC::peek()),
  70. mProperties(MDC::context()),
  71. mSequenceNumber(nextSequenceNumber()),
  72. mThreadName(),
  73. mTimeStamp(DateTime::currentDateTime().toMilliSeconds())
  74. {
  75. setThreadNameToCurrent();
  76. }
  77. LoggingEvent::LoggingEvent(const Logger *pLogger,
  78. Level level,
  79. const QString &rMessage,
  80. qint64 timeStamp) :
  81. mLevel(level),
  82. mpLogger(pLogger),
  83. mMessage(rMessage),
  84. mNdc(NDC::peek()),
  85. mProperties(MDC::context()),
  86. mSequenceNumber(nextSequenceNumber()),
  87. mThreadName(),
  88. mTimeStamp(timeStamp)
  89. {
  90. setThreadNameToCurrent();
  91. }
  92. LoggingEvent::LoggingEvent(const Logger *pLogger,
  93. Level level,
  94. const QString &rMessage,
  95. const QString &rNdc,
  96. const QHash<QString, QString> &rProperties,
  97. const QString &rThreadName,
  98. qint64 timeStamp) :
  99. mLevel(level),
  100. mpLogger(pLogger),
  101. mMessage(rMessage),
  102. mNdc(rNdc),
  103. mProperties(rProperties),
  104. mSequenceNumber(nextSequenceNumber()),
  105. mThreadName(rThreadName),
  106. mTimeStamp(timeStamp)
  107. {
  108. }
  109. QString LoggingEvent::loggerName() const
  110. {
  111. if (mpLogger)
  112. return mpLogger->name();
  113. else
  114. return QString();
  115. }
  116. QString LoggingEvent::toString() const
  117. {
  118. return level().toString() + QLatin1Char(':') + message();
  119. }
  120. qint64 LoggingEvent::sequenceCount()
  121. {
  122. QMutexLocker locker(sequence_guard());
  123. return msSequenceCount;
  124. }
  125. qint64 LoggingEvent::startTime()
  126. {
  127. return InitialisationHelper::startTime();
  128. }
  129. void LoggingEvent::setThreadNameToCurrent()
  130. {
  131. if (QThread::currentThread())
  132. mThreadName = QThread::currentThread()->objectName();
  133. }
  134. qint64 LoggingEvent::nextSequenceNumber()
  135. {
  136. QMutexLocker locker(sequence_guard());
  137. return ++msSequenceCount;
  138. }
  139. qint64 LoggingEvent::msSequenceCount = 0;
  140. /**************************************************************************
  141. * Implementation: Operators, Helper
  142. **************************************************************************/
  143. #ifndef QT_NO_DATASTREAM
  144. QDataStream &operator<<(QDataStream &rStream, const LoggingEvent &rLoggingEvent)
  145. {
  146. QBuffer buffer;
  147. buffer.open(QIODevice::WriteOnly);
  148. QDataStream stream(&buffer);
  149. // version
  150. quint16 version = 0;
  151. stream << version;
  152. // version 0 data
  153. stream << rLoggingEvent.mLevel
  154. << rLoggingEvent.loggerName()
  155. << rLoggingEvent.mMessage
  156. << rLoggingEvent.mNdc
  157. << rLoggingEvent.mProperties
  158. << rLoggingEvent.mSequenceNumber
  159. << rLoggingEvent.mThreadName
  160. << rLoggingEvent.mTimeStamp;
  161. buffer.close();
  162. rStream << buffer.buffer();
  163. return rStream;
  164. }
  165. QDataStream &operator>>(QDataStream &rStream, LoggingEvent &rLoggingEvent)
  166. {
  167. QByteArray array;
  168. rStream >> array;
  169. QBuffer buffer(&array);
  170. buffer.open(QIODevice::ReadOnly);
  171. QDataStream stream(&buffer);
  172. // version
  173. quint16 version;
  174. stream >> version;
  175. // Version 0 data
  176. QString logger;
  177. stream >> rLoggingEvent.mLevel
  178. >> logger
  179. >> rLoggingEvent.mMessage
  180. >> rLoggingEvent.mNdc
  181. >> rLoggingEvent.mProperties
  182. >> rLoggingEvent.mSequenceNumber
  183. >> rLoggingEvent.mThreadName
  184. >> rLoggingEvent.mTimeStamp;
  185. if (logger.isEmpty())
  186. rLoggingEvent.mpLogger = 0;
  187. else
  188. rLoggingEvent.mpLogger = Logger::logger(logger);
  189. buffer.close();
  190. return rStream;
  191. }
  192. #endif // QT_NO_DATASTREAM
  193. #ifndef QT_NO_DEBUG_STREAM
  194. QDebug operator<<(QDebug debug,
  195. const LoggingEvent &rLoggingEvent)
  196. {
  197. QString logger;
  198. if (rLoggingEvent.logger() != 0)
  199. logger = rLoggingEvent.logger()->name();
  200. debug.nospace() << "LoggingEvent("
  201. << "level:" << rLoggingEvent.level().toString() << " "
  202. << "logger:" << logger << " "
  203. << "message:" << rLoggingEvent.message() << " "
  204. << "sequencenumber:" << rLoggingEvent.sequenceNumber() << " "
  205. << "threadname:" << rLoggingEvent.threadName() << " "
  206. << "timestamp:" << rLoggingEvent.timeStamp()
  207. << "(" << DateTime::fromMilliSeconds(rLoggingEvent.timeStamp()) << ")"
  208. << "sequenceCount:" << rLoggingEvent.sequenceCount()
  209. << ")";
  210. return debug.space();
  211. }
  212. #endif // QT_NO_DEBUG_STREAM
  213. } // namespace Log4Qt