330 lines
8.2 KiB
C++
330 lines
8.2 KiB
C++
// Module: Log4CPLUS
|
|
// File: ndc.cxx
|
|
// Created: 6/2001
|
|
// Author: Tad E. Smith
|
|
//
|
|
//
|
|
// Copyright 2001-2009 Tad E. Smith
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include <log4cplus/config.hxx>
|
|
#include <log4cplus/ndc.h>
|
|
#include <log4cplus/helpers/loglog.h>
|
|
#include <log4cplus/helpers/pointer.h>
|
|
#include <exception>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
using namespace log4cplus;
|
|
using namespace log4cplus::helpers;
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// public methods
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
NDC&
|
|
log4cplus::getNDC()
|
|
{
|
|
static NDC singleton;
|
|
return singleton;
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// log4cplus::DiagnosticContext ctors
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
DiagnosticContext::DiagnosticContext(const log4cplus::tstring& message_, DiagnosticContext* parent)
|
|
: message(message_),
|
|
fullMessage( ( (parent == NULL)
|
|
? message
|
|
: parent->fullMessage + LOG4CPLUS_TEXT(" ") + message) )
|
|
{
|
|
}
|
|
|
|
|
|
DiagnosticContext::DiagnosticContext(const log4cplus::tstring& message_)
|
|
: message(message_),
|
|
fullMessage(message)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// log4cplus::NDC ctor and dtor
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
NDC::NDC()
|
|
: threadLocal(LOG4CPLUS_THREAD_LOCAL_INIT (0))
|
|
{
|
|
}
|
|
|
|
|
|
NDC::~NDC()
|
|
{
|
|
LOG4CPLUS_THREAD_LOCAL_CLEANUP( threadLocal );
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// log4cplus::NDC public methods
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
void
|
|
NDC::clear()
|
|
{
|
|
try {
|
|
DiagnosticContextStack* ptr = getPtr();
|
|
if(ptr != NULL) {
|
|
delete ptr;
|
|
LOG4CPLUS_SET_THREAD_LOCAL_VALUE( threadLocal, NULL );
|
|
}
|
|
}
|
|
catch(std::exception& e) {
|
|
getLogLog().error( LOG4CPLUS_TEXT("NDC::clear()- exception occured: ")
|
|
+ LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
|
|
}
|
|
catch(...) {
|
|
getLogLog().error(LOG4CPLUS_TEXT("NDC::clear()- exception occured"));
|
|
}
|
|
}
|
|
|
|
|
|
DiagnosticContextStack
|
|
NDC::cloneStack()
|
|
{
|
|
try {
|
|
DiagnosticContextStack* ptr = getPtr();
|
|
if(ptr != NULL) {
|
|
return DiagnosticContextStack(*ptr);
|
|
}
|
|
}
|
|
catch(std::exception& e) {
|
|
getLogLog().error( LOG4CPLUS_TEXT("NDC::cloneStack()- exception occured: ")
|
|
+ LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
|
|
}
|
|
catch(...) {
|
|
getLogLog().error(LOG4CPLUS_TEXT("NDC::cloneStack()- exception occured"));
|
|
}
|
|
|
|
return DiagnosticContextStack();
|
|
}
|
|
|
|
|
|
void
|
|
NDC::inherit(const DiagnosticContextStack& stack)
|
|
{
|
|
try {
|
|
DiagnosticContextStack* ptr = getPtr();
|
|
delete ptr;
|
|
|
|
ptr = new DiagnosticContextStack(stack);
|
|
LOG4CPLUS_SET_THREAD_LOCAL_VALUE( threadLocal, ptr );
|
|
}
|
|
catch(std::exception& e) {
|
|
getLogLog().error( LOG4CPLUS_TEXT("NDC::inherit()- exception occured: ")
|
|
+ LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
|
|
}
|
|
catch(...) {
|
|
getLogLog().error(LOG4CPLUS_TEXT("NDC::inherit()- exception occured"));
|
|
}
|
|
}
|
|
|
|
|
|
log4cplus::tstring
|
|
NDC::get()
|
|
{
|
|
try {
|
|
DiagnosticContextStack* ptr = getPtr();
|
|
if(ptr != NULL && !ptr->empty()) {
|
|
return ptr->top().fullMessage;
|
|
}
|
|
}
|
|
catch(std::exception& e) {
|
|
getLogLog().error( LOG4CPLUS_TEXT("NDC::get()- exception occured: ")
|
|
+ LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
|
|
}
|
|
catch(...) {
|
|
getLogLog().error(LOG4CPLUS_TEXT("NDC::get()- exception occured"));
|
|
}
|
|
|
|
return LOG4CPLUS_TEXT("");
|
|
}
|
|
|
|
|
|
size_t
|
|
NDC::getDepth()
|
|
{
|
|
try {
|
|
DiagnosticContextStack* ptr = getPtr();
|
|
if(ptr != NULL) {
|
|
return ptr->size();
|
|
}
|
|
}
|
|
catch(std::exception& e) {
|
|
getLogLog().error( LOG4CPLUS_TEXT("NDC::getDepth()- exception occured: ")
|
|
+ LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
|
|
}
|
|
catch(...) {
|
|
getLogLog().error(LOG4CPLUS_TEXT("NDC::getDepth()- exception occured"));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
log4cplus::tstring
|
|
NDC::pop()
|
|
{
|
|
try {
|
|
DiagnosticContextStack* ptr = getPtr();
|
|
if(ptr != NULL && !ptr->empty()) {
|
|
DiagnosticContext dc = ptr->top();
|
|
ptr->pop();
|
|
if(ptr->empty()) {
|
|
// If the NDC stack is empty we will delete it so that we can avoid
|
|
// most memory leaks if Threads don't call remove when exiting
|
|
delete ptr;
|
|
LOG4CPLUS_SET_THREAD_LOCAL_VALUE( threadLocal, NULL );
|
|
}
|
|
return dc.message;
|
|
}
|
|
}
|
|
catch(std::exception& e) {
|
|
getLogLog().error( LOG4CPLUS_TEXT("NDC::pop()- exception occured: ")
|
|
+ LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
|
|
}
|
|
catch(...) {
|
|
getLogLog().error(LOG4CPLUS_TEXT("NDC::pop()- exception occured"));
|
|
}
|
|
|
|
return LOG4CPLUS_TEXT("");
|
|
}
|
|
|
|
|
|
log4cplus::tstring
|
|
NDC::peek()
|
|
{
|
|
try {
|
|
DiagnosticContextStack* ptr = getPtr();
|
|
if(ptr != NULL && !ptr->empty()) {
|
|
return ptr->top().message;
|
|
}
|
|
}
|
|
catch(std::exception& e) {
|
|
getLogLog().error( LOG4CPLUS_TEXT("NDC::peek()- exception occured: ")
|
|
+ LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
|
|
}
|
|
catch(...) {
|
|
getLogLog().error(LOG4CPLUS_TEXT("NDC::peek()- exception occured"));
|
|
}
|
|
|
|
return LOG4CPLUS_TEXT("");
|
|
}
|
|
|
|
|
|
void
|
|
NDC::push(const log4cplus::tstring& message)
|
|
{
|
|
try {
|
|
DiagnosticContextStack* ptr = getPtr();
|
|
if(ptr == NULL) {
|
|
ptr = new DiagnosticContextStack();
|
|
LOG4CPLUS_SET_THREAD_LOCAL_VALUE( threadLocal, ptr );
|
|
}
|
|
|
|
if(ptr->empty()) {
|
|
ptr->push( DiagnosticContext(message, NULL) );
|
|
}
|
|
else {
|
|
DiagnosticContext dc = ptr->top();
|
|
ptr->push( DiagnosticContext(message, &dc) );
|
|
}
|
|
}
|
|
catch(std::exception& e) {
|
|
getLogLog().error( LOG4CPLUS_TEXT("NDC::push()- exception occured: ")
|
|
+ LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
|
|
}
|
|
catch(...) {
|
|
getLogLog().error(LOG4CPLUS_TEXT("NDC::push()- exception occured"));
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
NDC::remove()
|
|
{
|
|
try {
|
|
DiagnosticContextStack* ptr = getPtr();
|
|
delete ptr;
|
|
LOG4CPLUS_SET_THREAD_LOCAL_VALUE( threadLocal, NULL );
|
|
}
|
|
catch(std::exception& e) {
|
|
getLogLog().error( LOG4CPLUS_TEXT("NDC::remove()- exception occured: ")
|
|
+ LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
|
|
}
|
|
catch(...) {
|
|
getLogLog().error(LOG4CPLUS_TEXT("NDC::remove()- exception occured"));
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
NDC::setMaxDepth(size_t maxDepth)
|
|
{
|
|
try {
|
|
DiagnosticContextStack* ptr = getPtr();
|
|
if(ptr != NULL) {
|
|
while(maxDepth < ptr->size()) {
|
|
ptr->pop();
|
|
}
|
|
}
|
|
}
|
|
catch(std::exception& e) {
|
|
getLogLog().error( LOG4CPLUS_TEXT("NDC::setMaxDepth()- exception occured: ")
|
|
+ LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
|
|
}
|
|
catch(...) {
|
|
getLogLog().error(LOG4CPLUS_TEXT("NDC::setMaxDepth()- exception occured"));
|
|
}
|
|
}
|
|
|
|
|
|
DiagnosticContextStack* NDC::getPtr()
|
|
{
|
|
return static_cast<DiagnosticContextStack*>
|
|
(LOG4CPLUS_GET_THREAD_LOCAL_VALUE( threadLocal ));
|
|
}
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
|
|
NDCContextCreator::NDCContextCreator(const log4cplus::tstring& msg)
|
|
{
|
|
getNDC().push(msg);
|
|
}
|
|
|
|
|
|
NDCContextCreator::~NDCContextCreator()
|
|
{
|
|
getNDC().pop();
|
|
}
|