You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							137 lines
						
					
					
						
							3.9 KiB
						
					
					
				
			
		
		
	
	
							137 lines
						
					
					
						
							3.9 KiB
						
					
					
				| #ifndef _GNU_SOURCE
 | |
| #define _GNU_SOURCE
 | |
| #endif
 | |
| 
 | |
| #include "common/swaglog.h"
 | |
| 
 | |
| #include <cassert>
 | |
| #include <cstring>
 | |
| #include <limits>
 | |
| #include <mutex>
 | |
| #include <string>
 | |
| 
 | |
| #include <zmq.h>
 | |
| #include "json11.hpp"
 | |
| 
 | |
| #include "common/util.h"
 | |
| #include "common/version.h"
 | |
| #include "system/hardware/hw.h"
 | |
| 
 | |
| class SwaglogState : public LogState {
 | |
|  public:
 | |
|   SwaglogState() : LogState("ipc:///tmp/logmessage") {}
 | |
| 
 | |
|   json11::Json::object ctx_j;
 | |
| 
 | |
|   inline void initialize() {
 | |
|     ctx_j = json11::Json::object {};
 | |
|     print_level = CLOUDLOG_WARNING;
 | |
|     const char* print_lvl = getenv("LOGPRINT");
 | |
|     if (print_lvl) {
 | |
|       if (strcmp(print_lvl, "debug") == 0) {
 | |
|         print_level = CLOUDLOG_DEBUG;
 | |
|       } else if (strcmp(print_lvl, "info") == 0) {
 | |
|         print_level = CLOUDLOG_INFO;
 | |
|       } else if (strcmp(print_lvl, "warning") == 0) {
 | |
|         print_level = CLOUDLOG_WARNING;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     // openpilot bindings
 | |
|     char* dongle_id = getenv("DONGLE_ID");
 | |
|     if (dongle_id) {
 | |
|       ctx_j["dongle_id"] = dongle_id;
 | |
|     }
 | |
|     char* daemon_name = getenv("MANAGER_DAEMON");
 | |
|     if (daemon_name) {
 | |
|       ctx_j["daemon"] = daemon_name;
 | |
|     }
 | |
|     ctx_j["version"] = COMMA_VERSION;
 | |
|     ctx_j["dirty"] = !getenv("CLEAN");
 | |
| 
 | |
|     // device type
 | |
|     ctx_j["device"] = Hardware::get_name();
 | |
|     LogState::initialize();
 | |
|   }
 | |
| };
 | |
| 
 | |
| static SwaglogState s = {};
 | |
| bool LOG_TIMESTAMPS = getenv("LOG_TIMESTAMPS");
 | |
| uint32_t NO_FRAME_ID = std::numeric_limits<uint32_t>::max();
 | |
| 
 | |
| static void log(int levelnum, const char* filename, int lineno, const char* func, const char* msg, const std::string& log_s) {
 | |
|   if (levelnum >= s.print_level) {
 | |
|     printf("%s: %s\n", filename, msg);
 | |
|   }
 | |
|   char levelnum_c = levelnum;
 | |
|   zmq_send(s.sock, (levelnum_c + log_s).c_str(), log_s.length() + 1, ZMQ_NOBLOCK);
 | |
| }
 | |
| 
 | |
| static void cloudlog_common(int levelnum, const char* filename, int lineno, const char* func,
 | |
|                             char* msg_buf, const json11::Json::object &msg_j={}) {
 | |
|   std::lock_guard lk(s.lock);
 | |
|   if (!s.initialized) s.initialize();
 | |
| 
 | |
|   json11::Json::object log_j = json11::Json::object {
 | |
|     {"ctx", s.ctx_j},
 | |
|     {"levelnum", levelnum},
 | |
|     {"filename", filename},
 | |
|     {"lineno", lineno},
 | |
|     {"funcname", func},
 | |
|     {"created", seconds_since_epoch()}
 | |
|   };
 | |
|   if (msg_j.empty()) {
 | |
|     log_j["msg"] = msg_buf;
 | |
|   } else {
 | |
|     log_j["msg"] = msg_j;
 | |
|   }
 | |
| 
 | |
|   std::string log_s = ((json11::Json)log_j).dump();
 | |
|   log(levelnum, filename, lineno, func, msg_buf, log_s);
 | |
|   free(msg_buf);
 | |
| }
 | |
| 
 | |
| void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func,
 | |
|                 const char* fmt, ...) {
 | |
|   va_list args;
 | |
|   va_start(args, fmt);
 | |
|   char* msg_buf = nullptr;
 | |
|   int ret = vasprintf(&msg_buf, fmt, args);
 | |
|   va_end(args);
 | |
|   if (ret <= 0 || !msg_buf) return;
 | |
|   cloudlog_common(levelnum, filename, lineno, func, msg_buf);
 | |
| }
 | |
| 
 | |
| void cloudlog_t_common(int levelnum, const char* filename, int lineno, const char* func,
 | |
|                        uint32_t frame_id, const char* fmt, va_list args) {
 | |
|   if (!LOG_TIMESTAMPS) return;
 | |
|   char* msg_buf = nullptr;
 | |
|   int ret = vasprintf(&msg_buf, fmt, args);
 | |
|   if (ret <= 0 || !msg_buf) return;
 | |
|   json11::Json::object tspt_j = json11::Json::object{
 | |
|     {"event", msg_buf},
 | |
|     {"time", std::to_string(nanos_since_boot())}
 | |
|   };
 | |
|   if (frame_id < NO_FRAME_ID) {
 | |
|     tspt_j["frame_id"] = std::to_string(frame_id);
 | |
|   }
 | |
|   tspt_j = json11::Json::object{{"timestamp", tspt_j}};
 | |
|   cloudlog_common(levelnum, filename, lineno, func, msg_buf, tspt_j);
 | |
| }
 | |
| 
 | |
| 
 | |
| void cloudlog_te(int levelnum, const char* filename, int lineno, const char* func,
 | |
|                  const char* fmt, ...) {
 | |
|   va_list args;
 | |
|   va_start(args, fmt);
 | |
|   cloudlog_t_common(levelnum, filename, lineno, func, NO_FRAME_ID, fmt, args);
 | |
|   va_end(args);
 | |
| }
 | |
| void cloudlog_te(int levelnum, const char* filename, int lineno, const char* func,
 | |
|                  uint32_t frame_id, const char* fmt, ...) {
 | |
|   va_list args;
 | |
|   va_start(args, fmt);
 | |
|   cloudlog_t_common(levelnum, filename, lineno, func, frame_id, fmt, args);
 | |
|   va_end(args);
 | |
| }
 | |
| 
 | |
| 
 |