    va_start(args, fmt);
    vasprintf(&msg_buf, fmt, args);
    va_end(args);
  
    if (!msg_buf) return;
  
    json11::Json log_j = json11::Json::object {
      {"msg", msg_buf},
      {"ctx", s.ctx_j},
      {"levelnum", levelnum},
 
</s> remove   vasprintf(&msg_buf, fmt, args);
 </s> add   int ret = vasprintf(&msg_buf, fmt, args); </s> remove 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();
 </s> add static void log(int levelnum, const char* filename, int lineno, const char* func, const char* msg, const std::string& log_s) {
  if (ret <= 0 || !msg_buf) return;

  std::lock_guard lk(s.lock);
  cloudlog_init();
    va_start(args, fmt);
    vasprintf(&msg_buf, fmt, args);
    va_end(args);
  
  if (ret <= 0 || !msg_buf) return;

  std::lock_guard lk(s.lock);
  cloudlog_init();
  
    json11::Json log_j = json11::Json::object {
      {"msg", msg_buf},
      {"ctx", s.ctx_j},
      {"levelnum", levelnum},
keep keep keep keep replace keep keep keep keep keep
 swaglog.cc: add test case. fixed the ctx of the first message is empty (#23226)

* test case

* add to selfdrive_tests.yaml

* fix ctx_j is empty

* check return value too 
selfdrive/common/swaglog.cc