| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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. |
| */ |
| |
| #ifndef _LOG4CXX_LEVEL_H |
| #define _LOG4CXX_LEVEL_H |
| |
| |
| #include <log4cxx/logstring.h> |
| #include <limits.h> |
| #include <log4cxx/helpers/object.h> |
| #include <mutex> |
| |
| #if defined(_MSC_VER) |
| #pragma warning ( push ) |
| #pragma warning ( disable: 4251 ) |
| #endif |
| |
| namespace log4cxx |
| { |
| /** |
| * LOG4CXX_PTR_DEF can't be used to get a smart pointer for Level because we need to override |
| * the comparison operator and this doesn't work if the template has alread been initialized, |
| * which is what the macro does on some platforms. The overriding takes place underneath the |
| * definition of Level because we need one of it's methods. |
| * |
| * https://issues.apache.org/jira/browse/LOGCXX-394 |
| */ |
| class Level; |
| typedef std::shared_ptr<Level> LevelPtr; |
| |
| /** |
| Defines the minimum set of levels recognized by the system, that is |
| <code>OFF</code>, <code>FATAL</code>, <code>ERROR</code>, |
| <code>WARN</code>, <code>INFO</code>, <code>DEBUG</code> and |
| <code>ALL</code>. |
| <p>The <code>Level</code> class may be subclassed to define a larger |
| level set. |
| */ |
| class LOG4CXX_EXPORT Level : public helpers::Object |
| { |
| public: |
| class LOG4CXX_EXPORT LevelClass : public helpers::Class |
| { |
| public: |
| LevelClass() : helpers::Class() {} |
| |
| virtual LogString getName() const |
| { |
| return LOG4CXX_STR("Level"); |
| } |
| |
| virtual LevelPtr toLevel(const LogString& sArg) const |
| { |
| return Level::toLevelLS(sArg); |
| } |
| |
| virtual LevelPtr toLevel(int val) const |
| { |
| return Level::toLevel(val); |
| } |
| }; |
| |
| DECLARE_LOG4CXX_OBJECT_WITH_CUSTOM_CLASS(Level, LevelClass) |
| BEGIN_LOG4CXX_CAST_MAP() |
| LOG4CXX_CAST_ENTRY(Level) |
| END_LOG4CXX_CAST_MAP() |
| |
| /** |
| Instantiate a Level object. |
| */ |
| Level(int level, |
| const LogString& name, |
| int syslogEquivalent); |
| |
| /** |
| Convert the string passed as argument to a level. If the |
| conversion fails, then this method returns DEBUG. |
| * @param sArg level name. |
| */ |
| static LevelPtr toLevel(const std::string& sArg); |
| /** |
| Convert the string passed as argument to a level. If the |
| conversion fails, then this method returns the value of |
| <code>defaultLevel</code>. |
| * @param sArg level name. |
| * @param defaultLevel level to return if no match. |
| * @return |
| */ |
| static LevelPtr toLevel(const std::string& sArg, |
| const LevelPtr& defaultLevel); |
| /** |
| * Get the name of the level in the current encoding. |
| * @param name buffer to which name is appended. |
| */ |
| void toString(std::string& name) const; |
| |
| #if LOG4CXX_WCHAR_T_API |
| /** |
| Convert the string passed as argument to a level. If the |
| conversion fails, then this method returns DEBUG. |
| * @param sArg level name. |
| */ |
| static LevelPtr toLevel(const std::wstring& sArg); |
| /** |
| Convert the string passed as argument to a level. If the |
| conversion fails, then this method returns the value of |
| <code>defaultLevel</code>. |
| * @param sArg level name. |
| * @param defaultLevel level to return if no match. |
| * @return |
| */ |
| static LevelPtr toLevel(const std::wstring& sArg, |
| const LevelPtr& defaultLevel); |
| /** |
| * Get the name of the level. |
| * @param name buffer to which name is appended. |
| */ |
| void toString(std::wstring& name) const; |
| #endif |
| #if LOG4CXX_UNICHAR_API |
| /** |
| Convert the string passed as argument to a level. If the |
| conversion fails, then this method returns DEBUG. |
| * @param sArg level name. |
| */ |
| static LevelPtr toLevel(const std::basic_string<UniChar>& sArg); |
| /** |
| Convert the string passed as argument to a level. If the |
| conversion fails, then this method returns the value of |
| <code>defaultLevel</code>. |
| * @param sArg level name. |
| * @param defaultLevel level to return if no match. |
| * @return |
| */ |
| static LevelPtr toLevel(const std::basic_string<UniChar>& sArg, |
| const LevelPtr& defaultLevel); |
| /** |
| * Get the name of the level. |
| * @param name buffer to which name is appended. |
| */ |
| void toString(std::basic_string<UniChar>& name) const; |
| #endif |
| #if LOG4CXX_CFSTRING_API |
| /** |
| Convert the string passed as argument to a level. If the |
| conversion fails, then this method returns DEBUG. |
| * @param sArg level name. |
| */ |
| static LevelPtr toLevel(const CFStringRef& sArg); |
| /** |
| Convert the string passed as argument to a level. If the |
| conversion fails, then this method returns the value of |
| <code>defaultLevel</code>. |
| * @param sArg level name. |
| * @param defaultLevel level to return if no match. |
| * @return |
| */ |
| static LevelPtr toLevel(const CFStringRef& sArg, |
| const LevelPtr& defaultLevel); |
| /** |
| * Get the name of the level. |
| * @param name buffer to which name is appended. |
| */ |
| void toString(CFStringRef& name) const; |
| #endif |
| /** |
| Convert the string passed as argument to a level. If the |
| conversion fails, then this method returns DEBUG. |
| * @param sArg level name. |
| */ |
| static LevelPtr toLevelLS(const LogString& sArg); |
| /** |
| Convert the string passed as argument to a level. If the |
| conversion fails, then this method returns the value of |
| <code>defaultLevel</code>. |
| * @param sArg level name. |
| * @param defaultLevel level to return if no match. |
| * @return |
| */ |
| static LevelPtr toLevelLS(const LogString& sArg, |
| const LevelPtr& defaultLevel); |
| /** |
| Returns the string representation of this level. |
| * @return level name. |
| */ |
| LogString toString() const; |
| |
| /** |
| Convert an integer passed as argument to a level. If the |
| conversion fails, then this method returns DEBUG. |
| */ |
| static LevelPtr toLevel(int val); |
| |
| /** |
| Convert an integer passed as argument to a level. If the |
| conversion fails, then this method returns the specified default. |
| */ |
| static LevelPtr toLevel(int val, const LevelPtr& defaultLevel); |
| |
| enum |
| { |
| OFF_INT = INT_MAX, |
| FATAL_INT = 50000, |
| ERROR_INT = 40000, |
| WARN_INT = 30000, |
| INFO_INT = 20000, |
| DEBUG_INT = 10000, |
| TRACE_INT = 5000, |
| ALL_INT = INT_MIN |
| }; |
| |
| |
| static void initializeLevels(); |
| static LevelPtr getAll(); |
| static LevelPtr getFatal(); |
| static LevelPtr getError(); |
| static LevelPtr getWarn(); |
| static LevelPtr getInfo(); |
| static LevelPtr getDebug(); |
| static LevelPtr getTrace(); |
| static LevelPtr getOff(); |
| |
| |
| /** |
| Two levels are equal if their level fields are equal. |
| */ |
| virtual bool equals(const LevelPtr& level) const; |
| |
| inline bool operator==(const Level& level1) const |
| { |
| return (this->level == level1.level); |
| } |
| |
| inline bool operator!=(const Level& level1) const |
| { |
| return (this->level != level1.level); |
| } |
| |
| /** |
| Return the syslog equivalent of this level as an integer. |
| */ |
| inline int getSyslogEquivalent() const |
| { |
| return syslogEquivalent; |
| } |
| |
| |
| /** |
| Returns <code>true</code> if this level has a higher or equal |
| level than the level passed as argument, <code>false</code> |
| otherwise. |
| |
| <p>You should think twice before overriding the default |
| implementation of <code>isGreaterOrEqual</code> method. |
| |
| */ |
| virtual bool isGreaterOrEqual(const LevelPtr& level) const; |
| |
| |
| /** |
| Returns the integer representation of this level. |
| */ |
| inline int toInt() const |
| { |
| return level; |
| } |
| |
| 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; |
| Level(const Level&); |
| Level& operator=(const Level&); |
| }; |
| |
| } |
| |
| #define DECLARE_LOG4CXX_LEVEL(level)\ |
| public:\ |
| class Class##level : public Level::LevelClass\ |
| {\ |
| public:\ |
| Class##level() : Level::LevelClass() {}\ |
| virtual LogString getName() const { return LOG4CXX_STR(#level); } \ |
| virtual LevelPtr toLevel(const LogString& sArg) const\ |
| { return level::toLevelLS(sArg); }\ |
| virtual LevelPtr toLevel(int val) const\ |
| { return level::toLevel(val); }\ |
| };\ |
| DECLARE_LOG4CXX_OBJECT_WITH_CUSTOM_CLASS(level, Class##level) |
| |
| #define IMPLEMENT_LOG4CXX_LEVEL(level) \ |
| IMPLEMENT_LOG4CXX_OBJECT_WITH_CUSTOM_CLASS(level, Class##level) |
| |
| #if defined(_MSC_VER) |
| #pragma warning (pop) |
| #endif |
| |
| #endif //_LOG4CXX_LEVEL_H |