Skip to content

Commit eb30bb7

Browse files
authored
Add swss::Logger to c-api (#969)
* Create c-api for logger * Remove the include of logger_ut.h * Call SWSSLogger_restartLogger to start logger thread * Remove include of cstring
1 parent 1593cc6 commit eb30bb7

File tree

4 files changed

+106
-0
lines changed

4 files changed

+106
-0
lines changed

common/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ common_libswsscommon_la_SOURCES = \
8080
common/c-api/zmqconsumerstatetable.cpp \
8181
common/c-api/zmqproducerstatetable.cpp \
8282
common/c-api/table.cpp \
83+
common/c-api/logger.cpp \
8384
common/performancetimer.cpp
8485

8586
common_libswsscommon_la_CXXFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(LIBNL_CFLAGS) $(CODE_COVERAGE_CXXFLAGS)

common/c-api/logger.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <string>
2+
3+
#include "../logger.h"
4+
#include "logger.h"
5+
#include "util.h"
6+
7+
using namespace swss;
8+
using namespace std;
9+
10+
SWSSResult SWSSLogger_linkToDbWithOutput(const char *dbName, SWSSPriorityChangeNotify prioChangeNotify, const char *defLogLevel, SWSSOutputChangeNotify outputChangeNotify, const char *defOutput) {
11+
std::string logLevelStr(defLogLevel);
12+
std::string outputStr(defOutput);
13+
14+
SWSSTry(Logger::linkToDbWithOutput(string(dbName),
15+
[prioChangeNotify](std::string component, std::string newPriority) {
16+
prioChangeNotify(component.c_str(), newPriority.c_str()); // Convert std::string to const char*
17+
},
18+
logLevelStr,
19+
[outputChangeNotify](std::string component, std::string newOutput) {
20+
outputChangeNotify(component.c_str(), newOutput.c_str()); // Convert std::string to const char*
21+
},
22+
outputStr));
23+
}
24+
25+
SWSSResult SWSSLogger_restartLogger() {
26+
SWSSTry(Logger::restartLogger());
27+
}
28+

common/c-api/logger.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef SWSS_COMMON_C_API_LOGGER_H
2+
#define SWSS_COMMON_C_API_LOGGER_H
3+
4+
#include "result.h"
5+
6+
#ifdef __cplusplus
7+
extern "C" {
8+
#endif
9+
10+
#include <stdint.h>
11+
12+
typedef void (*SWSSOutputChangeNotify) (const char* component, const char* outputStr);
13+
typedef void (*SWSSPriorityChangeNotify) (const char* component, const char* outputStr);
14+
SWSSResult SWSSLogger_linkToDbWithOutput(const char *dbName, SWSSPriorityChangeNotify prioChangeNotify, const char *defLogLevel, SWSSOutputChangeNotify outputChangeNotify, const char *defOutput);
15+
SWSSResult SWSSLogger_restartLogger();
16+
17+
#ifdef __cplusplus
18+
}
19+
#endif
20+
21+
#endif

tests/c_api_ut.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,18 @@
1414
#include "common/c-api/zmqconsumerstatetable.h"
1515
#include "common/c-api/zmqproducerstatetable.h"
1616
#include "common/c-api/zmqserver.h"
17+
#include "common/c-api/logger.h"
1718
#include "common/select.h"
1819
#include "common/subscriberstatetable.h"
1920
#include "gtest/gtest.h"
2021

2122
using namespace std;
2223
using namespace swss;
2324

25+
static char LOG_LEVEL_FOR_TEST[32] = "";
26+
static char LOG_OUTPUT_FOR_TEST[32] = "";
27+
static const char* LOG_NAME_FOR_TEST = "test";
28+
2429
static void clearDB() {
2530
DBConnector db("TEST_DB", 0, true);
2631
RedisReply r(&db, "FLUSHALL", REDIS_REPLY_STATUS);
@@ -87,6 +92,20 @@ struct SWSSStringManager {
8792
}
8893
};
8994

95+
void logLevelNotify(const char* component, const char* prioStr)
96+
{
97+
if (strcmp(component, LOG_NAME_FOR_TEST) != 0)
98+
return;
99+
strncpy(LOG_LEVEL_FOR_TEST, prioStr, sizeof(LOG_LEVEL_FOR_TEST)-1);
100+
}
101+
102+
void logOutputNotify(const char* component, const char* outputStr)
103+
{
104+
if (strcmp(component, LOG_NAME_FOR_TEST) != 0)
105+
return;
106+
strncpy(LOG_OUTPUT_FOR_TEST, outputStr, sizeof(LOG_OUTPUT_FOR_TEST)-1);
107+
}
108+
90109
TEST(c_api, DBConnector) {
91110
clearDB();
92111
SWSSStringManager sm;
@@ -483,3 +502,40 @@ TEST(c_api, exceptions) {
483502
SWSSString_free(result.location);
484503
SWSSString_free(result.message);
485504
}
505+
506+
TEST(c_api, Logger) {
507+
508+
clearDB();
509+
SWSSStringManager sm;
510+
511+
SWSSDBConnector db;
512+
SWSSFieldValueArray fvs;
513+
514+
SWSSDBConnector_new_named("CONFIG_DB", 1000, true, &db);
515+
516+
SWSSLogger_linkToDbWithOutput(LOG_NAME_FOR_TEST, logLevelNotify, "NOTICE", logOutputNotify, "SYSLOG");
517+
SWSSLogger_restartLogger();
518+
519+
sleep(1);
520+
521+
cout << "Checking log level for " << LOG_NAME_FOR_TEST << endl;
522+
EXPECT_STREQ(LOG_LEVEL_FOR_TEST, "NOTICE");
523+
cout << "Checking log output for " << LOG_NAME_FOR_TEST << endl;
524+
EXPECT_STREQ(LOG_OUTPUT_FOR_TEST, "SYSLOG");
525+
526+
cout << "Setting log level/output for " << LOG_NAME_FOR_TEST << endl;
527+
SWSSTable tbl;
528+
SWSSTable_new(db, "LOGGER", &tbl);
529+
SWSSFieldValueTuple data[2] = {{.field = DAEMON_LOGLEVEL, .value = sm.makeString("DEBUG")},
530+
{.field = DAEMON_LOGOUTPUT, .value = sm.makeString("STDOUT")}};
531+
fvs.len = 2;
532+
fvs.data = data;
533+
SWSSTable_set(tbl, LOG_NAME_FOR_TEST, fvs);
534+
535+
sleep(1);
536+
537+
cout << "Checking log level for " << LOG_NAME_FOR_TEST << endl;
538+
EXPECT_STREQ(LOG_LEVEL_FOR_TEST, "DEBUG");
539+
cout << "Checking log output for " << LOG_NAME_FOR_TEST << endl;
540+
EXPECT_STREQ(LOG_OUTPUT_FOR_TEST, "STDOUT");
541+
}

0 commit comments

Comments
 (0)