|  |  |  | @ -11,20 +11,27 @@ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #include "json11.hpp" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #include "common/timing.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "common/util.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "common/version.h" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #include "swaglog.h" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | typedef struct LogState { | 
			
		
	
		
			
				
					|  |  |  |  | class LogState { | 
			
		
	
		
			
				
					|  |  |  |  | public: | 
			
		
	
		
			
				
					|  |  |  |  |   LogState() = default; | 
			
		
	
		
			
				
					|  |  |  |  |   ~LogState(); | 
			
		
	
		
			
				
					|  |  |  |  |   std::mutex lock; | 
			
		
	
		
			
				
					|  |  |  |  |   bool inited; | 
			
		
	
		
			
				
					|  |  |  |  |   json11::Json::object ctx_j; | 
			
		
	
		
			
				
					|  |  |  |  |   void *zctx; | 
			
		
	
		
			
				
					|  |  |  |  |   void *sock; | 
			
		
	
		
			
				
					|  |  |  |  |   int print_level; | 
			
		
	
		
			
				
					|  |  |  |  | } LogState; | 
			
		
	
		
			
				
					|  |  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | LogState::~LogState() { | 
			
		
	
		
			
				
					|  |  |  |  |   zmq_close(sock); | 
			
		
	
		
			
				
					|  |  |  |  |   zmq_ctx_destroy(zctx); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static LogState s = {}; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -71,24 +78,26 @@ static void cloudlog_init() { | 
			
		
	
		
			
				
					|  |  |  |  |   s.inited = true; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func, | 
			
		
	
		
			
				
					|  |  |  |  |                 const char* fmt, ...) { | 
			
		
	
		
			
				
					|  |  |  |  | void log(int levelnum, const char* filename, int lineno, const char* func, const char* msg, const std::string& log_s) { | 
			
		
	
		
			
				
					|  |  |  |  |   std::lock_guard lk(s.lock); | 
			
		
	
		
			
				
					|  |  |  |  |   cloudlog_init(); | 
			
		
	
		
			
				
					|  |  |  |  |   if (levelnum >= s.print_level) { | 
			
		
	
		
			
				
					|  |  |  |  |     printf("%s: %s\n", filename, msg); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   char levelnum_c = levelnum; | 
			
		
	
		
			
				
					|  |  |  |  |   zmq_send(s.sock, &levelnum_c, 1, ZMQ_NOBLOCK | ZMQ_SNDMORE); | 
			
		
	
		
			
				
					|  |  |  |  |   zmq_send(s.sock, log_s.c_str(), log_s.length(), ZMQ_NOBLOCK); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   char* msg_buf = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func, | 
			
		
	
		
			
				
					|  |  |  |  |                 const char* fmt, ...) { | 
			
		
	
		
			
				
					|  |  |  |  |   char* msg_buf = nullptr; | 
			
		
	
		
			
				
					|  |  |  |  |   va_list args; | 
			
		
	
		
			
				
					|  |  |  |  |   va_start(args, fmt); | 
			
		
	
		
			
				
					|  |  |  |  |   vasprintf(&msg_buf, fmt, args); | 
			
		
	
		
			
				
					|  |  |  |  |   va_end(args); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   if (!msg_buf) { | 
			
		
	
		
			
				
					|  |  |  |  |     return; | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   if (levelnum >= s.print_level) { | 
			
		
	
		
			
				
					|  |  |  |  |     printf("%s: %s\n", filename, msg_buf); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   if (!msg_buf) return; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   json11::Json log_j = json11::Json::object { | 
			
		
	
		
			
				
					|  |  |  |  |     {"msg", msg_buf}, | 
			
		
	
	
		
			
				
					|  |  |  | @ -99,15 +108,9 @@ void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func | 
			
		
	
		
			
				
					|  |  |  |  |     {"funcname", func}, | 
			
		
	
		
			
				
					|  |  |  |  |     {"created", seconds_since_epoch()} | 
			
		
	
		
			
				
					|  |  |  |  |   }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   std::string log_s = log_j.dump(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   log(levelnum, filename, lineno, func, msg_buf, log_s); | 
			
		
	
		
			
				
					|  |  |  |  |   free(msg_buf); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   char levelnum_c = levelnum; | 
			
		
	
		
			
				
					|  |  |  |  |   zmq_send(s.sock, &levelnum_c, 1, ZMQ_NOBLOCK | ZMQ_SNDMORE); | 
			
		
	
		
			
				
					|  |  |  |  |   zmq_send(s.sock, log_s.c_str(), log_s.length(), ZMQ_NOBLOCK); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void cloudlog_bind(const char* k, const char* v) { | 
			
		
	
	
		
			
				
					|  |  |  | 
 |