You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

150 lines
4.0 KiB

#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"