13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #ifndef __LOG_H_INCLUDED_ 27 #define __LOG_H_INCLUDED_ 28 29 #include <windows.h> 30 #include "tstrings.h" 31 32 33 /* Default logger (Logger::defaultLogger()) writes log messages to the default log file. 34 * Common scenario: 35 * - main() function configures default logger: 36 * FileLogAppender appender(_T("my_log_filename.log")); 37 * Logger::defaultLogger().setAppender(appender); 38 * Logger::defaultLogger().setLogLevel(LOG_INFO); 39 * If the default file name and log level are not set, _T("jusched.log")/LOG_TRACE are used. 40 * 41 * Logger fileName specifies only file name, 42 * full path for the log file depends on the platform (usually value of the TMP env. var) 43 */ 44 45 46 struct LogEvent { 47 SYSTEMTIME ts; 48 long tid; 49 long pid; 50 tstring moduleName; 51 tstring logLevel; 52 tstring fileName; 53 int lineNum; 54 tstring funcName; 55 tstring message; 56 57 LogEvent(); 58 }; 59 60 61 class LogAppender { 62 public: 63 virtual ~LogAppender() { 64 } 65 virtual void append(const LogEvent& v) = 0; 114 }; 115 116 static Logger& defaultLogger(); 117 118 explicit Logger(LogAppender& appender, LogLevel logLevel = LOG_TRACE); 119 ~Logger(); 120 121 LogAppender& setAppender(LogAppender& v) { 122 LogAppender& oldAppender = *appender; 123 appender = &v; 124 return oldAppender; 125 } 126 127 LogAppender& getAppender() const { 128 return *appender; 129 } 130 131 void setLogLevel(LogLevel logLevel); 132 133 bool isLoggable(LogLevel logLevel) const ; 134 void log(LogLevel logLevel, LPCTSTR fileName, int lineNum, LPCTSTR funcName, const tstring& message) const; 135 void log(LogLevel logLevel, LPCTSTR fileName, int lineNum, 136 LPCTSTR funcName, const tstrings::any& message) const { 137 return log(logLevel, fileName, lineNum, funcName, message.tstr()); 138 } 139 void log(LogLevel logLevel, LPCTSTR fileName, int lineNum, 140 LPCTSTR funcName, tstring::const_pointer message) const { 141 return log(logLevel, fileName, lineNum, funcName, tstring(message)); 142 } 143 144 // internal class for scope tracing 145 class ScopeTracer { 146 public: 147 ScopeTracer(Logger &logger, LogLevel logLevel, LPCTSTR fileName, int lineNum, LPCTSTR funcName, const tstring& scopeName); 148 ~ScopeTracer(); 149 150 private: 151 const Logger &log; 152 const LogLevel level; 153 const bool needLog; 154 const tstring file; 155 const int line; 156 const tstring func; 157 const tstring scope; 158 }; 159 160 private: 161 LogLevel level; 162 LogAppender* appender; 163 }; 164 165 166 // base logging macro 167 #define LOGGER_LOG(logger, logLevel, message) \ | 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #ifndef __LOG_H_INCLUDED_ 27 #define __LOG_H_INCLUDED_ 28 29 #include <windows.h> 30 #include "tstrings.h" 31 32 33 /* Default logger (Logger::defaultLogger()) writes log messages to 34 * the default log file. 35 * Common scenario: 36 * - main() function configures default logger: 37 * FileLogAppender appender(_T("my_log_filename.log")); 38 * Logger::defaultLogger().setAppender(appender); 39 * Logger::defaultLogger().setLogLevel(LOG_INFO); 40 * If the default file name and log level are not set, 41 * _T("jusched.log")/LOG_TRACE are used. 42 * 43 * Logger fileName specifies only file name, 44 * full path for the log file depends on the platform 45 * (usually value of the TMP env. var) 46 */ 47 48 struct LogEvent { 49 SYSTEMTIME ts; 50 long tid; 51 long pid; 52 tstring moduleName; 53 tstring logLevel; 54 tstring fileName; 55 int lineNum; 56 tstring funcName; 57 tstring message; 58 59 LogEvent(); 60 }; 61 62 63 class LogAppender { 64 public: 65 virtual ~LogAppender() { 66 } 67 virtual void append(const LogEvent& v) = 0; 116 }; 117 118 static Logger& defaultLogger(); 119 120 explicit Logger(LogAppender& appender, LogLevel logLevel = LOG_TRACE); 121 ~Logger(); 122 123 LogAppender& setAppender(LogAppender& v) { 124 LogAppender& oldAppender = *appender; 125 appender = &v; 126 return oldAppender; 127 } 128 129 LogAppender& getAppender() const { 130 return *appender; 131 } 132 133 void setLogLevel(LogLevel logLevel); 134 135 bool isLoggable(LogLevel logLevel) const ; 136 void log(LogLevel logLevel, LPCTSTR fileName, int lineNum, 137 LPCTSTR funcName, const tstring& message) const; 138 void log(LogLevel logLevel, LPCTSTR fileName, int lineNum, 139 LPCTSTR funcName, const tstrings::any& message) const { 140 return log(logLevel, fileName, lineNum, funcName, message.tstr()); 141 } 142 void log(LogLevel logLevel, LPCTSTR fileName, int lineNum, 143 LPCTSTR funcName, tstring::const_pointer message) const { 144 return log(logLevel, fileName, lineNum, funcName, tstring(message)); 145 } 146 147 // internal class for scope tracing 148 class ScopeTracer { 149 public: 150 ScopeTracer(Logger &logger, LogLevel logLevel, LPCTSTR fileName, 151 int lineNum, LPCTSTR funcName, const tstring& scopeName); 152 ~ScopeTracer(); 153 154 private: 155 const Logger &log; 156 const LogLevel level; 157 const bool needLog; 158 const tstring file; 159 const int line; 160 const tstring func; 161 const tstring scope; 162 }; 163 164 private: 165 LogLevel level; 166 LogAppender* appender; 167 }; 168 169 170 // base logging macro 171 #define LOGGER_LOG(logger, logLevel, message) \ |