#ifndef _VTM_LOG4CPLUS_HELPER_H_ #define _VTM_LOG4CPLUS_HELPER_H_ #pragma once #include "log4vendor.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "log4upload.h" #include "mutex.h" namespace cmb { enum cpluslog_level { log_level_debug = 0, log_level_trace, log_level_info, log_level_warn, log_level_error, log_level_fatal, log_level_end }; enum cpluslog_append_type { log_append_none = 0, log_append_console = 1, log_append_file = 2, log_append_console_file = 3, log_append_socket = 4, log_append_console_socket = 5, log_append_file_socket = 6, log_append_all = 7 }; class log4cplus_helper : public log4vendor { public: ~log4cplus_helper(void); static log4cplus_helper* get_instance(); bool init(const char* name); void uninit(); std::ostream& stream(); void trace(const vtm_string& text); void info(const vtm_string& text); void debug(const vtm_string& text); void warn(const vtm_string& text); void error(const vtm_string& text); void fatal(const vtm_string& text); void trace(const char* text); void info(const char* text); void debug(const char* text); void warn(const char* text); void error(const char* text); void fatal(const char* text); bool set_log_append_type(int type) { if((type & log_append_console) || (type & log_append_file) || (type & log_append_socket)) { _append_type = type; return true; } return false; } /*! * @brief 设置日志文件存储的路径文件夹 * @param[in] 存储的文件夹路径,兼容不加 '\\' 的情况 * @return : */ bool set_log_dir(const vtm_string& log_file) { vtm_string tmp(log_file); if(tmp.empty()) return false; if(tmp[tmp.size()-1] != '\\' && tmp[tmp.size()-1] != '/') { #if defined(_MSC_VER) tmp.push_back('\\'); #else tmp.push_back('/'); #endif //_MSC_VER } _log_dir = tmp; return true; } bool set_log_level(const int level) { const int ll = level * 10000; if(ll < 0 || ll > log4cplus::OFF_LOG_LEVEL) { return false; } _log_level = ll; return true; } void update_map_value(const vtm_string& value) { if(!value.empty()) { log4cplus::getMDC ().put("key", value); } } vtm_string get_map_value() { vtm_string value(""); if(!log4cplus::getMDC().get(&value, "key")) { return vtm_string(""); } return value; } int run_log_sender(const vtm_string& ip, const unsigned short port); vtm_string format(const char *ft, ...); vtm_string format(const char *ft,va_list& arg); void log( const char *file_name, const char *func_name, int line, const char* ft, int type = log_level_debug); void log( const char *file_name, const char *func_name, int line, int type ,const char *ft = "", ...); void log(int log_level, const vtm_string& text); void logw(int log_level, const std::wstring& wtext); log4cplus::Logger get_logger() { return log4cplus::Logger::getInstance(LOG4CPLUS_TEXT(_log_key_name.c_str())); } void initialize_linklog(const log_init_config& config); void loglink(LOG_LEVEL_E level, vtm_string text); private: static log4cplus_helper* _instance; log4cplus_helper(void); void config_remote_logger(const char* remote_name); log4cplus::helpers::SharedObjectPtr _append_console; log4cplus::helpers::SharedObjectPtr _append_file; log4cplus::helpers::SharedObjectPtr _append_socket; log4cplus::helpers::SharedObjectPtr _append_none; log4cplus::tstring _log_dir; log4cplus::tstring _log_server_ip; unsigned short _log_server_port; vtm_string _log_client_key_name; int _append_type; vtm_string _log_key_name; bool _socket_send_running; static mutex _mutex; bool _initialized; unsigned short _log_listen_port; mutex _mutex_4_update_socket; bool _initilzed_zip; std::queue _zip_logs; vtm_string _cur_upload_log; uint64_t _cur_upload_offset; int _log_level; bool _initialize_uploaded; upload_helper _upload_helper; }; } #endif //_VTM_LOG4CPLUS_HELPER_H_