osaf/libs/core/mds/mds_log.cc |  223 ++++++++++++++++++++++-------------------
 1 files changed, 120 insertions(+), 103 deletions(-)


Instead of writing MDS log messages to a file directly from inside the MDS code,
send the log messages to the osaftransportd process using a UNIX socket.

diff --git a/osaf/libs/core/mds/mds_log.cc b/osaf/libs/core/mds/mds_log.cc
--- a/osaf/libs/core/mds/mds_log.cc
+++ b/osaf/libs/core/mds/mds_log.cc
@@ -23,38 +23,93 @@
   */
 
 #include "osaf/libs/core/mds/include/mds_log.h"
+#include <inttypes.h>
+#include <pthread.h>
 #include <sys/time.h>
 #include <time.h>
 #include <unistd.h>
 #include <cstdarg>
 #include <cstdio>
 #include <cstring>
+#include <string>
+#include "./configmake.h"
+#include "osaf/libs/core/common/include/osaf_utility.h"
+#include "osaf/libs/core/cplusplus/base/buffer.h"
+#include "osaf/libs/core/cplusplus/base/log_message.h"
+#include "osaf/libs/core/cplusplus/base/macros.h"
+#include "osaf/libs/core/cplusplus/base/time.h"
+#include "osaf/libs/core/cplusplus/base/unix_client_socket.h"
 #include "osaf/libs/core/include/mds_papi.h"
 #include "osaf/libs/core/include/ncsgl_defs.h"
 #include "osaf/libs/core/mds/include/mds_dt2c.h"
 
-constexpr static const size_t kMaxMdsFileNameLen = 256;
+class MdsLog {
+ public:
+  static bool Init();
+  static void Log(base::LogMessage::Severity severity, const char *str);
 
-static void log_mds(const char *str);
+ private:
+  MdsLog(const char* host_name, const char* app_name,
+            uint32_t proc_id, const char* socket_name);
+  ~MdsLog();
+  void LogInternal(base::LogMessage::Severity severity, const char *str);
+  static MdsLog* instance_;
+  pthread_mutex_t mutex_;
+  base::LogMessage::HostName host_name_;
+  base::LogMessage::AppName app_name_;
+  base::LogMessage::ProcId proc_id_;
+  uint64_t msg_id_;
+  base::Buffer buffer_;
+  base::UnixClientSocket log_socket_;
+
+  DELETE_COPY_AND_MOVE_OPERATORS(MdsLog);
+};
 
 int gl_mds_log_level = 3;
-static char *lf = nullptr;
-static char process_name[MDS_MAX_PROCESS_NAME_LEN];
-static char mds_log_fname[kMaxMdsFileNameLen];
+MdsLog* MdsLog::instance_ = nullptr;
+
+MdsLog::MdsLog(const char* host_name, const char* app_name,
+                     uint32_t proc_id, const char* socket_name) :
+    mutex_{},
+    host_name_{base::LogMessage::HostName{host_name}},
+    app_name_{base::LogMessage::AppName{app_name}},
+    proc_id_{base::LogMessage::ProcId{std::to_string(proc_id)}},
+    msg_id_{0},
+    buffer_{512},
+    log_socket_{socket_name} {
+  pthread_mutexattr_t attr;
+  int result = pthread_mutexattr_init(&attr);
+  if (result != 0) osaf_abort(result);
+  result = pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT);
+  if (result != 0) osaf_abort(result);
+  result = pthread_mutex_init(&mutex_, &attr);
+  if (result != 0) osaf_abort(result);
+  result = pthread_mutexattr_destroy(&attr);
+  if (result != 0) osaf_abort(result);
+}
+
+MdsLog::~MdsLog() {
+  int result = pthread_mutex_destroy(&mutex_);
+  if (result != 0) osaf_abort(result);
+}
 
 /*****************************************************
  Function NAME: get_process_name()
  Returns : <process_name>[<pid> or <tipc_port_ref>]
 *****************************************************/
