/** * {@inheritDoc} */ void append(const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& p) { synchronized sync(blocker); VectorAppender::append(event, p); // // if fatal, echo messages for testLoggingInDispatcher // if (event->getLevel() == Level::getInfo()) { LoggerPtr logger = Logger::getLoggerLS(event->getLoggerName()); LOG4CXX_LOGLS(logger, Level::getError(), event->getMessage()); LOG4CXX_LOGLS(logger, Level::getWarn(), event->getMessage()); LOG4CXX_LOGLS(logger, Level::getInfo(), event->getMessage()); LOG4CXX_LOGLS(logger, Level::getDebug(), event->getMessage()); } }
void AsyncAppender::append(const spi::LoggingEventPtr& event, Pool& p) { #if APR_HAS_THREADS // // if dispatcher has died then // append subsequent events synchronously // if (!dispatcher.isAlive() || bufferSize <= 0) { synchronized sync(appenders->getMutex()); appenders->appendLoopOnAppenders(event, p); return; } // Set the NDC and thread name for the calling thread as these // LoggingEvent fields were not set at event creation time. LogString ndcVal; event->getNDC(ndcVal); event->getThreadName(); // Get a copy of this thread's MDC. event->getMDCCopy(); { synchronized sync(bufferMutex); while(true) { int previousSize = buffer.size(); if (previousSize < bufferSize) { buffer.push_back(event); if (previousSize == 0) { bufferNotEmpty.signalAll(); } break; } // // Following code is only reachable if buffer is full // // // if blocking and thread is not already interrupted // and not the dispatcher then // wait for a buffer notification bool discard = true; if (blocking && !Thread::interrupted() && !dispatcher.isCurrentThread()) { try { bufferNotFull.await(bufferMutex); discard = false; } catch (InterruptedException& e) { // // reset interrupt status so // calling code can see interrupt on // their next wait or sleep. Thread::currentThreadInterrupt(); } } // // if blocking is false or thread has been interrupted // add event to discard map. // if (discard) { LogString loggerName = event->getLoggerName(); DiscardMap::iterator iter = discardMap->find(loggerName); if (iter == discardMap->end()) { DiscardSummary summary(event); discardMap->insert(DiscardMap::value_type(loggerName, summary)); } else { (*iter).second.add(event); } break; } } } #else synchronized sync(appenders->getMutex()); appenders->appendLoopOnAppenders(event, p); #endif }
void XMLLayout::format(LogString& output, const spi::LoggingEventPtr& event, Pool& p) const { output.append(LOG4CXX_STR("<log4j:event logger=\"")); Transform::appendEscapingTags(output, event->getLoggerName()); output.append(LOG4CXX_STR("\" timestamp=\"")); StringHelper::toString(event->getTimeStamp()/1000L, p, output); output.append(LOG4CXX_STR("\" level=\"")); Transform::appendEscapingTags(output, event->getLevel()->toString()); output.append(LOG4CXX_STR("\" thread=\"")); Transform::appendEscapingTags(output, event->getThreadName()); output.append(LOG4CXX_STR("\">")); output.append(LOG4CXX_EOL); output.append(LOG4CXX_STR("<log4j:message><![CDATA[")); // Append the rendered message. Also make sure to escape any // existing CDATA sections. Transform::appendEscapingCDATA(output, event->getRenderedMessage()); output.append(LOG4CXX_STR("]]></log4j:message>")); output.append(LOG4CXX_EOL); LogString ndc; if(event->getNDC(ndc)) { output.append(LOG4CXX_STR("<log4j:NDC><![CDATA[")); Transform::appendEscapingCDATA(output, ndc); output.append(LOG4CXX_STR("]]></log4j:NDC>")); output.append(LOG4CXX_EOL); } if(locationInfo) { output.append(LOG4CXX_STR("<log4j:locationInfo class=\"")); const LocationInfo& locInfo = event->getLocationInformation(); LOG4CXX_DECODE_CHAR(className, locInfo.getClassName()); Transform::appendEscapingTags(output, className); output.append(LOG4CXX_STR("\" method=\"")); LOG4CXX_DECODE_CHAR(method, locInfo.getMethodName()); Transform::appendEscapingTags(output, method); output.append(LOG4CXX_STR("\" file=\"")); LOG4CXX_DECODE_CHAR(fileName, locInfo.getFileName()); Transform::appendEscapingTags(output, fileName); output.append(LOG4CXX_STR("\" line=\"")); StringHelper::toString(locInfo.getLineNumber(), p, output); output.append(LOG4CXX_STR("\"/>")); output.append(LOG4CXX_EOL); } if (properties) { KeySet propertySet(event->getPropertyKeySet()); KeySet keySet(event->getMDCKeySet()); if (!(keySet.empty() && propertySet.empty())) { output.append(LOG4CXX_STR("<log4j:properties>")); output.append(LOG4CXX_EOL); for (KeySet::const_iterator i = keySet.begin(); i != keySet.end(); i++) { LogString key(*i); LogString value; if(event->getMDC(key, value)) { output.append(LOG4CXX_STR("<log4j:data name=\"")); Transform::appendEscapingTags(output, key); output.append(LOG4CXX_STR("\" value=\"")); Transform::appendEscapingTags(output, value); output.append(LOG4CXX_STR("\"/>")); output.append(LOG4CXX_EOL); } } for (KeySet::const_iterator i2 = propertySet.begin(); i2 != propertySet.end(); i2++) { LogString key(*i2); LogString value; if(event->getProperty(key, value)) { output.append(LOG4CXX_STR("<log4j:data name=\"")); Transform::appendEscapingTags(output, key); output.append(LOG4CXX_STR("\" value=\"")); Transform::appendEscapingTags(output, value); output.append(LOG4CXX_STR("\"/>")); output.append(LOG4CXX_EOL); } } output.append(LOG4CXX_STR("</log4j:properties>")); output.append(LOG4CXX_EOL); } } output.append(LOG4CXX_STR("</log4j:event>")); output.append(LOG4CXX_EOL); output.append(LOG4CXX_EOL); }