Refactor and rewrite logging facility.

This commit is contained in:
Christoph Heiss 2018-03-06 20:50:25 +01:00
parent dfe5509412
commit ebab2d5a8a

View file

@ -125,6 +125,17 @@ void install_signal_handler()
}}.detach(); }}.detach();
} }
std::shared_ptr<spdlog::logger> create_logger(const std::string& name)
{
auto global_logger{spdlog::get(GLOBAL_LOGGER_NAME)};
auto global_sink{global_logger->sinks().front()};
auto logger{std::make_shared<spdlog::logger>(name, global_sink)};
logger->set_level(global_logger->level());
return logger;
}
void daemonize_process() void daemonize_process()
{ {
auto logger{spdlog::get(GLOBAL_LOGGER_NAME)}; auto logger{spdlog::get(GLOBAL_LOGGER_NAME)};
@ -220,10 +231,8 @@ void resply_result_to_rslp_data(rslp::Command_Data* data, const resply::Result&
class ProtobufAdapter { class ProtobufAdapter {
public: public:
ProtobufAdapter(const std::string& redis_host, asio::io_context& io_context, ProtobufAdapter(const std::string& redis_host, asio::io_context& io_context) :
std::shared_ptr<spdlog::sinks::sink> logsink) : client_{redis_host}, socket_{io_context}, logger_{create_logger(LOGGER_NAME)}
client_{redis_host}, socket_{io_context},
logger_{std::make_shared<spdlog::logger>(LOGGER_NAME, logsink)}
{ } { }
~ProtobufAdapter() ~ProtobufAdapter()
@ -335,9 +344,9 @@ private:
class ProtobufServer { class ProtobufServer {
public: public:
void start(const Options& options, std::shared_ptr<spdlog::sinks::sink> logsink) void start(const Options& options)
{ {
auto logger{std::make_shared<spdlog::logger>(LOGGER_NAME, logsink)}; auto logger{create_logger(LOGGER_NAME)};
asio::io_context io_context; asio::io_context io_context;
asio::ip::tcp::acceptor acceptor{io_context}; asio::ip::tcp::acceptor acceptor{io_context};
@ -350,11 +359,11 @@ public:
return; return;
} }
logger->info("Started protobuf server on 0.0.0.0:{}", options.protobuf_port); logger->info("Started listening on 0.0.0.0:{}", options.protobuf_port);
for (;;) { for (;;) {
auto server{std::make_shared<ProtobufAdapter>( auto server{std::make_shared<ProtobufAdapter>(
options.remote_host, io_context, logsink options.remote_host, io_context
)}; )};
acceptor.accept(server->socket()); acceptor.accept(server->socket());
@ -369,8 +378,8 @@ private:
class GrpcAdapter final : public rslp::ProtoAdapter::Service { class GrpcAdapter final : public rslp::ProtoAdapter::Service {
public: public:
GrpcAdapter(const std::string& redis_host, std::shared_ptr<spdlog::sinks::sink> logsink) : GrpcAdapter(const std::string& redis_host) :
client_{redis_host}, logger_{std::make_shared<spdlog::logger>(LOGGER_NAME, logsink)} client_{redis_host}, logger_{create_logger(LOGGER_NAME)}
{ } { }
void initialize() void initialize()
@ -385,7 +394,6 @@ public:
for (const auto& arg: request->data()) { for (const auto& arg: request->data()) {
command.push_back(arg.str()); command.push_back(arg.str());
} }
logger_->debug("[{}] execute(): {}", context->peer(), request->ShortDebugString());
if (command.size()) { if (command.size()) {
std::string name{command.front()}; std::string name{command.front()};
@ -459,25 +467,22 @@ private:
class GrpcServer { class GrpcServer {
public: public:
void start(const Options& options, std::shared_ptr<spdlog::sinks::sink> logsink) void start(const Options& options)
{ {
logger_.reset(new spdlog::logger(LOGGER_NAME, logsink)); auto logger{create_logger(LOGGER_NAME)};
setup_grpc_logging(); setup_grpc_logging();
grpc::ServerBuilder builder; grpc::ServerBuilder builder;
builder.AddListeningPort("0.0.0.0:" + options.grpc_port, grpc::InsecureServerCredentials()); builder.AddListeningPort("0.0.0.0:" + options.grpc_port, grpc::InsecureServerCredentials());
GrpcAdapter adapter{options.remote_host, logsink}; GrpcAdapter adapter{options.remote_host};
adapter.initialize(); adapter.initialize();
builder.RegisterService(&adapter); builder.RegisterService(&adapter);
server_ = builder.BuildAndStart(); auto server{builder.BuildAndStart()};
server_->Wait(); logger->info("Started listening on 0.0.0.0:{}", options.grpc_port);
}
void shutdown() server->Wait();
{
server_->Shutdown();
} }
private: private:
@ -505,48 +510,32 @@ private:
} }
const std::string LOGGER_NAME{"GrpcServer"}; const std::string LOGGER_NAME{"GrpcServer"};
std::shared_ptr<spdlog::logger> logger_;
std::unique_ptr<grpc::Server> server_;
}; };
class Proxy { class Proxy {
public: public:
Proxy(const Options& options) : options_{options} { } Proxy(const Options& options) :
options_{options}, logger_{spdlog::stdout_logger_mt(LOGGER_NAME)} { }
void run() void run()
{ {
std::shared_ptr<spdlog::sinks::sink> logsink{
std::make_shared<spdlog::sinks::ansicolor_stdout_sink_mt>()
};
logger_.reset(new spdlog::logger(LOGGER_NAME, logsink));
spdlog::register_logger(logger_);
setup_logger();
read_config_file(); read_config_file();
if (options_.daemonize) { if (options_.daemonize) {
logger_->info("Daemonizing server, logfile: {}", options_.log_path); daemonize();
daemonize_process();
// The parent process has exited already.
// Drop the console logger and create a rotating file logger.
spdlog::drop(LOGGER_NAME);
logsink.reset(new spdlog::sinks::rotating_file_sink_mt(
options_.log_path, 1048576 * 10, 10)
);
logger_.reset(new spdlog::logger(LOGGER_NAME, logsink));
setup_logger();
} }
if (options_.verbose) {
logger_->info("Setting logging level to verbose.");
logger_->set_level(spdlog::level::debug);
}
ProtobufServer protobuf_server; ProtobufServer protobuf_server;
std::thread{&ProtobufServer::start, &protobuf_server, std::cref(options_), logsink}.detach(); std::thread{&ProtobufServer::start, &protobuf_server, std::cref(options_)}.detach();
GrpcServer grpc_server; GrpcServer grpc_server;
std::thread{&GrpcServer::start, &grpc_server, std::cref(options_), logsink}.detach(); std::thread{&GrpcServer::start, &grpc_server, std::cref(options_)}.detach();
for (;;); for (;;);
} }
@ -568,22 +557,26 @@ private:
} }
} }
void setup_logger() void daemonize()
{ {
logger_->flush_on(spdlog::level::info); logger_->info("Daemonizing server, logfile: {}", options_.log_path);
daemonize_process();
// The parent process has exited already.
if (options_.verbose) { // Drop the console logger and create a rotating file logger.
logger_->info("Setting logging level to verbose."); spdlog::drop(LOGGER_NAME);
logger_->set_level(spdlog::level::debug);
} logger_ = spdlog::rotating_logger_mt(
LOGGER_NAME, options_.log_path, 10485760 /* 10MB */, 10 /* files */
);
} }
const std::string LOGGER_NAME{GLOBAL_LOGGER_NAME};
const Options& options_; const Options& options_;
std::shared_ptr<spdlog::logger> logger_; std::shared_ptr<spdlog::logger> logger_;
json config_; json config_;
const std::string LOGGER_NAME{GLOBAL_LOGGER_NAME};
}; };