#include <log4cplus/consoleappender.h> #include <log4cplus/layout.h> #include <log4cplus/logger.h> #include <log4cplus/ndc.h> #include <log4cplus/helpers/loglog.h> #include <log4cplus/thread/threads.h> #include <log4cplus/helpers/sleep.h> #include <log4cplus/streams.h> #include <log4cplus/loggingmacros.h> #include <log4cplus/tracelogger.h> #include <exception> #include <iostream> #include <string> using namespace std; using namespace log4cplus; using namespace log4cplus::helpers; using namespace log4cplus::thread; #define MILLIS_TO_NANOS 1000 #define NUM_THREADS 4 #define NUM_LOOPS 10 class SlowObject { public: SlowObject() : logger(Logger::getInstance(LOG4CPLUS_TEXT("SlowObject"))) { logger.setLogLevel(TRACE_LOG_LEVEL); } void doSomething() { LOG4CPLUS_TRACE_METHOD(logger, LOG4CPLUS_TEXT("SlowObject::doSomething()")); { log4cplus::thread::MutexGuard guard (mutex); LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Actually doing something...")); sleep(0, 75 * MILLIS_TO_NANOS); LOG4CPLUS_INFO_FMT(logger, LOG4CPLUS_TEXT ( "Actually doing something...%d, %d, %d, %ls...DONE"), 1, 2, 3, L"testing"); } log4cplus::thread::yield(); } ~SlowObject () { } private: log4cplus::thread::Mutex mutex; Logger logger; }; class TestThread : public AbstractThread { public: TestThread (tstring const & n, SlowObject * so) : name(n) , slow(so) , logger(Logger::getInstance(LOG4CPLUS_TEXT("test.TestThread"))) { } virtual void run(); private: tstring name; SlowObject * slow; Logger logger; }; int main() { try { auto_ptr<SlowObject> slowObject(new SlowObject()); log4cplus::helpers::LogLog::getLogLog()->setInternalDebugging(true); Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main")); Logger::getRoot().setLogLevel(INFO_LOG_LEVEL); LogLevel ll = logger.getLogLevel(); tcout << "main Priority: " << getLogLevelManager().toString(ll) << endl; helpers::SharedObjectPtr<Appender> append_1(new ConsoleAppender()); append_1->setLayout( std::auto_ptr<Layout>(new log4cplus::TTCCLayout()) ); Logger::getRoot().addAppender(append_1); append_1->setName(LOG4CPLUS_TEXT("cout")); append_1 = 0; log4cplus::helpers::SharedObjectPtr<TestThread> threads[NUM_THREADS]; int i = 0; for(i=0; i<NUM_THREADS; ++i) { tostringstream s; s << "Thread-" << i; threads[i] = new TestThread(s.str(), slowObject.get()); } for(i=0; i<NUM_THREADS; ++i) { threads[i]->start(); } LOG4CPLUS_DEBUG(logger, "All Threads started..."); for(i=0; i<NUM_THREADS; ++i) { while(threads[i]->isRunning()) { sleep(0, 200 * MILLIS_TO_NANOS); } } LOG4CPLUS_INFO(logger, "Exiting main()..."); } catch(std::exception &e) { LOG4CPLUS_FATAL(Logger::getRoot(), "main()- Exception occured: " << e.what()); } catch(...) { LOG4CPLUS_FATAL(Logger::getRoot(), "main()- Exception occured"); } log4cplus::Logger::shutdown(); return 0; } void TestThread::run() { try { LOG4CPLUS_WARN(logger, name + LOG4CPLUS_TEXT(" TestThread.run()- Starting...")); NDC& ndc = getNDC(); NDCContextCreator _first_ndc(name); LOG4CPLUS_DEBUG(logger, "Entering Run()..."); for(int i=0; i<NUM_LOOPS; ++i) { NDCContextCreator _ndc(LOG4CPLUS_TEXT("loop")); slow->doSomething(); } LOG4CPLUS_DEBUG(logger, "Exiting run()..."); ndc.remove(); } catch(std::exception const & e) { LOG4CPLUS_FATAL(logger, "TestThread.run()- Exception occurred: " << e.what()); } catch(...) { LOG4CPLUS_FATAL(logger, "TestThread.run()- Exception occurred!!"); } LOG4CPLUS_WARN(logger, name << " TestThread.run()- Finished"); } // end "run"