// log.h : log utility // // Author: Gongbing // // Create: 2019-08-07 #pragma once #ifndef _INCLUDED_REF_ #define _INCLUDED_REF_ #include "../ref/ref.h" #endif ////////////////////////////////////////////////////////////////////////////////////////// // level enum _log_level { LOG_LEVEL_ALL = 1, LOG_LEVEL_PART, LOG_LEVEL_IMPORTANT, LOG_LEVEL_VERY_IMPORTANT, LOG_LEVEL_NONE = INT_MAX, }; enum _log_type { LOG_TYPE_NONE, LOG_TYPE_CONSOLE_OUT, LOG_TYPE_OUTPUTDBG, LOG_TYPE_WRITE_FILE, LOG_TYPE_USER_CUSTOM, }; ////////////////////////////////////////////////////////////////////////////////////////// // macros #ifndef UNICODE_STR #define _TO_UNICODE(str) L##str #define UNICODE_STR(str) _TO_UNICODE(str) #define MAKE_UNICODE(str) UNICODE_STR(str) #endif #define LOG_API_PROTO(name) void(__stdcall *name)(const wchar_t* info, size_t words, void* user) #define LOG_API_INSTANCE(name) void __stdcall name(const wchar_t* info, size_t words, void* user) namespace log_util { ////////////////////////////////////////////////////////////////////////////////////////// // log interface typedef LOG_API_PROTO(real_log); __declspec(novtable) struct ILog : public ref_util::IRef { // param0: (const wchar_t*)path file when type is LOG_TYPE_WRITE_FILE, real_log when type is LOG_TYPE_USER_CUSTOM. otherwise always be ZERO // param1: for parameter 'user' of real_log when type is LOG_TYPE_USER_CUSTOM, otherwise always be ZERO COM_API_DECLARE(int, set_log_level(_log_level level)); COM_API_DECLARE(int, set_log_type(_log_type type, void* param0 = NULL, void* param1 = NULL)); // return type after this oper COM_API_DECLARE(void, write_log(const wchar_t* info, size_t bytes, _log_level level)); COM_API_DECLARE(bool, is_level_enabled(_log_level level)); // whether the message of level can be logged COM_API_DECLARE(void, set_prefix(const wchar_t* pref)); // default is without prefix COM_API_DECLARE(void, enable_time_stamp(bool enable)); // default is without timestamp }; // use inner log_util // param0: (const wchar_t*)path file when type is LOG_TYPE_WRITE_FILE, real_log when type is LOG_TYPE_USER_CUSTOM. otherwise always be ZERO // param1: for parameter 'user' of real_log when type is LOG_TYPE_USER_CUSTOM, otherwise always be ZERO PORT_API(ILog*) start_log(_log_type type = LOG_TYPE_OUTPUTDBG, _log_level level = LOG_LEVEL_ALL, void* param0 = NULL, void* param1 = NULL); PORT_API(ILog*) get_cur_log_util(void); // set an external log_util, NULL to stop current log, will invoke log->add_ref() if log is valid PORT_API(void) set_log_util(ILog* log); // invoke log PORT_API(bool) is_logging_enable(_log_level level); PORT_API_CALL(void, __cdecl) log(_log_level level, size_t estimate_bytes, const wchar_t* format, ...); PORT_API_CALL(void, __cdecl) log(_log_level level, size_t estimate_bytes, const char* format, ...); }