Salome HOME
Updated copyright comment
[modules/kernel.git] / src / Basics / libSALOMELog.cxx
1 // Copyright (C) 2007-2024  CEA, EDF, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 //  Author : Konstantin Leontev (OpenCascade)
21 //  Module : KERNEL
22 //  $Header$
23 //
24
25 #include "libSALOMELog.hxx"
26
27 #include <string>
28 #include <iostream>
29 #include <stdexcept>
30
31 enum class VerbosityMode { undefined, nolog, withlog };
32
33 static VerbosityMode isActivated = VerbosityMode::undefined;
34
35 namespace SALOME
36 {
37   static constexpr char ERROR_LEVEL_VALUE = 0;
38   static constexpr char ERROR_LEVEL_VALUE_STR[] = "ERROR";
39   static constexpr char WARNING_LEVEL_VALUE = 1;
40   static constexpr char WARNING_LEVEL_VALUE_STR[] = "WARNING";
41   static constexpr char INFO_LEVEL_VALUE = 2;
42   static constexpr char INFO_LEVEL_VALUE_STR[] = "INFO";
43   static constexpr char DEBUG_LEVEL_VALUE = 7;
44   static constexpr char DEBUG_LEVEL_VALUE_STR[] = "DEBUG";
45   static constexpr char UNDEFINED_LEVEL_VALUE=99;
46
47   enum class VerbosityLevelType { error_level=ERROR_LEVEL_VALUE, warning_level=WARNING_LEVEL_VALUE, info_level=INFO_LEVEL_VALUE, debug_level=DEBUG_LEVEL_VALUE, undefined_level=UNDEFINED_LEVEL_VALUE };
48   static VerbosityLevelType verbosityLevel = VerbosityLevelType::undefined_level;
49
50   static VerbosityLevelType FromIntToVerbosityLevel(char value)
51   {
52     switch(value)
53     {
54       case ERROR_LEVEL_VALUE:
55         return VerbosityLevelType::error_level;
56       case WARNING_LEVEL_VALUE:
57         return VerbosityLevelType::warning_level;
58       case INFO_LEVEL_VALUE:
59         return VerbosityLevelType::info_level;
60       case DEBUG_LEVEL_VALUE:
61         return VerbosityLevelType::debug_level;
62     }
63     throw std::range_error("FromIntToVerbosityLevel : Invalid value for verbosity level !");
64   }
65
66   static VerbosityLevelType FromStrToVerbosityLevel(const std::string& val)
67   {
68     if(val == ERROR_LEVEL_VALUE_STR)
69       return VerbosityLevelType::error_level;
70     if(val == WARNING_LEVEL_VALUE_STR)
71       return VerbosityLevelType::warning_level;
72     if(val == INFO_LEVEL_VALUE_STR)
73       return VerbosityLevelType::info_level;
74     if(val == DEBUG_LEVEL_VALUE_STR)
75       return VerbosityLevelType::debug_level;
76     throw std::range_error("FromStrToVerbosityLevel : Invalid str value for verbosity level !");
77   }
78
79   static std::string FromVerbosityLevelToStr(VerbosityLevelType level)
80   {
81     switch(level)
82     {
83       case VerbosityLevelType::error_level:
84         return std::string(ERROR_LEVEL_VALUE_STR);
85       case VerbosityLevelType::warning_level:
86         return std::string(WARNING_LEVEL_VALUE_STR);
87       case VerbosityLevelType::info_level:
88         return std::string(INFO_LEVEL_VALUE_STR);
89       case VerbosityLevelType::debug_level:
90         return std::string(DEBUG_LEVEL_VALUE_STR);
91       default:
92         throw std::range_error("FromVerbosityLevelToStr : not managed verbosity level !");
93     }
94   }
95
96 // ============================================================================
97 /*!
98  *  Called by any log message macros to decide about log output in Release and
99  *  Debug mode dynamically rely on SALOME_VERBOSE environment variable.
100  *  Checks SALOME_VERBOSE only on the very first call and returns cached result
101  *  for all followed calls.
102  *  Returns true if SALOME_VERBOSE is positioned and not empty and if its
103  *  numeric value greater than 0.
104  */
105 // ============================================================================
106
107   bool VerbosityActivated()
108   {
109     auto isEnvVarSet = []() -> VerbosityMode
110     {
111       const char *envVar = std::getenv("SALOME_VERBOSE");
112
113       if (envVar && (envVar[0] != '\0'))
114       {
115         const int numValue = std::stoi(envVar);
116         return numValue > 0?VerbosityMode::withlog:VerbosityMode::nolog;
117       }
118
119       return VerbosityMode::nolog;
120     };
121
122     if(isActivated == VerbosityMode::undefined)
123       isActivated = isEnvVarSet();
124     return isActivated == VerbosityMode::withlog;
125   }
126
127   void SetVerbosityActivated(bool flag)
128   {
129     isActivated = flag ? VerbosityMode::withlog:VerbosityMode::nolog;
130   }
131
132   VerbosityLevelType VerbosityLevel()
133   {
134     auto isEnvVarSet = []() -> VerbosityLevelType
135     {
136       const char *envVar = std::getenv("SALOME_VERBOSE_LEVEL");
137       if (envVar && (envVar[0] != '\0'))
138       {
139         const int numValue = std::stoi(envVar);
140         return FromIntToVerbosityLevel( static_cast<char>(numValue) );
141       }
142       return VerbosityLevelType::info_level;
143     };
144     if(verbosityLevel == VerbosityLevelType::undefined_level)
145       verbosityLevel = isEnvVarSet();
146     return verbosityLevel;
147   }
148
149   void SetVerbosityLevel(VerbosityLevelType level)
150   {
151     verbosityLevel = level;
152   }
153
154   void SetVerbosityLevelStr(const std::string& level)
155   {
156     verbosityLevel = FromStrToVerbosityLevel(level);
157   }
158
159   std::string VerbosityLevelStr()
160   {
161     return FromVerbosityLevelToStr( VerbosityLevel() );
162   }
163
164   bool IsDebugLevel()
165   {
166     return VerbosityLevel() >= VerbosityLevelType::debug_level;
167   }
168
169   bool IsInfoLevel()
170   {
171     return VerbosityLevel() >= VerbosityLevelType::info_level;
172   }
173
174   bool IsWarningLevel()
175   {
176     return VerbosityLevel() >= VerbosityLevelType::warning_level;
177   }
178
179   bool IsErrorLevel()
180   {
181     return VerbosityLevel() >= VerbosityLevelType::error_level;
182   }
183 }