Added file log.

This commit is contained in:
Ravin Perera
2019-10-21 13:29:52 +05:30
parent 2d5d8960c0
commit f77dae2f28
6 changed files with 60 additions and 11 deletions

View File

@@ -33,6 +33,7 @@ target_link_libraries(hpcore
libsodium.a
${Boost_SYSTEM_LIBRARY}
${Boost_LOG_LIBRARY}
${Boost_LOG_SETUP_LIBRARY}
stdc++fs
pthread
protobuf.a

View File

@@ -123,6 +123,7 @@ void set_contract_dir_paths(std::string basedir)
ctx.configFile = ctx.configDir + "/hp.cfg";
ctx.histDir = basedir + "/hist";
ctx.stateDir = basedir + "/state";
ctx.logDir = basedir + "/log";
}
/**

View File

@@ -20,6 +20,7 @@ struct contract_ctx
std::string contractDir; // Contract base directory
std::string histDir; // Contract history dir
std::string stateDir; // Contract state dir
std::string logDir; // Contract log dir
std::string configDir; // Contract config dir
std::string configFile; // Full path to the contract config file
};

View File

@@ -9,6 +9,7 @@
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/utility/manipulators/to_log.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/support/date_time.hpp>
#include "conf.hpp"
@@ -25,7 +26,7 @@ namespace hplog
{
/**
* Stream operator overload for converting integer severity vaue to text.
* Stream operator overload for converting integer severity value to text.
*/
std::ostream &operator<<(std::ostream &os, LOG_SEVERITY level)
{
@@ -50,27 +51,52 @@ void init()
else if (conf::cfg.loglevel == "error")
severity = LOG_SEVERITY::ERROR;
// Log line format expression.
auto format_expr = (expr::stream
<< expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S")
//<< ":" << expr::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID")
<< " [" << expr::attr<std::string>("Channel")
<< "] [" << expr::attr<LOG_SEVERITY, severity_tag>("Severity")
<< "] " << expr::smessage);
if (conf::cfg.loggers.count("console") == 1)
{
logging::add_console_log(
std::clog,
keywords::filter = (a_severity >= severity),
keywords::format =
(expr::stream
<< expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S")
//<< ":" << expr::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID")
<< " [" << expr::attr<std::string>("Channel")
<< "] [" << expr::attr<LOG_SEVERITY, severity_tag>("Severity")
<< "] " << expr::smessage));
keywords::format = format_expr);
}
if (conf::cfg.loggers.count("file") == 1)
{
// TODO: Add file logger.
logging::add_file_log(
keywords::target = conf::ctx.logDir, // Log file directory.
keywords::file_name = conf::ctx.logDir + "/hp_%N.log", // File name pattern "hp_1.log".
keywords::rotation_size = 10 * 1024 * 1024, // Rotate files every 10 MB.
keywords::max_size = 500 * 1024 * 1024, // Do not exceed 500 MB total logs.
keywords::filter = (a_severity >= severity),
keywords::format = format_expr,
// This will make every new launch of Hot Pocket to start a new log file number.
// It will scan existing log files matching the pattern and find the next number.
keywords::scan_method = sinks::file::scan_matching,
#ifndef NDEBUG
// We enable auto_flush to immediately get the logs onto the file. Otherwise it takes time
// for buffered logs to reach the file. This impacts performance. So enabled only in debug build.
keywords::auto_flush = true
#endif
);
}
// Add Boost Log built-in fields for log entries.
logging::add_common_attributes();
}
void deinit()
{
// This will make all buffered logs to be flushed to the sink.
logging::core::get()->remove_all_sinks();
}
} // namespace hplog

View File

@@ -28,6 +28,7 @@ enum LOG_SEVERITY
BOOST_LOG_ATTRIBUTE_KEYWORD(a_severity, "Severity", hplog::LOG_SEVERITY);
void init();
void deinit();
} // namespace hplog

View File

@@ -62,6 +62,22 @@ int parse_cmd(int argc, char **argv)
return -1;
}
/**
* Performs any cleanup on graceful application termination.
*/
void deinit()
{
usr::deinit();
hplog::deinit();
}
void signal_handler(int signum)
{
LOG_WARN << "Interrupt signal (" << signum << ") received.";
deinit();
exit(signum);
}
int main(int argc, char **argv)
{
// Extract the CLI args
@@ -101,7 +117,7 @@ int main(int argc, char **argv)
else if (conf::ctx.command == "run")
{
// In order to host the contract we should init some required sub systems.
if (conf::init() != 0)
return -1;
@@ -110,6 +126,9 @@ int main(int argc, char **argv)
if (usr::init() != 0)
return -1;
// After initializing primary subsystems, register the SIGINT handler.
signal(SIGINT, signal_handler);
// This will start hosting the contract and start consensus rounds.
// TODO
@@ -156,7 +175,7 @@ int main(int argc, char **argv)
}
// Free resources.
usr::deinit();
deinit();
}
}
}