-static void get_process_name() {
+bool MdsLog::Init() {
+  if (instance_ != nullptr) return false;
+  char app_name[MDS_MAX_PROCESS_NAME_LEN];
+  char node_name[256];
   char pid_path[1024];
   uint32_t process_id = getpid();
   char *token, *saveptr;
   char *pid_name = nullptr;
+  const char *node_name_file = PKGSYSCONFDIR "/node_name";
 
-  snprintf(pid_path, sizeof(pid_path), "/proc/%d/cmdline", process_id);
+  snprintf(pid_path, sizeof(pid_path), "/proc/%" PRIu32 "/cmdline", 
process_id);
   FILE* f = fopen(pid_path, "r");
-  if (f) {
+  if (f != nullptr) {
     size_t size;
     size = fread(pid_path, sizeof(char), 1024, f);
     if (size > 0) {
@@ -62,16 +117,51 @@ static void get_process_name() {
         pid_path[size-1] = '\0';
     }
     fclose(f);
+  } else {
+    pid_path[0] = '\0';
   }
   token = strtok_r(pid_path, "/", &saveptr);
   while (token != nullptr) {
     pid_name = token;
     token = strtok_r(nullptr, "/", &saveptr);
   }
-  snprintf(process_name, MDS_MAX_PROCESS_NAME_LEN, "%s[%d]", pid_name,
-           process_id);
-  return;
+  if (snprintf(app_name, sizeof(app_name), "%s", pid_name) < 0) {
+    app_name[0] = '\0';
+  }
+  FILE* fp = fopen(node_name_file, "r");
+  if (fp != nullptr) {
+    if (fscanf(fp, "%255s", node_name) != 1) node_name[0] = '\0';
+    fclose(fp);
+  } else {
+    node_name[0] = '\0';
+  }
+  instance_ = new MdsLog{node_name, app_name, process_id,
+                         PKGLOCALSTATEDIR "/mds_log.sock"};
+  return instance_ != nullptr;
 }
+
+void MdsLog::Log(base::LogMessage::Severity severity, const char *str) {
+  if (instance_ != nullptr) instance_->LogInternal(severity, str);
+}
+
+void MdsLog::LogInternal(base::LogMessage::Severity severity, const char *str) 
{
+  osaf_mutex_lock_ordie(&mutex_);
+  uint64_t id = msg_id_++;
+  buffer_.clear();
+  base::LogMessage::Write(base::LogMessage::Facility::kLocal0,
+                          severity,
+                          base::ReadRealtimeClock(),
+                          host_name_,
+                          app_name_,
+                          proc_id_,
+                          base::LogMessage::MsgId{std::to_string(id)},
+                          {},
+                          str,
+                          &buffer_);
+  log_socket_.Send(buffer_.data(), buffer_.size());
+  osaf_mutex_unlock_ordie(&mutex_);
+}
+
 
/*******************************************************************************
  * Funtion Name   :    mds_log_init
  *
@@ -80,28 +170,11 @@ static void get_process_name() {
  * Return Value   :    None
  *
  
*******************************************************************************/
-uint32_t mds_log_init(const char *log_file_name) {
-  FILE *fh;
-  memset(process_name, 0, MDS_MAX_PROCESS_NAME_LEN);
+uint32_t mds_log_init(const char*) {
+  if (!MdsLog::Init()) return NCSCC_RC_FAILURE;
   tzset();
-  get_process_name();
-
-  if (lf != nullptr)
-    return NCSCC_RC_FAILURE;
-
-  if (strlen(log_file_name) >= kMaxMdsFileNameLen)
-    return NCSCC_RC_FAILURE;
-
-  snprintf(mds_log_fname, sizeof(mds_log_fname), "%s", log_file_name);
-
-  lf = mds_log_fname;
-
-  if ((fh = fopen(lf, "a+")) != nullptr) {
-    fclose(fh);
-    log_mds_notify("BEGIN MDS LOGGING| PID=<%s> | ARCHW=%x|64bit=%zu\n",
-                   process_name, MDS_SELF_ARCHWORD, MDS_WORD_SIZE_TYPE);
-  }
-
+  log_mds_notify("BEGIN MDS LOGGING| ARCHW=%x|64bit=%zu\n",
+                 MDS_SELF_ARCHWORD, MDS_WORD_SIZE_TYPE);
   return NCSCC_RC_SUCCESS;
 }
 
@@ -115,15 +188,13 @@ uint32_t mds_log_init(const char *log_fi
  
*******************************************************************************/
 void log_mds_critical(const char *fmt, ...) {
   if (gl_mds_log_level < NCSMDS_LC_CRITICAL) return;
-  char str[MDS_MAX_PROCESS_NAME_LEN + 32];
-  int i;
+  char str[256];
   va_list ap;
 
-  i = snprintf(str, sizeof(str), "%s CRITICAL  |", process_name);
   va_start(ap, fmt);
-  vsnprintf(str + i, sizeof(str) - i, fmt, ap);
+  vsnprintf(str, sizeof(str), fmt, ap);
   va_end(ap);
-  log_mds(str);
+  MdsLog::Log(base::LogMessage::Severity::kCrit, str);
 }
 
 
/*******************************************************************************
@@ -136,15 +207,13 @@ void log_mds_critical(const char *fmt, .
  
*******************************************************************************/
 void log_mds_err(const char *fmt, ...) {
   if (gl_mds_log_level < NCSMDS_LC_ERR) return;
-  char str[MDS_MAX_PROCESS_NAME_LEN + 32];
-  int i;
+  char str[256];
   va_list ap;
 
-  i = snprintf(str, sizeof(str), "%s ERR  |", process_name);
   va_start(ap, fmt);
-  vsnprintf(str + i, sizeof(str) - i, fmt, ap);
+  vsnprintf(str, sizeof(str), fmt, ap);
   va_end(ap);
-  log_mds(str);
+  MdsLog::Log(base::LogMessage::Severity::kErr, str);
 }
 
 
/*******************************************************************************
@@ -157,15 +226,13 @@ void log_mds_err(const char *fmt, ...) {
  
*******************************************************************************/
 void log_mds_notify(const char *fmt, ...) {
   if (gl_mds_log_level < NCSMDS_LC_NOTIFY) return;
-  char str[MDS_MAX_PROCESS_NAME_LEN + 32];
-  int i;
+  char str[256];
   va_list ap;
 
-  i = snprintf(str, sizeof(str), "%s NOTIFY  |", process_name);
   va_start(ap, fmt);
-  vsnprintf(str + i, sizeof(str) - i, fmt, ap);
+  vsnprintf(str, sizeof(str), fmt, ap);
   va_end(ap);
-  log_mds(str);
+  MdsLog::Log(base::LogMessage::Severity::kNotice, str);
 }
 
 
/*******************************************************************************
@@ -178,15 +245,13 @@ void log_mds_notify(const char *fmt, ...
  
*******************************************************************************/
 void log_mds_info(const char *fmt, ...) {
   if (gl_mds_log_level < NCSMDS_LC_INFO) return;
-  char str[MDS_MAX_PROCESS_NAME_LEN + 32];
-  int i;
+  char str[256];
   va_list ap;
 
-  i = snprintf(str, sizeof(str), "%s INFO  |", process_name);
   va_start(ap, fmt);
-  vsnprintf(str + i, sizeof(str) - i, fmt, ap);
+  vsnprintf(str, sizeof(str), fmt, ap);
   va_end(ap);
-  log_mds(str);
+  MdsLog::Log(base::LogMessage::Severity::kInfo, str);
 }
 
 
/*******************************************************************************
@@ -200,59 +265,11 @@ void log_mds_info(const char *fmt, ...) 
  
*******************************************************************************/
 void log_mds_dbg(const char *fmt, ...) {
   if (gl_mds_log_level < NCSMDS_LC_DBG) return;
-  char str[MDS_MAX_PROCESS_NAME_LEN + 32];
-  int i;
+  char str[256];
   va_list ap;
 
-  i = snprintf(str, sizeof(str), "%s DBG  |", process_name);
   va_start(ap, fmt);
-  vsnprintf(str + i, sizeof(str) - i, fmt, ap);
+  vsnprintf(str, sizeof(str), fmt, ap);
   va_end(ap);
-  log_mds(str);
+  MdsLog::Log(base::LogMessage::Severity::kDebug, str);
 }
-
-/*******************************************************************************
- * Funtion Name   :    log_mds
- *
- * Purpose        :
- *
- * Return Value   :    None
- *
- 
*******************************************************************************/
-static void log_mds(const char *str) {
-  FILE *fp;
-
-  if (lf != nullptr && ((fp = fopen(lf, "a+")) != nullptr)) {
-    struct tm tm_info;
-    struct timeval tv;
-    char asc_tod[128];
-    char log_string[512];
-    int i;
-
-    gettimeofday(&tv, nullptr);
-    struct tm* tstamp_data = localtime_r(&tv.tv_sec, &tm_info);
-    osafassert(tstamp_data);
-
-    strftime(asc_tod, sizeof(asc_tod), "%b %e %k:%M:%S", tstamp_data);
-    i = snprintf(log_string, sizeof(log_string), "%s.%06ld %s",
-                 asc_tod, tv.tv_usec, str);
-
-    if (i < 0) {
-      i = 1;
-      log_string[i - 1] = '\n';
-    } else if (static_cast<size_t>(i) >= sizeof(log_string)) {
-      i = sizeof(log_string);
-      log_string[i - 1] = '\n';
-    } else if (log_string[i - 1] != '\n') {
-      log_string[i] = '\n';
-      i++;
-    }
-
-    if (fwrite(log_string, 1, i, fp) != static_cast<size_t>(i)) {
-      fclose(fp);
-      return;
-    }
-
-    fclose(fp);
-  }
-}

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to