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.
		
		
		
		
			
				
					141 lines
				
				4.0 KiB
			
		
		
			
		
	
	
					141 lines
				
				4.0 KiB
			| 
											6 years ago
										 | #ifndef _GNU_SOURCE
 | ||
| 
											6 years ago
										 | #define _GNU_SOURCE
 | ||
| 
											6 years ago
										 | #endif
 | ||
| 
											6 years ago
										 | 
 | ||
| 
											4 years ago
										 | #include "common/swaglog.h"
 | ||
| 
											6 years ago
										 | 
 | ||
| 
											4 years ago
										 | #include <cassert>
 | ||
|  | #include <cstring>
 | ||
| 
											4 years ago
										 | #include <limits>
 | ||
| 
											5 years ago
										 | #include <mutex>
 | ||
| 
											5 years ago
										 | #include <string>
 | ||
| 
											6 years ago
										 | 
 | ||
| 
											5 years ago
										 | #include <zmq.h>
 | ||
| 
											6 years ago
										 | #include "json11.hpp"
 | ||
| 
											6 years ago
										 | 
 | ||
| 
											4 years ago
										 | #include "common/util.h"
 | ||
|  | #include "common/version.h"
 | ||
| 
											5 years ago
										 | #include "selfdrive/hardware/hw.h"
 | ||
| 
											6 years ago
										 | 
 | ||
| 
											4 years ago
										 | class SwaglogState : public LogState {
 | ||
| 
											5 years ago
										 |  public:
 | ||
| 
											4 years ago
										 |   SwaglogState() : LogState("ipc:///tmp/logmessage") {}
 | ||
| 
											6 years ago
										 | 
 | ||
| 
											4 years ago
										 |   json11::Json::object ctx_j;
 | ||
| 
											5 years ago
										 | 
 | ||
| 
											4 years ago
										 |   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;
 | ||
|  |       }
 | ||
|  |     }
 | ||
| 
											6 years ago
										 | 
 | ||
| 
											4 years ago
										 |     // 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
 | ||
| 
											4 years ago
										 |     if (Hardware::TICI()) {
 | ||
| 
											4 years ago
										 |       ctx_j["device"] =  "tici";
 | ||
|  |     } else {
 | ||
|  |       ctx_j["device"] =  "pc";
 | ||
| 
											6 years ago
										 |     }
 | ||
| 
											4 years ago
										 |     LogState::initialize();
 | ||
| 
											5 years ago
										 |   }
 | ||
| 
											4 years ago
										 | };
 | ||
| 
											5 years ago
										 | 
 | ||
| 
											4 years ago
										 | static SwaglogState s = {};
 | ||
| 
											4 years ago
										 | bool LOG_TIMESTAMPS = getenv("LOG_TIMESTAMPS");
 | ||
| 
											4 years ago
										 | uint32_t NO_FRAME_ID = std::numeric_limits<uint32_t>::max();
 | ||
| 
											6 years ago
										 | 
 | ||
| 
											4 years ago
										 | static void log(int levelnum, const char* filename, int lineno, const char* func, const char* msg, const std::string& log_s) {
 | ||
| 
											5 years ago
										 |   if (levelnum >= s.print_level) {
 | ||
|  |     printf("%s: %s\n", filename, msg);
 | ||
|  |   }
 | ||
|  |   char levelnum_c = levelnum;
 | ||
| 
											5 years ago
										 |   zmq_send(s.sock, (levelnum_c + log_s).c_str(), log_s.length() + 1, ZMQ_NOBLOCK);
 | ||
| 
											5 years ago
										 | }
 | ||
| 
											4 years ago
										 | static void cloudlog_common(int levelnum, const char* filename, int lineno, const char* func,
 | ||
|  |                             char* msg_buf, json11::Json::object msg_j={}) {
 | ||
| 
											4 years ago
										 |   std::lock_guard lk(s.lock);
 | ||
| 
											4 years ago
										 |   if (!s.initialized) s.initialize();
 | ||
| 
											6 years ago
										 | 
 | ||
| 
											4 years ago
										 |   json11::Json::object log_j = json11::Json::object {
 | ||
| 
											6 years ago
										 |     {"ctx", s.ctx_j},
 | ||
|  |     {"levelnum", levelnum},
 | ||
|  |     {"filename", filename},
 | ||
|  |     {"lineno", lineno},
 | ||
|  |     {"funcname", func},
 | ||
|  |     {"created", seconds_since_epoch()}
 | ||
|  |   };
 | ||
| 
											4 years ago
										 |   if (msg_j.empty()) {
 | ||
| 
											4 years ago
										 |     log_j["msg"] = msg_buf;
 | ||
| 
											4 years ago
										 |   } else {
 | ||
|  |     log_j["msg"] = msg_j;
 | ||
| 
											4 years ago
										 |   }
 | ||
|  | 
 | ||
|  |   std::string log_s = ((json11::Json)log_j).dump();
 | ||
| 
											5 years ago
										 |   log(levelnum, filename, lineno, func, msg_buf, log_s);
 | ||
| 
											6 years ago
										 |   free(msg_buf);
 | ||
|  | }
 | ||
| 
											4 years ago
										 | 
 | ||
|  | void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func,
 | ||
| 
											4 years ago
										 |                 const char* fmt, ...) {
 | ||
| 
											4 years ago
										 |   va_list args;
 | ||
|  |   va_start(args, fmt);
 | ||
| 
											4 years ago
										 |   char* msg_buf = nullptr;
 | ||
|  |   int ret = vasprintf(&msg_buf, fmt, args);
 | ||
| 
											4 years ago
										 |   va_end(args);
 | ||
| 
											4 years ago
										 |   if (ret <= 0 || !msg_buf) return;
 | ||
|  |   cloudlog_common(levelnum, filename, lineno, func, msg_buf);
 | ||
| 
											4 years ago
										 | }
 | ||
|  | 
 | ||
| 
											4 years ago
										 | void cloudlog_t_common(int levelnum, const char* filename, int lineno, const char* func,
 | ||
|  |                        uint32_t frame_id, const char* fmt, va_list args) {
 | ||
| 
											4 years ago
										 |   if (!LOG_TIMESTAMPS) return;
 | ||
| 
											4 years ago
										 |   char* msg_buf = nullptr;
 | ||
|  |   int ret = vasprintf(&msg_buf, fmt, args);
 | ||
|  |   if (ret <= 0 || !msg_buf) return;
 | ||
| 
											4 years ago
										 |   json11::Json::object tspt_j = json11::Json::object{
 | ||
| 
											4 years ago
										 |     {"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, ...) {
 | ||
| 
											4 years ago
										 |   va_list args;
 | ||
|  |   va_start(args, fmt);
 | ||
| 
											4 years ago
										 |   cloudlog_t_common(levelnum, filename, lineno, func, frame_id, fmt, args);
 | ||
| 
											4 years ago
										 |   va_end(args);
 | ||
|  | }
 | ||
| 
											4 years ago
										 | 
 |