Hi Hans,

That's why it needs explicitly "extern C++", I have changed it as your suggestion

I have sent out V2, still keep TraceLog in logtrace.h as of now, so it can be included once for either c or c++.

Let's see from Anders and Ravi if we have any ideas, I'm happy to move it out of logtrace.h too, maybe the existing class Trace as well


Regards,

Minh



On 19/04/18 06:47, Hans Nordebäck wrote:

Hi Minh,


One part of this problem is in mbcsv_papi.h, the

#ifdef __cplusplus

extern "C" {

should at least be after the  #include stmts. Fixing this should remove the need for the extern "C++". But moving this part to

a separate header file would also be good.


As a general comment, (all OpenSAF), is that only extern "C" should be needed, and it should

be carefully placed only where it is required, c++ access to a c function/variable with external linkage, not placing

it in a too wide scope. It can be placed around a group of c-functions but not the complete header file.

/Thanks HansN

------------------------------------------------------------------------
*Från:* Hans Nordebäck <hans.nordeb...@ericsson.com>
*Skickat:* den 18 april 2018 20:43:22
*Till:* Minh Hon Chau; Anders Widell; ravisekhar.ko...@oracle.com
*Kopia:* opensaf-devel@lists.sourceforge.net
*Ämne:* Re: [devel] [PATCH 1/2] base: Add support to direct OpenSAF logging to local node file [#2306]
Hi Minh,


yes, before this patch logtrace.h was a c header file callable from c and c++. Now it is a c/c++ header file

so including it from a c program without the extern "c++" will fail. In the first review comment I suggested

to move this part to a separate header file and keep logtrace.h as before.

/Regards HansN

________________________________
Från: Minh Hon Chau <minh.c...@dektech.com.au>
Skickat: den 18 april 2018 16:09:35
Till: Hans Nordebäck; Anders Widell; ravisekhar.ko...@oracle.com
Kopia: opensaf-devel@lists.sourceforge.net
Ämne: Re: [PATCH 1/2] base: Add support to direct OpenSAF logging to local node file [#2306]

Hi Hans,

One comment regarding extern C++ as below

Thanks,

Minh


On 18/04/18 23:37, Hans Nordebäck wrote:
> Hi Minh,
>
>   See my comments below.
>
> /Thanks HansN
>
> -----Original Message-----
> From: Minh Hon Chau [mailto:minh.c...@dektech.com.au]
> Sent: den 18 april 2018 15:20
> To: Hans Nordebäck <hans.nordeb...@ericsson.com>; Anders Widell <anders.wid...@ericsson.com>; ravisekhar.ko...@oracle.com
> Cc: opensaf-devel@lists.sourceforge.net
> Subject: Re: [PATCH 1/2] base: Add support to direct OpenSAF logging to local node file [#2306]
>
> Hi Hans,
>
> Please check my response with [Minh]
>
> Thanks
>
> Minh
>
>
> On 18/04/18 22:40, Hans Nordeback wrote:
>> Hi Minh,
>>
>> ack, code review only. Some comments below.
>>
>> /Thanks HansN
>>
>>
>> On 04/12/2018 01:12 AM, Minh Chau wrote:
>>> Unify TraceLog and MdsLog class to one class (TraceLog) so it can be
>>> used as a common log client.
>>> Add new instance TraceLog for OpenSAF logging to local file, which
>>> can be enabled/disabled via environment variable OSAF_LOCAL_NODE_LOG
>>> ---
>>>    src/base/logtrace.cc | 167
>>> ++++++++++++++++++++++++++-------------------------
>>>    src/base/logtrace.h  |  50 +++++++++++++--
>>>    src/mds/mds_log.cc   | 114 +++--------------------------------
>>>    3 files changed, 140 insertions(+), 191 deletions(-)
>>>
>>> diff --git a/src/base/logtrace.cc b/src/base/logtrace.cc index
>>> b046fab..857e31c 100644
>>> --- a/src/base/logtrace.cc
>>> +++ b/src/base/logtrace.cc
>>> @@ -36,15 +36,10 @@
>>>    #include <cstdio>
>>>    #include <cstdlib>
>>>    #include <cstring>
>>> -#include "base/buffer.h"
>>> -#include "base/conf.h"
>>> -#include "base/log_message.h"
>>> -#include "base/macros.h"
>>> -#include "base/mutex.h"
>>> +#include "base/getenv.h"
>>>    #include "base/ncsgl_defs.h"
>>>    #include "base/osaf_utility.h"
>>>    #include "base/time.h"
>>> -#include "base/unix_client_socket.h"
>>>    #include "dtm/common/osaflog_protocol.h"
>>>      namespace global {
>>> @@ -55,65 +50,38 @@ const char *const prefix_name[] = {"EM", "AL",
>>> "CR", "ER", "WA", "NO", "IN",
>>>                                       "T6", "T7", "T8", ">>", "<<"};
>>>    char *msg_id;
>>>    int logmask;
>>> +const char* osaf_log_file = "osaf.log"; bool enable_osaf_log =
>>> +false;
>>>      }  // namespace global
>>>    -class TraceLog {
>>> - public:
>>> -  static bool Init();
>>> -  static void Log(base::LogMessage::Severity severity, const char
>>> *fmt,
>>> -                  va_list ap);
>>> -
>>> - private:
>>> -  TraceLog(const std::string &fqdn, const std::string &app_name,
>>> -           uint32_t proc_id, const std::string &msg_id,
>>> -           const std::string &socket_name);
>>> -  void LogInternal(base::LogMessage::Severity severity, const char
>>> *fmt,
>>> -                   va_list ap);
>>> -  static constexpr const uint32_t kMaxSequenceId =
>>> uint32_t{0x7fffffff};
>>> -  static TraceLog *instance_;
>>> -  const base::LogMessage::HostName fqdn_;
>>> -  const base::LogMessage::AppName app_name_;
>>> -  const base::LogMessage::ProcId proc_id_;
>>> -  const base::LogMessage::MsgId msg_id_;
>>> -  uint32_t sequence_id_;
>>> -  base::UnixClientSocket log_socket_;
>>> -  base::Buffer<512> buffer_;
>>> -  base::Mutex mutex_;
>>> -
>>> -  DELETE_COPY_AND_MOVE_OPERATORS(TraceLog);
>>> -};
>>> -
>>> -TraceLog *TraceLog::instance_ = nullptr;
>>> -
>>> -TraceLog::TraceLog(const std::string &fqdn, const std::string
>>> &app_name,
>>> -                   uint32_t proc_id, const std::string &msg_id,
>>> -                   const std::string &socket_name)
>>> -    : fqdn_{base::LogMessage::HostName{fqdn}},
>>> - app_name_{base::LogMessage::AppName{app_name}},
>>> - proc_id_{base::LogMessage::ProcId{std::to_string(proc_id)}},
>>> - msg_id_{base::LogMessage::MsgId{msg_id}},
>>> -      sequence_id_{1},
>>> -      log_socket_{socket_name, base::UnixSocket::kBlocking},
>>> -      buffer_{},
>>> -      mutex_{} {}
>>> -
>>> -bool TraceLog::Init() {
>>> -  if (instance_ != nullptr) return false;
>>> -  char app_name[49];
>>> -  char pid_path[1024];
>> [HansN] instead of static global use unnamed namespaces instead. Also
>> try to avoid globals, why change Log and Init from static members? (An
>> alternative is to use a singleton instead, if needed)
> [Minh] Changing Log() and Init() not to be static because I am not using singleton any more. Before this ticket, we have 2 singleton, one for TraceLog and one for MdsLog, they are mostly looking similar, so don't want to make a third singleton for new osaf log. > [HansN]  TraceLog and MdsLog::Init and Log where static member functions belonging to respective class namespace, now static globals are used.  Not that big deal but good to avoid global data.
>>> +static TraceLog gl_trace;
>>> +static TraceLog gl_osaflog;
>>> +TraceLog::TraceLog()
>>> +    : sequence_id_{1}, buffer_{} {
>>> +  mutex_ = nullptr;
>>> +  log_socket_ = nullptr;
>>> +}
>>> +
>>> +TraceLog::~TraceLog() {
>>> +  if (mutex_) delete mutex_;
>>> +  if (log_socket_) delete log_socket_; } bool TraceLog::Init(const
>>> +char *msg_id, WriteMode mode) {
>>> +  char app_name[NAME_MAX];
>>> +  char pid_path[PATH_MAX];
>>>      uint32_t process_id = getpid();
>>>      char *token, *saveptr;
>>>      char *pid_name = nullptr;
>>>    -  memset(app_name, 0, 49);
>>> -  memset(pid_path, 0, 1024);
>>> +  memset(app_name, 0, NAME_MAX);
>>> +  memset(pid_path, 0, PATH_MAX);
>>>        snprintf(pid_path, sizeof(pid_path), "/proc/%" PRIu32
>>> "/cmdline", process_id);
>>>      FILE *f = fopen(pid_path, "r");
>>>      if (f != nullptr) {
>>>        size_t size;
>>> -    size = fread(pid_path, sizeof(char), 1024, f);
>>> +    size = fread(pid_path, sizeof(char), PATH_MAX, f);
>>>        if (size > 0) {
>>>          if ('\n' == pid_path[size - 1]) pid_path[size - 1] = '\0';
>>>        }
>>> @@ -131,19 +99,28 @@ bool TraceLog::Init() {
>>>      }
>>> base::Conf::InitFullyQualifiedDomainName();
>>>      const std::string &fqdn = base::Conf::FullyQualifiedDomainName();
>>> -  instance_ = new TraceLog{fqdn, app_name, process_id,
>>> global::msg_id,
>>> - Osaflog::kServerSocketPath};
>>> -  return instance_ != nullptr;
>>> +
>>> +  fqdn_ = base::LogMessage::HostName(fqdn);
>>> +  app_name_ = base::LogMessage::AppName(app_name);
>>> +  proc_id_ = base::LogMessage::ProcId{std::to_string(process_id)};
>>> +  msg_id_ = base::LogMessage::MsgId{msg_id};
>>> +  log_socket_ = new
>>> +base::UnixClientSocket{Osaflog::kServerSocketPath,
>>> + static_cast<base::UnixSocket::Mode>(mode)};
>>> +  mutex_ = new base::Mutex{};
>>> +
>>> +  return true;
>>>    }
>>>      void TraceLog::Log(base::LogMessage::Severity severity, const
>>> char *fmt,
>>>                       va_list ap) {
>>> -  if (instance_ != nullptr) instance_->LogInternal(severity, fmt,
>>> ap);
>>> +  if (log_socket_ != nullptr && mutex_ != nullptr) {
>>> +    LogInternal(severity, fmt, ap);
>>> +  }
>>>    }
>>>      void TraceLog::LogInternal(base::LogMessage::Severity severity,
>>> const char *fmt,
>>>                               va_list ap) {
>>> -  base::Lock lock(mutex_);
>>> +  base::Lock lock(*mutex_);
>>>      uint32_t id = sequence_id_;
>>>      sequence_id_ = id < kMaxSequenceId ? id + 1 : 1;
>>>      buffer_.clear();
>>> @@ -154,7 +131,7 @@ void
>>> TraceLog::LogInternal(base::LogMessage::Severity severity, const char
>>> *fmt,
>>> {base::LogMessage::Parameter{base::LogMessage::SdName{"sequenceId"},
>>> std::to_string(id)}}}},
>>>          fmt, ap, &buffer_);
>>> -  log_socket_.Send(buffer_.data(), buffer_.size());
>>> +  log_socket_->Send(buffer_.data(), buffer_.size());
>>>    }
>>>      static pid_t gettid() { return syscall(SYS_gettid); } @@ -190,7
>>> +167,7 @@ static void sighup_handler(int sig) {
>>>      setlogmask(global::logmask);
>>>    }
>>>    -void logtrace_output(const char *file, unsigned line, unsigned
>>> priority,
>>> +void trace_output(const char *file, unsigned line, unsigned
>>> +priority,
>>>                         unsigned category, const char *format, va_list
>>> ap) {
>>>      char preamble[288];
>>>    @@ -199,38 +176,59 @@ void logtrace_output(const char *file,
>>> unsigned line, unsigned priority,
>>>      if (strncmp(file, "src/", 4) == 0) file += 4;
>>>      snprintf(preamble, sizeof(preamble), "%d:%s:%u %s %s", gettid(),
>>> file, line,
>>>               global::prefix_name[priority + category], format);
>>> - TraceLog::Log(static_cast<base::LogMessage::Severity>(priority),
>>> preamble,
>>> -                ap);
>>> + gl_trace.Log(static_cast<base::LogMessage::Severity>(priority),
>>> preamble,
>>> +                  ap);
>>> +}
>>> +
>>> +void log_output(const char *file, unsigned line, unsigned priority,
>>> +                     unsigned category, const char *format, va_list
>>> ap) {
>>> +  char preamble[288];
>>> +
>>> +  assert(priority <= LOG_DEBUG && category < CAT_MAX);
>>> +
>>> +  if (strncmp(file, "src/", 4) == 0) file += 4;
>>> +  snprintf(preamble, sizeof(preamble), "%d:%s:%u %s %s", gettid(),
>>> file, line,
>>> +           global::prefix_name[priority + category], format);
>>> +gl_osaflog.Log(static_cast<base::LogMessage::Severity>(priority),
>>> preamble,
>>> +                  ap);
>>>    }
>>>      void logtrace_log(const char *file, unsigned line, int priority,
>>>                      const char *format, ...) {
>>>      va_list ap;
>>>      va_list ap2;
>>> +  va_list ap3;
>>>    -  /* Uncondionally send to syslog */
>>>      va_start(ap, format);
>>>      va_copy(ap2, ap);
>>> -
>>> -  char *tmp_str = nullptr;
>>> -  int tmp_str_len = 0;
>>> -
>>> -  if ((tmp_str_len = asprintf(&tmp_str, "%s %s",
>>> global::prefix_name[priority],
>>> -                              format)) < 0) {
>>> -    vsyslog(priority, format, ap);
>>> -  } else {
>>> -    vsyslog(priority, tmp_str, ap);
>>> -    free(tmp_str);
>>> +  va_copy(ap3, ap);
>>> +
>>> +  /* Only log to syslog if the env var OSAF_LOCAL_NODE_LOG is not
>>> +set
>>> +   * Or with equal or higher priority than LOG_WARNING,
>>> +   */
>>> +  if (global::enable_osaf_log == false ||
>>> +      (global::enable_osaf_log && priority <= LOG_WARNING)) {
>>> +    char *tmp_str = nullptr;
>>> +    int tmp_str_len = 0;
>>> +    if ((tmp_str_len = asprintf(&tmp_str, "%s %s",
>>> +        global::prefix_name[priority], format)) < 0) {
>>> +      vsyslog(priority, format, ap);
>>> +    } else {
>>> +      vsyslog(priority, tmp_str, ap);
>>> +      free(tmp_str);
>>> +    }
>>> +  }
>>> +  /* Log to osaf_local_node_log file */
>>> +  if (global::enable_osaf_log == true) {
>>> +    log_output(file, line, priority, CAT_LOG, format, ap2);
>>>      }
>>> -
>>>      /* Only output to file if configured to */
>>> -  if (!(global::category_mask & (1 << CAT_LOG))) goto done;
>>> -
>>> -  logtrace_output(file, line, priority, CAT_LOG, format, ap2);
>>> -
>>> -done:
>>> +  if (global::category_mask & (1 << CAT_LOG)) {
>>> +    trace_output(file, line, priority, CAT_LOG, format, ap3);
>>> +  }
>>>      va_end(ap);
>>>      va_end(ap2);
>>> +  va_end(ap3);
>>>    }
>>>      bool is_logtrace_enabled(unsigned category) { @@ -245,7 +243,7 @@
>>> void logtrace_trace(const char *file, unsigned line, unsigned
>>> category,
>>>      if (is_logtrace_enabled(category) == false) return;
>>>        va_start(ap, format);
>>> -  logtrace_output(file, line, LOG_DEBUG, category, format, ap);
>>> +  trace_output(file, line, LOG_DEBUG, category, format, ap);
>>>      va_end(ap);
>>>    }
>>>    @@ -266,9 +264,12 @@ int logtrace_init(const char *, const char
>>> *pathname, unsigned mask) {
>>>        global::msg_id = nullptr;
>>>      }
>>>      if (result && mask != 0) {
>>> -    result = TraceLog::Init();
>>> +    result = gl_trace.Init(global::msg_id, TraceLog::kBlocking);
>>> +  }
>>> +  if (base::GetEnv("OSAF_LOCAL_NODE_LOG", uint32_t{0}) == 1) {
>>> +    global::enable_osaf_log = true;
>>> +    gl_osaflog.Init(global::osaf_log_file, TraceLog::kBlocking);
>>>      }
>>> -
>>>      if (result) {
>>>        syslog(LOG_INFO, "logtrace: trace enabled to file '%s',
>>> mask=0x%x",
>>>               global::msg_id, global::category_mask); @@ -308,7 +309,7
>>> @@ int trace_category_set(unsigned mask) {
>>>      if (global::category_mask == 0) {
>>>        syslog(LOG_INFO, "logtrace: trace disabled");
>>>      } else {
>>> -    TraceLog::Init();
>>> +    gl_trace.Init(global::msg_id, TraceLog::kBlocking);
>>>        syslog(LOG_INFO, "logtrace: trace enabled to file %s,
>>> mask=0x%x",
>>>               global::msg_id, global::category_mask);
>>>      }
>>> diff --git a/src/base/logtrace.h b/src/base/logtrace.h index
>>> e7c232c..7f5a059 100644
>>> --- a/src/base/logtrace.h
>>> +++ b/src/base/logtrace.h
>>> @@ -37,6 +37,45 @@
>>>    #include <syslog.h>
>>>    #include <stdarg.h>
>>>    #include "base/ncsgl_defs.h"
>>> +
>> [HansN] perhaps move the TraceLog class to a separate file? The extern
>> "C++" is not needed.
> [Minh] I also don't really like the "extern C++" here together with existing "extern C", but it serves a purpose of including header file at the other places. It only needs "#include "base/logtrace.h" at either C or C++ source to use either legacy C trace functions or new C++ trace class. If you agree this is a convenience that needs to do? > [HansN] Do you really need the "extern C++", it is guarded with the __cplusplus ifdef and extern "c++" is default linkage for c++.
[Minh]: FYI, if I remove the "extern C++" then I got the error below
   CXX      src/imm/immpbed/bin_osafimmpbed-immpbe.o
   CXX src/imm/immpbed/bin_osafimmpbed-immpbe_daemon.o
   CXX      src/log/logd/bin_osaflogd-lgs_amf.o
In file included from /usr/include/c++/5/bits/stl_algobase.h:61:0,
                  from /usr/include/c++/5/list:60,
                  from ./src/base/log_message.h:26,
                  from ./src/base/logtrace.h:43,
                  from ./src/base/ncs_osprm.h:32,
                  from ./src/base/ncs_ubaid.h:45,
                  from ./src/mbc/mbcsv_papi.h:29,
                  from ./src/log/logd/lgs.h:30,
                  from src/log/logd/lgs_amf.cc:24:
/usr/include/c++/5/bits/cpp_type_traits.h:72:3: error: template with C
linkage
    template<typename _Iterator, typename _Container>
    ^
/usr/include/c++/5/bits/cpp_type_traits.h:85:3: error: template with C
linkage
    template<bool>
    ^
/usr/include/c++/5/bits/cpp_type_traits.h:89:3: error: template
specialization with C linkage
    template<>




>>> +#ifdef __cplusplus
>>> +extern "C++" {
>>> +#include "base/log_message.h"
>>> +#include "base/unix_client_socket.h"
>>> +#include "base/buffer.h"
>>> +#include "base/conf.h"
>>> +#include "base/macros.h"
>>> +#include "base/mutex.h"
>>> +  class TraceLog {
>>> +   public:
>>> +    enum WriteMode {
>>> +      kBlocking = base::UnixSocket::Mode::kBlocking,
>>> +      kNonblocking = base::UnixSocket::Mode::kNonblocking,
>>> +    };
>>> +    bool Init(const char *msg_id, WriteMode mode);
>>> +    void Log(base::LogMessage::Severity severity, const char *fmt,
>>> +                    va_list ap);
>>> +    TraceLog();
>>> +    ~TraceLog();
>>> +
>>> +   private:
>>> +    void LogInternal(base::LogMessage::Severity severity, const char
>>> *fmt,
>>> +                     va_list ap);
>>> +    static constexpr const uint32_t kMaxSequenceId =
>>> uint32_t{0x7fffffff};
>>> +    base::LogMessage::HostName fqdn_{""};
>>> +    base::LogMessage::AppName app_name_{""};
>>> +    base::LogMessage::ProcId proc_id_{""};
>>> +    base::LogMessage::MsgId msg_id_{""};
>>> +    uint32_t sequence_id_;
>>> +    base::UnixClientSocket* log_socket_;
>>> +    base::Buffer<512> buffer_;
>>> +    base::Mutex* mutex_;
>>> +
>>> + DELETE_COPY_AND_MOVE_OPERATORS(TraceLog);
>>> +  };
>>> +}
>>> +#endif
>>> +
>>>    #ifdef __cplusplus
>>>    extern "C" {
>>>    #endif
>>> @@ -129,7 +168,9 @@ extern void logtrace_trace(const char *file,
>>> unsigned line, unsigned category,
>>>        __attribute__((format(printf, 4, 5)));
>>>      extern bool is_logtrace_enabled(unsigned category); -extern void
>>> logtrace_output(const char *file, unsigned line, unsigned priority,
>>> +extern void trace_output(const char *file, unsigned line, unsigned
>>> priority,
>>> +                            unsigned category, const char *format,
>>> va_list ap);
>>> +extern void log_output(const char *file, unsigned line, unsigned
>>> priority,
>>>                                unsigned category, const char *format,
>>> va_list ap);
>>>      /* LOG API. Use same levels as syslog */ @@ -169,13 +210,14 @@
>>> extern void logtrace_output(const char *file, unsigned line, unsigned
>>> priority,
>>>      logtrace_trace(__FILE__, __LINE__, CAT_TRACE8, (format), ##args)
>>>      #ifdef __cplusplus
>>> +
>>>    class Trace {
>>>     public:
>>>      Trace() {}
>>>      ~Trace() {
>>>        if (!trace_leave_called &&
>>> is_logtrace_enabled(CAT_TRACE_LEAVE)) {
>>>          va_list ap{};
>>> -      logtrace_output(file_, 0, LOG_DEBUG, CAT_TRACE_LEAVE,
>>> function_, ap);
>>> +      trace_output(file_, 0, LOG_DEBUG, CAT_TRACE_LEAVE, function_,
>>> ap);
>>>        }
>>>      }
>>>      void trace(const char *file, const char *function, unsigned line,
>>> @@ -185,7 +227,7 @@ class Trace {
>>>          file_ = file;
>>>          function_ = function;
>>>          va_start(ap, format);
>>> -      logtrace_output(file, line, LOG_DEBUG, category, format, ap);
>>> +      trace_output(file, line, LOG_DEBUG, category, format, ap);
>>>          va_end(ap);
>>>        }
>>>      }
>>> @@ -196,7 +238,7 @@ class Trace {
>>>        if (is_logtrace_enabled(category)) {
>>>          va_start(ap, format);
>>>          trace_leave_called = true;
>>> -      logtrace_output(file, line, LOG_DEBUG, category, format, ap);
>>> +      trace_output(file, line, LOG_DEBUG, category, format, ap);
>>>          va_end(ap);
>>>        }
>>>      }
>>> diff --git a/src/mds/mds_log.cc b/src/mds/mds_log.cc index
>>> 5acae55..69fb372 100644
>>> --- a/src/mds/mds_log.cc
>>> +++ b/src/mds/mds_log.cc
>>> @@ -35,6 +35,7 @@
>>>    #include "base/buffer.h"
>>>    #include "base/conf.h"
>>>    #include "base/log_message.h"
>>> +#include "base/logtrace.h"
>>>    #include "base/macros.h"
>>>    #include "base/mutex.h"
>>>    #include "base/ncsgl_defs.h"
>>> @@ -44,106 +45,9 @@
>>>    #include "dtm/common/osaflog_protocol.h"
>>>    #include "mds/mds_dt2c.h"
>>>    #include "mds/mds_papi.h"
>>> -
>>> -class MdsLog {
>>> - public:
>>> -  static bool Init();
>>> -  static void Log(base::LogMessage::Severity severity, const char
>>> *fmt,
>>> -                  va_list ap);
>>> -
>>> - private:
>>> -  MdsLog(const std::string &fqdn, const char *app_name, uint32_t
>>> proc_id,
>>> -         const char *socket_name);
>>> -  void LogInternal(base::LogMessage::Severity severity, const char
>>> *fmt,
>>> -                   va_list ap);
>>> -  static constexpr const uint32_t kMaxSequenceId =
>>> uint32_t{0x7fffffff};
>>> -  static MdsLog *instance_;
>>> -  const base::LogMessage::HostName fqdn_;
>>> -  const base::LogMessage::AppName app_name_;
>>> -  const base::LogMessage::ProcId proc_id_;
>>> -  uint32_t sequence_id_;
>>> -  base::UnixClientSocket log_socket_;
>>> -  base::Buffer<512> buffer_;
>>> -  base::Mutex mutex_;
>>> -
>>> -  DELETE_COPY_AND_MOVE_OPERATORS(MdsLog);
>>> -};
>>> -
>>>    int gl_mds_log_level = 3;
>>> -MdsLog *MdsLog::instance_ = nullptr;
>>> -
>>> -MdsLog::MdsLog(const std::string &fqdn, const char *app_name,
>>> uint32_t proc_id,
>>> -               const char *socket_name)
>>> -    : fqdn_{base::LogMessage::HostName{fqdn}},
>>> - app_name_{base::LogMessage::AppName{app_name}},
>>> - proc_id_{base::LogMessage::ProcId{std::to_string(proc_id)}},
>>> -      sequence_id_{1},
>>> -      log_socket_{socket_name, base::UnixSocket::kNonblocking},
>>> -      buffer_{},
>>> -      mutex_{} {}
>>> -
>>> -/*****************************************************
>>> - Function NAME: get_process_name()
>>> - Returns : <process_name>[<pid> or <tipc_port_ref>]
>>> -*****************************************************/
>>> -bool MdsLog::Init() {
>>> -  if (instance_ != nullptr) return false;
>>> -  char app_name[MDS_MAX_PROCESS_NAME_LEN];
>>> -  char pid_path[1024];
>>> -  uint32_t process_id = getpid();
>>> -  char *token, *saveptr;
>>> -  char *pid_name = nullptr;
>>> -
>>> -  memset(app_name, 0, MDS_MAX_PROCESS_NAME_LEN);
>>> -  memset(pid_path, 0, 1024);
>>> -
>>> -  snprintf(pid_path, sizeof(pid_path), "/proc/%" PRIu32 "/cmdline",
>>> process_id);
>>> -  FILE *f = fopen(pid_path, "r");
>>> -  if (f != nullptr) {
>>> -    size_t size;
>>> -    size = fread(pid_path, sizeof(char), 1024, f);
>>> -    if (size > 0) {
>>> -      if ('\n' == pid_path[size - 1]) 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);
>>> -  }
>>> -  if (snprintf(app_name, sizeof(app_name), "%s", pid_name) < 0) {
>>> -    app_name[0] = '\0';
>>> -  }
>>> - base::Conf::InitFullyQualifiedDomainName();
>>> -  const std::string &fqdn = base::Conf::FullyQualifiedDomainName();
>>> -  instance_ =
>>> -      new MdsLog{fqdn, app_name, process_id,
>>> Osaflog::kServerSocketPath};
>>> -  return instance_ != nullptr;
>>> -}
>>>    -void MdsLog::Log(base::LogMessage::Severity severity, const char
>>> *fmt,
>>> -                 va_list ap) {
>>> -  if (instance_ != nullptr) instance_->LogInternal(severity, fmt,
>>> ap); -}
>>> -
>>> -void MdsLog::LogInternal(base::LogMessage::Severity severity, const
>>> char *fmt,
>>> -                         va_list ap) {
>>> -  base::Lock lock(mutex_);
>>> -  uint32_t id = sequence_id_;
>>> -  sequence_id_ = id < kMaxSequenceId ? id + 1 : 1;
>>> -  buffer_.clear();
>>> -  base::LogMessage::Write(
>>> -      base::LogMessage::Facility::kLocal1, severity,
>>> base::ReadRealtimeClock(),
>>> -      fqdn_, app_name_, proc_id_,
>>> base::LogMessage::MsgId{"mds.log"},
>>> -      {{base::LogMessage::SdName{"meta"},
>>> -
>>> {base::LogMessage::Parameter{base::LogMessage::SdName{"sequenceId"},
>>> - std::to_string(id)}}}},
>>> -      fmt, ap, &buffer_);
>>> -  log_socket_.Send(buffer_.data(), buffer_.size()); -}
>>> +static TraceLog gl_mds_log;
>>> /********************************************************************
>>> ***********
>>>     * Funtion Name   :    mds_log_init @@ -154,7 +58,9 @@ void
>>> MdsLog::LogInternal(base::LogMessage::Severity severity, const char
>>> *fmt,
>>>     *
>>> *********************************************************************
>>> **********/
>>>    uint32_t mds_log_init(const char *) {
>>> -  if (!MdsLog::Init()) return NCSCC_RC_FAILURE;
>>> +  if (!gl_mds_log.Init("mds.log", TraceLog::kNonblocking)) {
>>> +    return NCSCC_RC_FAILURE;
>>> +  }
>>>      tzset();
>>>      log_mds_notify("BEGIN MDS LOGGING| ARCHW=%x|64bit=%zu\n",
>>> MDS_SELF_ARCHWORD,
>>>                     MDS_WORD_SIZE_TYPE); @@ -173,7 +79,7 @@ void
>>> log_mds_critical(const char *fmt, ...) {
>>>      if (gl_mds_log_level < NCSMDS_LC_CRITICAL) return;
>>>      va_list ap;
>>>      va_start(ap, fmt);
>>> - MdsLog::Log(base::LogMessage::Severity::kCrit, fmt, ap);
>>> + gl_mds_log.Log(base::LogMessage::Severity::kCrit, fmt, ap);
>>>      va_end(ap);
>>>    }
>>>    @@ -189,7 +95,7 @@ void log_mds_err(const char *fmt, ...) {
>>>      if (gl_mds_log_level < NCSMDS_LC_ERR) return;
>>>      va_list ap;
>>>      va_start(ap, fmt);
>>> - MdsLog::Log(base::LogMessage::Severity::kErr, fmt, ap);
>>> + gl_mds_log.Log(base::LogMessage::Severity::kErr, fmt, ap);
>>>      va_end(ap);
>>>    }
>>>    @@ -205,7 +111,7 @@ void log_mds_notify(const char *fmt, ...) {
>>>      if (gl_mds_log_level < NCSMDS_LC_NOTIFY) return;
>>>      va_list ap;
>>>      va_start(ap, fmt);
>>> - MdsLog::Log(base::LogMessage::Severity::kNotice, fmt, ap);
>>> + gl_mds_log.Log(base::LogMessage::Severity::kNotice, fmt, ap);
>>>      va_end(ap);
>>>    }
>>>    @@ -221,7 +127,7 @@ void log_mds_info(const char *fmt, ...) {
>>>      if (gl_mds_log_level < NCSMDS_LC_INFO) return;
>>>      va_list ap;
>>>      va_start(ap, fmt);
>>> - MdsLog::Log(base::LogMessage::Severity::kInfo, fmt, ap);
>>> + gl_mds_log.Log(base::LogMessage::Severity::kInfo, fmt, ap);
>>>      va_end(ap);
>>>    }
>>>    @@ -238,6 +144,6 @@ void log_mds_dbg(const char *fmt, ...) {
>>>      if (gl_mds_log_level < NCSMDS_LC_DBG) return;
>>>      va_list ap;
>>>      va_start(ap, fmt);
>>> - MdsLog::Log(base::LogMessage::Severity::kDebug, fmt, ap);
>>> + gl_mds_log.Log(base::LogMessage::Severity::kDebug, fmt, ap);
>>>      va_end(ap);
>>>    }
>>

------------------------------------------------------------------------------
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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

------------------------------------------------------------------------------
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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to