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