Fixed levels to initialize statically.
diff --git a/src/main/cpp/level.cpp b/src/main/cpp/level.cpp
index ef388a9..e85cb8b 100644
--- a/src/main/cpp/level.cpp
+++ b/src/main/cpp/level.cpp
@@ -23,51 +23,93 @@
 	#define LOG4CXX 1
 #endif
 #include <log4cxx/helpers/aprinitializer.h>
+#include <mutex>
 
 using namespace log4cxx;
 using namespace log4cxx::helpers;
 
 IMPLEMENT_LOG4CXX_OBJECT_WITH_CUSTOM_CLASS(Level, LevelClass)
 
+volatile bool Level::initialized = false;
+std::mutex Level::initMutex;
+LevelPtr Level::allLevel;
+LevelPtr Level::fatalLevel;
+LevelPtr Level::errorLevel;
+LevelPtr Level::warnLevel;
+LevelPtr Level::infoLevel;
+LevelPtr Level::debugLevel;
+LevelPtr Level::traceLevel;
+LevelPtr Level::offLevel;
+
+void Level::initializeLevels(){
+    if( initialized ){
+        return;
+    }
+
+    std::unique_lock lock(initMutex);
+    if( initialized ){
+        return;
+    }
+
+    allLevel   = LevelPtr(new Level(Level::ALL_INT, LOG4CXX_STR("ALL"), 7));
+    fatalLevel = LevelPtr(new Level(Level::FATAL_INT, LOG4CXX_STR("FATAL"), 0));
+    errorLevel = LevelPtr(new Level(Level::ERROR_INT, LOG4CXX_STR("ERROR"), 3));
+    warnLevel  = LevelPtr(new Level(Level::WARN_INT, LOG4CXX_STR("WARN"), 4));
+    infoLevel  = LevelPtr(new Level(Level::INFO_INT, LOG4CXX_STR("INFO"), 6));
+    debugLevel = LevelPtr(new Level(Level::DEBUG_INT, LOG4CXX_STR("DEBUG"), 7));
+    traceLevel = LevelPtr(new Level(Level::TRACE_INT, LOG4CXX_STR("TRACE"), 7));
+    offLevel   = LevelPtr(new Level(Level::OFF_INT, LOG4CXX_STR("OFF"), 0));
+
+    initialized = true;
+}
+
 LevelPtr Level::getOff()
 {
-	return LevelPtr(new Level(Level::OFF_INT, LOG4CXX_STR("OFF"), 0));
+    initializeLevels();
+    return offLevel;
 }
 
 LevelPtr Level::getFatal()
 {
-	return LevelPtr(new Level(Level::FATAL_INT, LOG4CXX_STR("FATAL"), 0));
+    initializeLevels();
+    return fatalLevel;
 }
 
 LevelPtr Level::getError()
 {
-	return LevelPtr(new Level(Level::ERROR_INT, LOG4CXX_STR("ERROR"), 3));
+    initializeLevels();
+    return errorLevel;
 }
 
 LevelPtr Level::getWarn()
 {
-	return LevelPtr(new Level(Level::WARN_INT, LOG4CXX_STR("WARN"), 4));
+    initializeLevels();
+    return warnLevel;
 }
 
 LevelPtr Level::getInfo()
 {
-	return LevelPtr(new Level(Level::INFO_INT, LOG4CXX_STR("INFO"), 6));
+    initializeLevels();
+    return infoLevel;
 }
 
 LevelPtr Level::getDebug()
 {
-	return LevelPtr(new Level(Level::DEBUG_INT, LOG4CXX_STR("DEBUG"), 7));
+    initializeLevels();
+    return debugLevel;
 }
 
 LevelPtr Level::getTrace()
 {
-	return LevelPtr(new Level(Level::TRACE_INT, LOG4CXX_STR("TRACE"), 7));
+    initializeLevels();
+    return traceLevel;
 }
 
 
 LevelPtr Level::getAll()
 {
-	return LevelPtr(new Level(Level::ALL_INT, LOG4CXX_STR("ALL"), 7));
+    initializeLevels();
+    return allLevel;
 }
 
 
@@ -76,7 +118,7 @@
 	const LogString& name1, int syslogEquivalent1)
 	: level(level1), name(name1), syslogEquivalent(syslogEquivalent1)
 {
-	APRInitializer::initialize();
+    APRInitializer::initialize();
 }
 
 
diff --git a/src/main/include/log4cxx/level.h b/src/main/include/log4cxx/level.h
index 768ec3a..31ee4cd 100644
--- a/src/main/include/log4cxx/level.h
+++ b/src/main/include/log4cxx/level.h
@@ -22,6 +22,7 @@
 #include <log4cxx/logstring.h>
 #include <limits.h>
 #include <log4cxx/helpers/object.h>
+#include <mutex>
 
 #if defined(_MSC_VER)
 	#pragma warning ( push )
@@ -223,6 +224,7 @@
 		};
 
 
+        static void initializeLevels();
 		static LevelPtr getAll();
 		static LevelPtr getFatal();
 		static LevelPtr getError();
@@ -277,7 +279,18 @@
 			return level;
 		}
 
-	private:
+    private:
+        static volatile bool initialized;
+        static std::mutex initMutex;
+        static LevelPtr allLevel;
+        static LevelPtr fatalLevel;
+        static LevelPtr errorLevel;
+        static LevelPtr warnLevel;
+        static LevelPtr infoLevel;
+        static LevelPtr debugLevel;
+        static LevelPtr traceLevel;
+        static LevelPtr offLevel;
+
 		int level;
 		LogString name;
 		int syslogEquivalent;