[89] | 1 | /*
|
---|
| 2 | * Licensed to the Apache Software Foundation (ASF) under one or more
|
---|
| 3 | * contributor license agreements. See the NOTICE file distributed with
|
---|
| 4 | * this work for additional information regarding copyright ownership.
|
---|
| 5 | * The ASF licenses this file to You under the Apache License, Version 2.0
|
---|
| 6 | * (the "License"); you may not use this file except in compliance with
|
---|
| 7 | * the License. You may obtain a copy of the License at
|
---|
| 8 | *
|
---|
| 9 | * http://www.apache.org/licenses/LICENSE-2.0
|
---|
| 10 | *
|
---|
| 11 | * Unless required by applicable law or agreed to in writing, software
|
---|
| 12 | * distributed under the License is distributed on an "AS IS" BASIS,
|
---|
| 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
---|
| 14 | * See the License for the specific language governing permissions and
|
---|
| 15 | * limitations under the License.
|
---|
| 16 | */
|
---|
| 17 |
|
---|
| 18 | #ifndef _LOG4CXX_SPI_LOGGING_EVENT_H
|
---|
| 19 | #define _LOG4CXX_SPI_LOGGING_EVENT_H
|
---|
| 20 |
|
---|
| 21 | #if defined(_MSC_VER)
|
---|
| 22 | #pragma warning (push)
|
---|
| 23 | #pragma warning ( disable: 4231 4251 4275 4786 )
|
---|
| 24 | #endif
|
---|
| 25 |
|
---|
| 26 |
|
---|
| 27 |
|
---|
| 28 | #include <log4cxx/helpers/objectptr.h>
|
---|
| 29 | #include <log4cxx/logstring.h>
|
---|
| 30 | #include <time.h>
|
---|
| 31 | #include <log4cxx/logger.h>
|
---|
| 32 | #include <log4cxx/mdc.h>
|
---|
| 33 | #include <log4cxx/spi/location/locationinfo.h>
|
---|
| 34 | #include <vector>
|
---|
| 35 |
|
---|
| 36 |
|
---|
| 37 | namespace log4cxx
|
---|
| 38 | {
|
---|
| 39 | namespace helpers
|
---|
| 40 | {
|
---|
| 41 | class ObjectOutputStream;
|
---|
| 42 | }
|
---|
| 43 |
|
---|
| 44 | namespace spi
|
---|
| 45 | {
|
---|
| 46 |
|
---|
| 47 | LOG4CXX_LIST_DEF(KeySet, LogString);
|
---|
| 48 | /**
|
---|
| 49 | The internal representation of logging events. When an affirmative
|
---|
| 50 | decision is made to log then a <code>LoggingEvent</code> instance
|
---|
| 51 | is created. This instance is passed around to the different log4cxx
|
---|
| 52 | components.
|
---|
| 53 |
|
---|
| 54 | <p>This class is of concern to those wishing to extend log4cxx.
|
---|
| 55 | */
|
---|
| 56 | class LOG4CXX_EXPORT LoggingEvent :
|
---|
| 57 | public virtual helpers::ObjectImpl
|
---|
| 58 | {
|
---|
| 59 | public:
|
---|
| 60 | DECLARE_LOG4CXX_OBJECT(LoggingEvent)
|
---|
| 61 | BEGIN_LOG4CXX_CAST_MAP()
|
---|
| 62 | LOG4CXX_CAST_ENTRY(LoggingEvent)
|
---|
| 63 | END_LOG4CXX_CAST_MAP()
|
---|
| 64 |
|
---|
| 65 | /** For serialization only
|
---|
| 66 | */
|
---|
| 67 | LoggingEvent();
|
---|
| 68 |
|
---|
| 69 | /**
|
---|
| 70 | Instantiate a LoggingEvent from the supplied parameters.
|
---|
| 71 |
|
---|
| 72 | <p>Except timeStamp all the other fields of
|
---|
| 73 | <code>LoggingEvent</code> are filled when actually needed.
|
---|
| 74 | <p>
|
---|
| 75 | @param logger The logger of this event.
|
---|
| 76 | @param level The level of this event.
|
---|
| 77 | @param message The message of this event.
|
---|
| 78 | @param location location of logging request.
|
---|
| 79 | */
|
---|
| 80 | LoggingEvent(const LogString& logger,
|
---|
| 81 | const LevelPtr& level, const LogString& message,
|
---|
| 82 | const log4cxx::spi::LocationInfo& location);
|
---|
| 83 |
|
---|
| 84 | ~LoggingEvent();
|
---|
| 85 |
|
---|
| 86 | /** Return the level of this event. */
|
---|
| 87 | inline const LevelPtr& getLevel() const
|
---|
| 88 | { return level; }
|
---|
| 89 |
|
---|
| 90 | /** Return the name of the logger. */
|
---|
| 91 | inline const LogString& getLoggerName() const {
|
---|
| 92 | return logger;
|
---|
| 93 | }
|
---|
| 94 |
|
---|
| 95 | /** Return the message for this logging event. */
|
---|
| 96 | inline const LogString& getMessage() const
|
---|
| 97 | { return message; }
|
---|
| 98 |
|
---|
| 99 | /** Return the message for this logging event. */
|
---|
| 100 | inline const LogString& getRenderedMessage() const
|
---|
| 101 | { return message; }
|
---|
| 102 |
|
---|
| 103 | /**Returns the time when the application started,
|
---|
| 104 | in seconds elapsed since 01.01.1970.
|
---|
| 105 | */
|
---|
| 106 | static log4cxx_time_t getStartTime();
|
---|
| 107 |
|
---|
| 108 | /** Return the threadName of this event. */
|
---|
| 109 | inline const LogString& getThreadName() const {
|
---|
| 110 | return threadName;
|
---|
| 111 | }
|
---|
| 112 |
|
---|
| 113 | /** Return the timeStamp of this event. */
|
---|
| 114 | inline log4cxx_time_t getTimeStamp() const
|
---|
| 115 | { return timeStamp; }
|
---|
| 116 |
|
---|
| 117 | /* Return the file where this log statement was written. */
|
---|
| 118 | inline const log4cxx::spi::LocationInfo& getLocationInformation() const
|
---|
| 119 | { return locationInfo; }
|
---|
| 120 |
|
---|
| 121 | /**
|
---|
| 122 | * This method appends the NDC for this event to passed string. It will return the
|
---|
| 123 | * correct content even if the event was generated in a different
|
---|
| 124 | * thread or even on a different machine. The NDC#get method
|
---|
| 125 | * should <em>never</em> be called directly.
|
---|
| 126 | *
|
---|
| 127 | * @param dest destination for NDC, unchanged if NDC is not set.
|
---|
| 128 | * @return true if NDC is set.
|
---|
| 129 | */
|
---|
| 130 | bool getNDC(LogString& dest) const;
|
---|
| 131 |
|
---|
| 132 | /**
|
---|
| 133 | * Writes the content of the LoggingEvent
|
---|
| 134 | * in a format compatible with log4j's serialized form.
|
---|
| 135 | */
|
---|
| 136 | void write(helpers::ObjectOutputStream& os, helpers::Pool& p) const;
|
---|
| 137 |
|
---|
| 138 | /**
|
---|
| 139 | * Appends the the context corresponding to the <code>key</code> parameter.
|
---|
| 140 | * If there is a local MDC copy, possibly because we are in a logging
|
---|
| 141 | * server or running inside AsyncAppender, then we search for the key in
|
---|
| 142 | * MDC copy, if a value is found it is returned. Otherwise, if the search
|
---|
| 143 | * in MDC copy returns an empty result, then the current thread's
|
---|
| 144 | * <code>MDC</code> is used.
|
---|
| 145 | *
|
---|
| 146 | * <p>
|
---|
| 147 | * Note that <em>both</em> the local MDC copy and the current thread's MDC
|
---|
| 148 | * are searched.
|
---|
| 149 | * </p>
|
---|
| 150 | * @param key key.
|
---|
| 151 | * @param dest string to which value, if any, is appended.
|
---|
| 152 | * @return true if key had a corresponding value.
|
---|
| 153 | */
|
---|
| 154 | bool getMDC(const LogString& key, LogString& dest) const;
|
---|
| 155 |
|
---|
| 156 | /**
|
---|
| 157 | * Returns the set of of the key values in the MDC for the event.
|
---|
| 158 | * The returned set is unmodifiable by the caller.
|
---|
| 159 | *
|
---|
| 160 | * @return Set an unmodifiable set of the MDC keys.
|
---|
| 161 | *
|
---|
| 162 | */
|
---|
| 163 | KeySet getMDCKeySet() const;
|
---|
| 164 |
|
---|
| 165 | /**
|
---|
| 166 | Obtain a copy of this thread's MDC prior to serialization
|
---|
| 167 | or asynchronous logging.
|
---|
| 168 | */
|
---|
| 169 | void getMDCCopy() const;
|
---|
| 170 |
|
---|
| 171 | /**
|
---|
| 172 | * Return a previously set property.
|
---|
| 173 | * @param key key.
|
---|
| 174 | * @param dest string to which value, if any, is appended.
|
---|
| 175 | * @return true if key had a corresponding value.
|
---|
| 176 | */
|
---|
| 177 | bool getProperty(const LogString& key, LogString& dest) const;
|
---|
| 178 | /**
|
---|
| 179 | * Returns the set of of the key values in the properties
|
---|
| 180 | * for the event. The returned set is unmodifiable by the caller.
|
---|
| 181 | *
|
---|
| 182 | * @return Set an unmodifiable set of the property keys.
|
---|
| 183 | */
|
---|
| 184 | KeySet getPropertyKeySet() const;
|
---|
| 185 |
|
---|
| 186 | /**
|
---|
| 187 | * Set a string property using a key and a string value. since 1.3
|
---|
| 188 | */
|
---|
| 189 | void setProperty(const LogString& key, const LogString& value);
|
---|
| 190 |
|
---|
| 191 | private:
|
---|
| 192 | /**
|
---|
| 193 | * The logger of the logging event.
|
---|
| 194 | **/
|
---|
| 195 | LogString logger;
|
---|
| 196 |
|
---|
| 197 | /** level of logging event. */
|
---|
| 198 | LevelPtr level;
|
---|
| 199 |
|
---|
| 200 | /** The nested diagnostic context (NDC) of logging event. */
|
---|
| 201 | mutable LogString* ndc;
|
---|
| 202 |
|
---|
| 203 | /** The mapped diagnostic context (MDC) of logging event. */
|
---|
| 204 | mutable MDC::Map* mdcCopy;
|
---|
| 205 |
|
---|
| 206 | /**
|
---|
| 207 | * A map of String keys and String values.
|
---|
| 208 | */
|
---|
| 209 | std::map<LogString, LogString> * properties;
|
---|
| 210 |
|
---|
| 211 | /** Have we tried to do an NDC lookup? If we did, there is no need
|
---|
| 212 | * to do it again. Note that its value is always false when
|
---|
| 213 | * serialized. Thus, a receiving SocketNode will never use it's own
|
---|
| 214 | * (incorrect) NDC. See also writeObject method.
|
---|
| 215 | */
|
---|
| 216 | mutable bool ndcLookupRequired;
|
---|
| 217 |
|
---|
| 218 | /**
|
---|
| 219 | * Have we tried to do an MDC lookup? If we did, there is no need to do it
|
---|
| 220 | * again. Note that its value is always false when serialized. See also
|
---|
| 221 | * the getMDC and getMDCCopy methods.
|
---|
| 222 | */
|
---|
| 223 | mutable bool mdcCopyLookupRequired;
|
---|
| 224 |
|
---|
| 225 | /** The application supplied message of logging event. */
|
---|
| 226 | LogString message;
|
---|
| 227 |
|
---|
| 228 |
|
---|
| 229 | /** The number of milliseconds elapsed from 1/1/1970 until logging event
|
---|
| 230 | was created. */
|
---|
| 231 | log4cxx_time_t timeStamp;
|
---|
| 232 |
|
---|
| 233 | /** The is the location where this log statement was written. */
|
---|
| 234 | const log4cxx::spi::LocationInfo locationInfo;
|
---|
| 235 |
|
---|
| 236 |
|
---|
| 237 | /** The identifier of thread in which this logging event
|
---|
| 238 | was generated.
|
---|
| 239 | */
|
---|
| 240 | const LogString threadName;
|
---|
| 241 |
|
---|
| 242 | //
|
---|
| 243 | // prevent copy and assignment
|
---|
| 244 | //
|
---|
| 245 | LoggingEvent(const LoggingEvent&);
|
---|
| 246 | LoggingEvent& operator=(const LoggingEvent&);
|
---|
| 247 | static const LogString getCurrentThreadName();
|
---|
| 248 |
|
---|
| 249 | static void writeProlog(log4cxx::helpers::ObjectOutputStream& os, log4cxx::helpers::Pool& p);
|
---|
| 250 |
|
---|
| 251 | };
|
---|
| 252 |
|
---|
| 253 | LOG4CXX_PTR_DEF(LoggingEvent);
|
---|
| 254 | LOG4CXX_LIST_DEF(LoggingEventList, LoggingEventPtr);
|
---|
| 255 | }
|
---|
| 256 | }
|
---|
| 257 |
|
---|
| 258 | #if defined(_MSC_VER)
|
---|
| 259 | #pragma warning (pop)
|
---|
| 260 | #endif
|
---|
| 261 |
|
---|
| 262 |
|
---|
| 263 | #endif //_LOG4CXX_SPI_LOGGING_EVENT_H
|
---|