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