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