Add time limited logging object

This commit is contained in:
wezrule 2019-02-25 11:28:43 +00:00
commit 056f3d8dda
17 changed files with 573 additions and 348 deletions

View file

@ -8,6 +8,7 @@ add_executable (core_test
entry.cpp entry.cpp
gap_cache.cpp gap_cache.cpp
ledger.cpp ledger.cpp
logger.cpp
network.cpp network.cpp
node.cpp node.cpp
message.cpp message.cpp

211
nano/core_test/logger.cpp Normal file
View file

@ -0,0 +1,211 @@
#include <chrono>
#include <gtest/gtest.h>
#include <nano/node/logging.hpp>
#include <nano/secure/utility.hpp>
#include <regex>
using namespace std::chrono_literals;
namespace
{
std::string strip_timestamp (const std::string & line);
std::vector<std::string> get_last_lines_from_log_file (const std::string & log_path, unsigned count);
}
TEST (logging, serialization)
{
auto path (nano::unique_path ());
nano::logging logging1;
logging1.init (path);
logging1.ledger_logging_value = !logging1.ledger_logging_value;
logging1.ledger_duplicate_logging_value = !logging1.ledger_duplicate_logging_value;
logging1.network_logging_value = !logging1.network_logging_value;
logging1.network_message_logging_value = !logging1.network_message_logging_value;
logging1.network_publish_logging_value = !logging1.network_publish_logging_value;
logging1.network_packet_logging_value = !logging1.network_packet_logging_value;
logging1.network_keepalive_logging_value = !logging1.network_keepalive_logging_value;
logging1.network_node_id_handshake_logging_value = !logging1.network_node_id_handshake_logging_value;
logging1.node_lifetime_tracing_value = !logging1.node_lifetime_tracing_value;
logging1.insufficient_work_logging_value = !logging1.insufficient_work_logging_value;
logging1.log_rpc_value = !logging1.log_rpc_value;
logging1.bulk_pull_logging_value = !logging1.bulk_pull_logging_value;
logging1.work_generation_time_value = !logging1.work_generation_time_value;
logging1.log_to_cerr_value = !logging1.log_to_cerr_value;
logging1.max_size = 10;
logging1.min_time_between_log_output = 100ms;
nano::jsonconfig tree;
logging1.serialize_json (tree);
nano::logging logging2;
logging2.init (path);
bool upgraded (false);
ASSERT_FALSE (logging2.deserialize_json (upgraded, tree));
ASSERT_FALSE (upgraded);
ASSERT_EQ (logging1.ledger_logging_value, logging2.ledger_logging_value);
ASSERT_EQ (logging1.ledger_duplicate_logging_value, logging2.ledger_duplicate_logging_value);
ASSERT_EQ (logging1.network_logging_value, logging2.network_logging_value);
ASSERT_EQ (logging1.network_message_logging_value, logging2.network_message_logging_value);
ASSERT_EQ (logging1.network_publish_logging_value, logging2.network_publish_logging_value);
ASSERT_EQ (logging1.network_packet_logging_value, logging2.network_packet_logging_value);
ASSERT_EQ (logging1.network_keepalive_logging_value, logging2.network_keepalive_logging_value);
ASSERT_EQ (logging1.network_node_id_handshake_logging_value, logging2.network_node_id_handshake_logging_value);
ASSERT_EQ (logging1.node_lifetime_tracing_value, logging2.node_lifetime_tracing_value);
ASSERT_EQ (logging1.insufficient_work_logging_value, logging2.insufficient_work_logging_value);
ASSERT_EQ (logging1.log_rpc_value, logging2.log_rpc_value);
ASSERT_EQ (logging1.bulk_pull_logging_value, logging2.bulk_pull_logging_value);
ASSERT_EQ (logging1.work_generation_time_value, logging2.work_generation_time_value);
ASSERT_EQ (logging1.log_to_cerr_value, logging2.log_to_cerr_value);
ASSERT_EQ (logging1.max_size, logging2.max_size);
ASSERT_EQ (logging1.min_time_between_log_output, logging2.min_time_between_log_output);
}
TEST (logging, upgrade_v1_v2)
{
auto path1 (nano::unique_path ());
auto path2 (nano::unique_path ());
nano::logging logging1;
logging1.init (path1);
nano::logging logging2;
logging2.init (path2);
nano::jsonconfig tree;
logging1.serialize_json (tree);
tree.erase ("version");
tree.erase ("vote");
bool upgraded (false);
ASSERT_FALSE (logging2.deserialize_json (upgraded, tree));
ASSERT_LE (2, tree.get<int> ("version"));
ASSERT_FALSE (tree.get<bool> ("vote"));
}
TEST (logging, upgrade_v6_v7)
{
auto path1 (nano::unique_path ());
auto path2 (nano::unique_path ());
nano::logging logging1;
logging1.init (path1);
nano::logging logging2;
logging2.init (path2);
nano::jsonconfig tree;
logging1.serialize_json (tree);
tree.erase ("version");
tree.erase ("min_time_between_output");
bool upgraded (false);
ASSERT_FALSE (logging2.deserialize_json (upgraded, tree));
ASSERT_TRUE (upgraded);
ASSERT_LE (7, tree.get<int> ("version"));
ASSERT_EQ (5, tree.get<uintmax_t> ("min_time_between_output"));
}
TEST (logger, changing_time_interval)
{
auto path1 (nano::unique_path ());
nano::logging logging;
logging.init (path1);
logging.min_time_between_log_output = 0ms;
nano::logger_mt my_logger (logging.min_time_between_log_output);
auto log_path = logging.log_path ();
auto success (my_logger.try_log ("logger.changing_time_interval1"));
ASSERT_TRUE (success);
logging.min_time_between_log_output = 20s;
success = my_logger.try_log ("logger, changing_time_interval2");
ASSERT_FALSE (success);
}
TEST (logger, try_log)
{
auto path1 (nano::unique_path ());
nano::logging logging;
logging.init (path1);
nano::logger_mt my_logger (3ms);
auto output1 = "logger.try_log1";
auto output2 = "logger.try_log2";
auto success (my_logger.try_log (output1));
ASSERT_TRUE (success);
success = my_logger.try_log (output2);
ASSERT_FALSE (success); // Fails as it is occuring too soon
// Sleep for a bit and then confirm
std::this_thread::sleep_for (3ms);
success = my_logger.try_log (output2);
ASSERT_TRUE (success);
auto log_path = logging.log_path ();
auto last_lines = get_last_lines_from_log_file (log_path, 2);
// Remove the timestamp from the line in the log file to make comparisons timestamp independent
ASSERT_STREQ (strip_timestamp (last_lines.front ()).c_str (), output1);
ASSERT_STREQ (strip_timestamp (last_lines.back ()).c_str (), output2);
}
TEST (logger, always_log)
{
auto path1 (nano::unique_path ());
nano::logging logging;
logging.init (path1);
nano::logger_mt my_logger (20s); // Make time interval effectively unreachable
auto output1 = "logger.always_log1";
auto success (my_logger.try_log (output1));
ASSERT_TRUE (success);
// Time is too soon after, so it won't be logged
auto output2 = "logger.always_log2";
success = my_logger.try_log (output2);
ASSERT_FALSE (success);
// Force it to be logged
my_logger.always_log (output2);
// Now check
auto log_path = logging.log_path ();
auto last_lines = get_last_lines_from_log_file (log_path, 2);
ASSERT_STREQ (strip_timestamp (last_lines.front ()).c_str (), output1);
ASSERT_STREQ (strip_timestamp (last_lines.back ()).c_str (), output2);
}
namespace
{
std::string strip_timestamp (const std::string & line)
{
std::regex line_regex (".+\\]: (.+)");
return std::regex_replace (line, line_regex, "$1");
}
std::vector<std::string> get_last_lines_from_log_file (const std::string & log_path, unsigned count)
{
assert (count > 0);
boost::filesystem::directory_iterator it{ log_path };
auto log_file = it->path ();
std::ifstream in_file (log_file.c_str ());
std::vector<std::string> v (count);
for (std::string line; std::getline (in_file, line);)
{
std::string next_line;
if (!std::getline (in_file, next_line))
{
// Already reached last line so shift others to the left and update last line
std::rotate (v.begin (), v.begin () + 1, v.end ());
v.back () = std::move (line);
}
else
{
if (count == 1)
{
v.front () = next_line;
}
else if (count > 1)
{
v.front () = line;
v[1] = next_line;
for (unsigned i = 0; i < count - 2; ++i)
{
std::getline (in_file, v[i + 2]);
}
}
}
}
return v;
}
}

View file

@ -421,68 +421,6 @@ TEST (node, working)
ASSERT_FALSE (path.empty ()); ASSERT_FALSE (path.empty ());
} }
TEST (logging, serialization)
{
auto path (nano::unique_path ());
nano::logging logging1;
logging1.init (path);
logging1.ledger_logging_value = !logging1.ledger_logging_value;
logging1.ledger_duplicate_logging_value = !logging1.ledger_duplicate_logging_value;
logging1.network_logging_value = !logging1.network_logging_value;
logging1.network_message_logging_value = !logging1.network_message_logging_value;
logging1.network_publish_logging_value = !logging1.network_publish_logging_value;
logging1.network_packet_logging_value = !logging1.network_packet_logging_value;
logging1.network_keepalive_logging_value = !logging1.network_keepalive_logging_value;
logging1.network_node_id_handshake_logging_value = !logging1.network_node_id_handshake_logging_value;
logging1.node_lifetime_tracing_value = !logging1.node_lifetime_tracing_value;
logging1.insufficient_work_logging_value = !logging1.insufficient_work_logging_value;
logging1.log_rpc_value = !logging1.log_rpc_value;
logging1.bulk_pull_logging_value = !logging1.bulk_pull_logging_value;
logging1.work_generation_time_value = !logging1.work_generation_time_value;
logging1.log_to_cerr_value = !logging1.log_to_cerr_value;
logging1.max_size = 10;
nano::jsonconfig tree;
logging1.serialize_json (tree);
nano::logging logging2;
logging2.init (path);
bool upgraded (false);
ASSERT_FALSE (logging2.deserialize_json (upgraded, tree));
ASSERT_FALSE (upgraded);
ASSERT_EQ (logging1.ledger_logging_value, logging2.ledger_logging_value);
ASSERT_EQ (logging1.ledger_duplicate_logging_value, logging2.ledger_duplicate_logging_value);
ASSERT_EQ (logging1.network_logging_value, logging2.network_logging_value);
ASSERT_EQ (logging1.network_message_logging_value, logging2.network_message_logging_value);
ASSERT_EQ (logging1.network_publish_logging_value, logging2.network_publish_logging_value);
ASSERT_EQ (logging1.network_packet_logging_value, logging2.network_packet_logging_value);
ASSERT_EQ (logging1.network_keepalive_logging_value, logging2.network_keepalive_logging_value);
ASSERT_EQ (logging1.network_node_id_handshake_logging_value, logging2.network_node_id_handshake_logging_value);
ASSERT_EQ (logging1.node_lifetime_tracing_value, logging2.node_lifetime_tracing_value);
ASSERT_EQ (logging1.insufficient_work_logging_value, logging2.insufficient_work_logging_value);
ASSERT_EQ (logging1.log_rpc_value, logging2.log_rpc_value);
ASSERT_EQ (logging1.bulk_pull_logging_value, logging2.bulk_pull_logging_value);
ASSERT_EQ (logging1.work_generation_time_value, logging2.work_generation_time_value);
ASSERT_EQ (logging1.log_to_cerr_value, logging2.log_to_cerr_value);
ASSERT_EQ (logging1.max_size, logging2.max_size);
}
TEST (logging, upgrade_v1_v2)
{
auto path1 (nano::unique_path ());
auto path2 (nano::unique_path ());
nano::logging logging1;
logging1.init (path1);
nano::logging logging2;
logging2.init (path2);
nano::jsonconfig tree;
logging1.serialize_json (tree);
tree.erase ("version");
tree.erase ("vote");
bool upgraded (false);
ASSERT_FALSE (logging2.deserialize_json (upgraded, tree));
ASSERT_LE (2, tree.get<int> ("version"));
ASSERT_FALSE (tree.get<bool> ("vote"));
}
TEST (node, price) TEST (node, price)
{ {
nano::system system (24000, 1); nano::system system (24000, 1);

View file

@ -77,7 +77,7 @@ void nano::block_processor::add (nano::unchecked_info const & info_a)
} }
else else
{ {
BOOST_LOG (node.log) << "nano::block_processor::add called for hash " << info_a.block->hash ().to_string () << " with invalid work " << nano::to_string_hex (info_a.block->block_work ()); node.logger.try_log ("nano::block_processor::add called for hash ", info_a.block->hash ().to_string (), " with invalid work ", nano::to_string_hex (info_a.block->block_work ()));
assert (false && "nano::block_processor::add called with invalid work"); assert (false && "nano::block_processor::add called with invalid work");
} }
} }
@ -216,7 +216,7 @@ void nano::block_processor::verify_state_blocks (nano::transaction const & trans
} }
if (node.config.logging.timing_logging ()) if (node.config.logging.timing_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Batch verified %1% state blocks in %2% %3%") % size % timer_l.stop ().count () % timer_l.unit ()); node.logger.try_log (boost::str (boost::format ("Batch verified %1% state blocks in %2% %3%") % size % timer_l.stop ().count () % timer_l.unit ()));
} }
} }
else else
@ -268,7 +268,7 @@ void nano::block_processor::process_batch (std::unique_lock<std::mutex> & lock_a
if (log_this_record) if (log_this_record)
{ {
first_time = false; first_time = false;
BOOST_LOG (node.log) << boost::str (boost::format ("%1% blocks (+ %2% state blocks) (+ %3% forced) in processing queue") % blocks.size () % state_blocks.size () % forced.size ()); node.logger.try_log (boost::str (boost::format ("%1% blocks (+ %2% state blocks) (+ %3% forced) in processing queue") % blocks.size () % state_blocks.size () % forced.size ()));
} }
nano::unchecked_info info; nano::unchecked_info info;
bool force (false); bool force (false);
@ -293,10 +293,10 @@ void nano::block_processor::process_batch (std::unique_lock<std::mutex> & lock_a
if (successor != nullptr && successor->hash () != hash) if (successor != nullptr && successor->hash () != hash)
{ {
// Replace our block with the winner and roll back any dependent blocks // Replace our block with the winner and roll back any dependent blocks
BOOST_LOG (node.log) << boost::str (boost::format ("Rolling back %1% and replacing with %2%") % successor->hash ().to_string () % hash.to_string ()); node.logger.always_log (boost::str (boost::format ("Rolling back %1% and replacing with %2%") % successor->hash ().to_string () % hash.to_string ()));
std::vector<nano::block_hash> rollback_list; std::vector<nano::block_hash> rollback_list;
node.ledger.rollback (transaction, successor->hash (), rollback_list); node.ledger.rollback (transaction, successor->hash (), rollback_list);
BOOST_LOG (node.log) << boost::str (boost::format ("%1% blocks rolled back") % rollback_list.size ()); node.logger.always_log (boost::str (boost::format ("%1% blocks rolled back") % rollback_list.size ()));
lock_a.lock (); lock_a.lock ();
// Prevent rolled back blocks second insertion // Prevent rolled back blocks second insertion
auto inserted (rolled_back.insert (nano::rolled_hash{ std::chrono::steady_clock::now (), successor->hash () })); auto inserted (rolled_back.insert (nano::rolled_hash{ std::chrono::steady_clock::now (), successor->hash () }));
@ -333,7 +333,7 @@ void nano::block_processor::process_batch (std::unique_lock<std::mutex> & lock_a
if (node.config.logging.timing_logging ()) if (node.config.logging.timing_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Processed %1% blocks (%2% blocks were forced) in %3% %4%") % number_of_blocks_processed % number_of_forced_processed % timer_l.stop ().count () % timer_l.unit ()); node.logger.always_log (boost::str (boost::format ("Processed %1% blocks (%2% blocks were forced) in %3% %4%") % number_of_blocks_processed % number_of_forced_processed % timer_l.stop ().count () % timer_l.unit ()));
} }
} }
@ -386,7 +386,7 @@ nano::process_return nano::block_processor::process_one (nano::transaction const
{ {
std::string block; std::string block;
info_a.block->serialize_json (block); info_a.block->serialize_json (block);
BOOST_LOG (node.log) << boost::str (boost::format ("Processing block %1%: %2%") % hash.to_string () % block); node.logger.try_log (boost::str (boost::format ("Processing block %1%: %2%") % hash.to_string () % block));
} }
if (info_a.modified > nano::seconds_since_epoch () - 300 && node.block_arrival.recent (hash)) if (info_a.modified > nano::seconds_since_epoch () - 300 && node.block_arrival.recent (hash))
{ {
@ -399,7 +399,7 @@ nano::process_return nano::block_processor::process_one (nano::transaction const
{ {
if (node.config.logging.ledger_logging ()) if (node.config.logging.ledger_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Gap previous for: %1%") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Gap previous for: %1%") % hash.to_string ()));
} }
info_a.verified = result.verified; info_a.verified = result.verified;
if (info_a.modified == 0) if (info_a.modified == 0)
@ -414,7 +414,7 @@ nano::process_return nano::block_processor::process_one (nano::transaction const
{ {
if (node.config.logging.ledger_logging ()) if (node.config.logging.ledger_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Gap source for: %1%") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Gap source for: %1%") % hash.to_string ()));
} }
info_a.verified = result.verified; info_a.verified = result.verified;
if (info_a.modified == 0) if (info_a.modified == 0)
@ -429,7 +429,7 @@ nano::process_return nano::block_processor::process_one (nano::transaction const
{ {
if (node.config.logging.ledger_duplicate_logging ()) if (node.config.logging.ledger_duplicate_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Old for: %1%") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Old for: %1%") % hash.to_string ()));
} }
if (!node.flags.fast_bootstrap) if (!node.flags.fast_bootstrap)
{ {
@ -442,7 +442,7 @@ nano::process_return nano::block_processor::process_one (nano::transaction const
{ {
if (node.config.logging.ledger_logging ()) if (node.config.logging.ledger_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Bad signature for: %1%") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Bad signature for: %1%") % hash.to_string ()));
} }
break; break;
} }
@ -450,7 +450,7 @@ nano::process_return nano::block_processor::process_one (nano::transaction const
{ {
if (node.config.logging.ledger_logging ()) if (node.config.logging.ledger_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Negative spend for: %1%") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Negative spend for: %1%") % hash.to_string ()));
} }
break; break;
} }
@ -458,7 +458,7 @@ nano::process_return nano::block_processor::process_one (nano::transaction const
{ {
if (node.config.logging.ledger_logging ()) if (node.config.logging.ledger_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Unreceivable for: %1%") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Unreceivable for: %1%") % hash.to_string ()));
} }
break; break;
} }
@ -472,20 +472,20 @@ nano::process_return nano::block_processor::process_one (nano::transaction const
} }
if (node.config.logging.ledger_logging ()) if (node.config.logging.ledger_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Fork for: %1% root: %2%") % hash.to_string () % info_a.block->root ().to_string ()); node.logger.try_log (boost::str (boost::format ("Fork for: %1% root: %2%") % hash.to_string () % info_a.block->root ().to_string ()));
} }
break; break;
} }
case nano::process_result::opened_burn_account: case nano::process_result::opened_burn_account:
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("*** Rejecting open block for burn account ***: %1%") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("*** Rejecting open block for burn account ***: %1%") % hash.to_string ()));
break; break;
} }
case nano::process_result::balance_mismatch: case nano::process_result::balance_mismatch:
{ {
if (node.config.logging.ledger_logging ()) if (node.config.logging.ledger_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Balance mismatch for: %1%") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Balance mismatch for: %1%") % hash.to_string ()));
} }
break; break;
} }
@ -493,7 +493,7 @@ nano::process_return nano::block_processor::process_one (nano::transaction const
{ {
if (node.config.logging.ledger_logging ()) if (node.config.logging.ledger_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Representative mismatch for: %1%") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Representative mismatch for: %1%") % hash.to_string ()));
} }
break; break;
} }
@ -501,7 +501,7 @@ nano::process_return nano::block_processor::process_one (nano::transaction const
{ {
if (node.config.logging.ledger_logging ()) if (node.config.logging.ledger_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Block %1% cannot follow predecessor %2%") % hash.to_string () % info_a.block->previous ().to_string ()); node.logger.try_log (boost::str (boost::format ("Block %1% cannot follow predecessor %2%") % hash.to_string () % info_a.block->previous ().to_string ()));
} }
break; break;
} }

View file

@ -101,7 +101,7 @@ void nano::socket::checkup ()
{ {
if (this_l->node->config.logging.bulk_pull_logging ()) if (this_l->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (this_l->node->log) << boost::str (boost::format ("Disconnecting from %1% due to timeout") % this_l->remote_endpoint ()); this_l->node->logger.try_log (boost::str (boost::format ("Disconnecting from %1% due to timeout") % this_l->remote_endpoint ()));
} }
this_l->close (); this_l->close ();
} }
@ -175,7 +175,7 @@ void nano::bootstrap_client::run ()
{ {
if (this_l->node->config.logging.bulk_pull_logging ()) if (this_l->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (this_l->node->log) << boost::str (boost::format ("Connection established to %1%") % this_l->endpoint); this_l->node->logger.try_log (boost::str (boost::format ("Connection established to %1%") % this_l->endpoint));
} }
this_l->attempt->pool_connection (this_l->shared_from_this ()); this_l->attempt->pool_connection (this_l->shared_from_this ());
} }
@ -186,7 +186,7 @@ void nano::bootstrap_client::run ()
switch (ec.value ()) switch (ec.value ())
{ {
default: default:
BOOST_LOG (this_l->node->log) << boost::str (boost::format ("Error initiating bootstrap connection to %1%: %2%") % this_l->endpoint % ec.message ()); this_l->node->logger.try_log (boost::str (boost::format ("Error initiating bootstrap connection to %1%: %2%") % this_l->endpoint % ec.message ()));
break; break;
case boost::system::errc::connection_refused: case boost::system::errc::connection_refused:
case boost::system::errc::operation_canceled: case boost::system::errc::operation_canceled:
@ -221,7 +221,7 @@ void nano::frontier_req_client::run ()
{ {
if (this_l->connection->node->config.logging.network_logging ()) if (this_l->connection->node->config.logging.network_logging ())
{ {
BOOST_LOG (this_l->connection->node->log) << boost::str (boost::format ("Error while sending bootstrap request %1%") % ec.message ()); this_l->connection->node->logger.try_log (boost::str (boost::format ("Error while sending bootstrap request %1%") % ec.message ()));
} }
} }
}); });
@ -260,7 +260,7 @@ void nano::frontier_req_client::receive_frontier ()
{ {
if (this_l->connection->node->config.logging.network_message_logging ()) if (this_l->connection->node->config.logging.network_message_logging ())
{ {
BOOST_LOG (this_l->connection->node->log) << boost::str (boost::format ("Invalid size: expected %1%, got %2%") % nano::frontier_req_client::size_frontier % size_a); this_l->connection->node->logger.try_log (boost::str (boost::format ("Invalid size: expected %1%, got %2%") % nano::frontier_req_client::size_frontier % size_a));
} }
} }
}); });
@ -306,13 +306,13 @@ void nano::frontier_req_client::received_frontier (boost::system::error_code con
double blocks_per_sec = static_cast<double> (count) / elapsed_sec; double blocks_per_sec = static_cast<double> (count) / elapsed_sec;
if (elapsed_sec > bootstrap_connection_warmup_time_sec && blocks_per_sec < bootstrap_minimum_frontier_blocks_per_sec) if (elapsed_sec > bootstrap_connection_warmup_time_sec && blocks_per_sec < bootstrap_minimum_frontier_blocks_per_sec)
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Aborting frontier req because it was too slow")); connection->node->logger.try_log (boost::str (boost::format ("Aborting frontier req because it was too slow")));
promise.set_value (true); promise.set_value (true);
return; return;
} }
if (connection->attempt->should_log ()) if (connection->attempt->should_log ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Received %1% frontiers from %2%") % std::to_string (count) % connection->socket->remote_endpoint ()); connection->node->logger.try_log (boost::str (boost::format ("Received %1% frontiers from %2%") % std::to_string (count) % connection->socket->remote_endpoint ()));
} }
auto transaction (connection->node->store.tx_begin_read ()); auto transaction (connection->node->store.tx_begin_read ());
if (!account.is_zero ()) if (!account.is_zero ())
@ -370,7 +370,7 @@ void nano::frontier_req_client::received_frontier (boost::system::error_code con
} }
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << "Bulk push cost: " << bulk_push_cost; connection->node->logger.try_log ("Bulk push cost: ", bulk_push_cost);
} }
{ {
try try
@ -388,7 +388,7 @@ void nano::frontier_req_client::received_frontier (boost::system::error_code con
{ {
if (connection->node->config.logging.network_logging ()) if (connection->node->config.logging.network_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Error while receiving frontier %1%") % ec.message ()); connection->node->logger.try_log (boost::str (boost::format ("Error while receiving frontier %1%") % ec.message ()));
} }
} }
} }
@ -442,7 +442,7 @@ nano::bulk_pull_client::~bulk_pull_client ()
connection->attempt->requeue_pull (pull); connection->attempt->requeue_pull (pull);
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Bulk pull end block is not expected %1% for account %2%") % pull.end.to_string () % pull.account.to_account ()); connection->node->logger.try_log (boost::str (boost::format ("Bulk pull end block is not expected %1% for account %2%") % pull.end.to_string () % pull.account.to_account ()));
} }
} }
{ {
@ -469,12 +469,12 @@ void nano::bulk_pull_client::request ()
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
std::unique_lock<std::mutex> lock (connection->attempt->mutex); std::unique_lock<std::mutex> lock (connection->attempt->mutex);
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Requesting account %1% from %2%. %3% accounts in queue") % req.start.to_account () % connection->endpoint % connection->attempt->pulls.size ()); connection->node->logger.try_log (boost::str (boost::format ("Requesting account %1% from %2%. %3% accounts in queue") % req.start.to_account () % connection->endpoint % connection->attempt->pulls.size ()));
} }
else if (connection->node->config.logging.network_logging () && connection->attempt->should_log ()) else if (connection->node->config.logging.network_logging () && connection->attempt->should_log ())
{ {
std::unique_lock<std::mutex> lock (connection->attempt->mutex); std::unique_lock<std::mutex> lock (connection->attempt->mutex);
BOOST_LOG (connection->node->log) << boost::str (boost::format ("%1% accounts in pull queue") % connection->attempt->pulls.size ()); connection->node->logger.try_log (boost::str (boost::format ("%1% accounts in pull queue") % connection->attempt->pulls.size ()));
} }
auto this_l (shared_from_this ()); auto this_l (shared_from_this ());
connection->socket->async_write (buffer, [this_l](boost::system::error_code const & ec, size_t size_a) { connection->socket->async_write (buffer, [this_l](boost::system::error_code const & ec, size_t size_a) {
@ -486,7 +486,7 @@ void nano::bulk_pull_client::request ()
{ {
if (this_l->connection->node->config.logging.bulk_pull_logging ()) if (this_l->connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (this_l->connection->node->log) << boost::str (boost::format ("Error sending bulk pull request to %1%: to %2%") % ec.message () % this_l->connection->endpoint); this_l->connection->node->logger.try_log (boost::str (boost::format ("Error sending bulk pull request to %1%: to %2%") % ec.message () % this_l->connection->endpoint));
} }
} }
}); });
@ -504,7 +504,7 @@ void nano::bulk_pull_client::receive_block ()
{ {
if (this_l->connection->node->config.logging.bulk_pull_logging ()) if (this_l->connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (this_l->connection->node->log) << boost::str (boost::format ("Error receiving block type: %1%") % ec.message ()); this_l->connection->node->logger.try_log (boost::str (boost::format ("Error receiving block type: %1%") % ec.message ()));
} }
} }
}); });
@ -564,7 +564,7 @@ void nano::bulk_pull_client::received_type ()
{ {
if (connection->node->config.logging.network_packet_logging ()) if (connection->node->config.logging.network_packet_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Unknown type received as block type: %1%") % static_cast<int> (type)); connection->node->logger.try_log (boost::str (boost::format ("Unknown type received as block type: %1%") % static_cast<int> (type)));
} }
break; break;
} }
@ -584,7 +584,7 @@ void nano::bulk_pull_client::received_block (boost::system::error_code const & e
{ {
std::string block_l; std::string block_l;
block->serialize_json (block_l); block->serialize_json (block_l);
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Pulled block %1% %2%") % hash.to_string () % block_l); connection->node->logger.try_log (boost::str (boost::format ("Pulled block %1% %2%") % hash.to_string () % block_l));
} }
// Is block expected? // Is block expected?
bool block_expected (false); bool block_expected (false);
@ -632,7 +632,7 @@ void nano::bulk_pull_client::received_block (boost::system::error_code const & e
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << "Error deserializing block received from pull request"; connection->node->logger.try_log ("Error deserializing block received from pull request");
} }
} }
} }
@ -640,7 +640,7 @@ void nano::bulk_pull_client::received_block (boost::system::error_code const & e
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Error bulk receiving block: %1%") % ec.message ()); connection->node->logger.try_log (boost::str (boost::format ("Error bulk receiving block: %1%") % ec.message ()));
} }
} }
} }
@ -673,7 +673,7 @@ void nano::bulk_push_client::start ()
{ {
if (this_l->connection->node->config.logging.bulk_pull_logging ()) if (this_l->connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (this_l->connection->node->log) << boost::str (boost::format ("Unable to send bulk_push request: %1%") % ec.message ()); this_l->connection->node->logger.try_log (boost::str (boost::format ("Unable to send bulk_push request: %1%") % ec.message ()));
} }
} }
}); });
@ -709,7 +709,7 @@ void nano::bulk_push_client::push (nano::transaction const & transaction_a)
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << "Bulk pushing range " << current_target.first.to_string () << " down to " << current_target.second.to_string (); connection->node->logger.try_log ("Bulk pushing range ", current_target.first.to_string (), " down to ", current_target.second.to_string ());
} }
} }
} }
@ -732,7 +732,7 @@ void nano::bulk_push_client::send_finished ()
connection->node->stats.inc (nano::stat::type::bootstrap, nano::stat::detail::bulk_push, nano::stat::dir::out); connection->node->stats.inc (nano::stat::type::bootstrap, nano::stat::detail::bulk_push, nano::stat::dir::out);
if (connection->node->config.logging.network_logging ()) if (connection->node->config.logging.network_logging ())
{ {
BOOST_LOG (connection->node->log) << "Bulk push finished"; connection->node->logger.try_log ("Bulk push finished");
} }
auto this_l (shared_from_this ()); auto this_l (shared_from_this ());
connection->socket->async_write (buffer, [this_l](boost::system::error_code const & ec, size_t size_a) { connection->socket->async_write (buffer, [this_l](boost::system::error_code const & ec, size_t size_a) {
@ -764,7 +764,7 @@ void nano::bulk_push_client::push_block (nano::block const & block_a)
{ {
if (this_l->connection->node->config.logging.bulk_pull_logging ()) if (this_l->connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (this_l->connection->node->log) << boost::str (boost::format ("Error sending block during bulk push: %1%") % ec.message ()); this_l->connection->node->logger.try_log (boost::str (boost::format ("Error sending block during bulk push: %1%") % ec.message ()));
} }
} }
}); });
@ -802,12 +802,12 @@ void nano::bulk_pull_account_client::request ()
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
std::unique_lock<std::mutex> lock (connection->attempt->mutex); std::unique_lock<std::mutex> lock (connection->attempt->mutex);
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Requesting pending for account %1% from %2%. %3% accounts in queue") % req.account.to_account () % connection->endpoint % connection->attempt->wallet_accounts.size ()); connection->node->logger.try_log (boost::str (boost::format ("Requesting pending for account %1% from %2%. %3% accounts in queue") % req.account.to_account () % connection->endpoint % connection->attempt->wallet_accounts.size ()));
} }
else if (connection->node->config.logging.network_logging () && connection->attempt->should_log ()) else if (connection->node->config.logging.network_logging () && connection->attempt->should_log ())
{ {
std::unique_lock<std::mutex> lock (connection->attempt->mutex); std::unique_lock<std::mutex> lock (connection->attempt->mutex);
BOOST_LOG (connection->node->log) << boost::str (boost::format ("%1% accounts in pull queue") % connection->attempt->wallet_accounts.size ()); connection->node->logger.try_log (boost::str (boost::format ("%1% accounts in pull queue") % connection->attempt->wallet_accounts.size ()));
} }
auto this_l (shared_from_this ()); auto this_l (shared_from_this ());
connection->socket->async_write (buffer, [this_l](boost::system::error_code const & ec, size_t size_a) { connection->socket->async_write (buffer, [this_l](boost::system::error_code const & ec, size_t size_a) {
@ -820,7 +820,7 @@ void nano::bulk_pull_account_client::request ()
this_l->connection->attempt->requeue_pending (this_l->account); this_l->connection->attempt->requeue_pending (this_l->account);
if (this_l->connection->node->config.logging.bulk_pull_logging ()) if (this_l->connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (this_l->connection->node->log) << boost::str (boost::format ("Error starting bulk pull request to %1%: to %2%") % ec.message () % this_l->connection->endpoint); this_l->connection->node->logger.try_log (boost::str (boost::format ("Error starting bulk pull request to %1%: to %2%") % ec.message () % this_l->connection->endpoint));
} }
} }
}); });
@ -877,7 +877,7 @@ void nano::bulk_pull_account_client::receive_pending ()
this_l->connection->attempt->requeue_pending (this_l->account); this_l->connection->attempt->requeue_pending (this_l->account);
if (this_l->connection->node->config.logging.network_logging ()) if (this_l->connection->node->config.logging.network_logging ())
{ {
BOOST_LOG (this_l->connection->node->log) << boost::str (boost::format ("Error while receiving bulk pull account frontier %1%") % ec.message ()); this_l->connection->node->logger.try_log (boost::str (boost::format ("Error while receiving bulk pull account frontier %1%") % ec.message ()));
} }
} }
} }
@ -886,7 +886,7 @@ void nano::bulk_pull_account_client::receive_pending ()
this_l->connection->attempt->requeue_pending (this_l->account); this_l->connection->attempt->requeue_pending (this_l->account);
if (this_l->connection->node->config.logging.network_message_logging ()) if (this_l->connection->node->config.logging.network_message_logging ())
{ {
BOOST_LOG (this_l->connection->node->log) << boost::str (boost::format ("Invalid size: expected %1%, got %2%") % size_l % size_a); this_l->connection->node->logger.try_log (boost::str (boost::format ("Invalid size: expected %1%, got %2%") % size_l % size_a));
} }
} }
}); });
@ -921,13 +921,13 @@ stopped (false),
mode (nano::bootstrap_mode::legacy), mode (nano::bootstrap_mode::legacy),
lazy_stopped (0) lazy_stopped (0)
{ {
BOOST_LOG (node->log) << "Starting bootstrap attempt"; node->logger.always_log ("Starting bootstrap attempt");
node->bootstrap_initiator.notify_listeners (true); node->bootstrap_initiator.notify_listeners (true);
} }
nano::bootstrap_attempt::~bootstrap_attempt () nano::bootstrap_attempt::~bootstrap_attempt ()
{ {
BOOST_LOG (node->log) << "Exiting bootstrap attempt"; node->logger.always_log ("Exiting bootstrap attempt");
node->bootstrap_initiator.notify_listeners (false); node->bootstrap_initiator.notify_listeners (false);
} }
@ -969,11 +969,11 @@ bool nano::bootstrap_attempt::request_frontier (std::unique_lock<std::mutex> & l
{ {
if (!result) if (!result)
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Completed frontier request, %1% out of sync accounts according to %2%") % pulls.size () % connection_l->endpoint); node->logger.try_log (boost::str (boost::format ("Completed frontier request, %1% out of sync accounts according to %2%") % pulls.size () % connection_l->endpoint));
} }
else else
{ {
BOOST_LOG (node->log) << "frontier_req failed, reattempting"; node->logger.try_log ("frontier_req failed, reattempting");
} }
} }
} }
@ -1026,10 +1026,10 @@ void nano::bootstrap_attempt::request_push (std::unique_lock<std::mutex> & lock_
} }
if (node->config.logging.network_logging ()) if (node->config.logging.network_logging ())
{ {
BOOST_LOG (node->log) << "Exiting bulk push client"; node->logger.try_log ("Exiting bulk push client");
if (error) if (error)
{ {
BOOST_LOG (node->log) << "Bulk push client failed"; node->logger.try_log ("Bulk push client failed");
} }
} }
} }
@ -1083,15 +1083,15 @@ void nano::bootstrap_attempt::run ()
} }
} }
// Flushing may resolve forks which can add more pulls // Flushing may resolve forks which can add more pulls
BOOST_LOG (node->log) << "Flushing unchecked blocks"; node->logger.try_log ("Flushing unchecked blocks");
lock.unlock (); lock.unlock ();
node->block_processor.flush (); node->block_processor.flush ();
lock.lock (); lock.lock ();
BOOST_LOG (node->log) << "Finished flushing unchecked blocks"; node->logger.try_log ("Finished flushing unchecked blocks");
} }
if (!stopped) if (!stopped)
{ {
BOOST_LOG (node->log) << "Completed pulls"; node->logger.try_log ("Completed pulls");
request_push (lock); request_push (lock);
runs_count++; runs_count++;
// Start wallet lazy bootstrap if required // Start wallet lazy bootstrap if required
@ -1199,7 +1199,7 @@ void nano::bootstrap_attempt::populate_connections ()
{ {
if (node->config.logging.bulk_pull_logging ()) if (node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Stopping slow peer %1% (elapsed sec %2%s > %3%s and %4% blocks per second < %5%)") % client->endpoint.address ().to_string () % elapsed_sec % bootstrap_minimum_termination_time_sec % blocks_per_sec % bootstrap_minimum_blocks_per_sec); node->logger.try_log (boost::str (boost::format ("Stopping slow peer %1% (elapsed sec %2%s > %3%s and %4% blocks per second < %5%)") % client->endpoint.address ().to_string () % elapsed_sec % bootstrap_minimum_termination_time_sec % blocks_per_sec % bootstrap_minimum_blocks_per_sec));
} }
client->stop (true); client->stop (true);
@ -1221,7 +1221,7 @@ void nano::bootstrap_attempt::populate_connections ()
if (node->config.logging.bulk_pull_logging ()) if (node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Dropping %1% bulk pull peers, target connections %2%") % drop % target); node->logger.try_log (boost::str (boost::format ("Dropping %1% bulk pull peers, target connections %2%") % drop % target));
} }
for (int i = 0; i < drop; i++) for (int i = 0; i < drop; i++)
@ -1230,7 +1230,7 @@ void nano::bootstrap_attempt::populate_connections ()
if (node->config.logging.bulk_pull_logging ()) if (node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Dropping peer with block rate %1%, block count %2% (%3%) ") % client->block_rate () % client->block_count % client->endpoint.address ().to_string ()); node->logger.try_log (boost::str (boost::format ("Dropping peer with block rate %1%, block count %2% (%3%) ") % client->block_rate () % client->block_count % client->endpoint.address ().to_string ()));
} }
client->stop (false); client->stop (false);
@ -1241,7 +1241,7 @@ void nano::bootstrap_attempt::populate_connections ()
if (node->config.logging.bulk_pull_logging ()) if (node->config.logging.bulk_pull_logging ())
{ {
std::unique_lock<std::mutex> lock (mutex); std::unique_lock<std::mutex> lock (mutex);
BOOST_LOG (node->log) << boost::str (boost::format ("Bulk pull connections: %1%, rate: %2% blocks/sec, remaining account pulls: %3%, total blocks: %4%") % connections.load () % (int)rate_sum % pulls.size () % (int)total_blocks.load ()); node->logger.try_log (boost::str (boost::format ("Bulk pull connections: %1%, rate: %2% blocks/sec, remaining account pulls: %3%, total blocks: %4%") % connections.load () % (int)rate_sum % pulls.size () % (int)total_blocks.load ()));
} }
if (connections < target) if (connections < target)
@ -1263,7 +1263,7 @@ void nano::bootstrap_attempt::populate_connections ()
} }
else if (connections == 0) else if (connections == 0)
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Bootstrap stopped because there are no peers")); node->logger.try_log (boost::str (boost::format ("Bootstrap stopped because there are no peers")));
stopped = true; stopped = true;
condition.notify_all (); condition.notify_all ();
} }
@ -1365,7 +1365,7 @@ void nano::bootstrap_attempt::requeue_pull (nano::pull_info const & pull_a)
{ {
if (node->config.logging.bulk_pull_logging ()) if (node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Failed to pull account %1% down to %2% after %3% attempts") % pull.account.to_account () % pull.end.to_string () % pull.attempts); node->logger.try_log (boost::str (boost::format ("Failed to pull account %1% down to %2% after %3% attempts") % pull.account.to_account () % pull.end.to_string () % pull.attempts));
} }
} }
} }
@ -1493,7 +1493,7 @@ void nano::bootstrap_attempt::lazy_run ()
} }
if (!stopped) if (!stopped)
{ {
BOOST_LOG (node->log) << "Completed lazy pulls"; node->logger.try_log ("Completed lazy pulls");
std::unique_lock<std::mutex> lazy_lock (lazy_mutex); std::unique_lock<std::mutex> lazy_lock (lazy_mutex);
runs_count++; runs_count++;
// Start wallet lazy bootstrap if required // Start wallet lazy bootstrap if required
@ -1741,7 +1741,7 @@ void nano::bootstrap_attempt::wallet_run ()
} }
if (!stopped) if (!stopped)
{ {
BOOST_LOG (node->log) << "Completed wallet lazy pulls"; node->logger.try_log ("Completed wallet lazy pulls");
runs_count++; runs_count++;
// Start lazy bootstrap if some lazy keys were inserted // Start lazy bootstrap if some lazy keys were inserted
if (!lazy_finished ()) if (!lazy_finished ())
@ -1946,7 +1946,7 @@ void nano::bootstrap_listener::start ()
acceptor.bind (local, ec); acceptor.bind (local, ec);
if (ec) if (ec)
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Error while binding for bootstrap on port %1%: %2%") % local.port () % ec.message ()); node.logger.try_log (boost::str (boost::format ("Error while binding for bootstrap on port %1%: %2%") % local.port () % ec.message ()));
throw std::runtime_error (ec.message ()); throw std::runtime_error (ec.message ());
} }
@ -1986,7 +1986,7 @@ void nano::bootstrap_listener::accept_connection ()
} }
else else
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Unable to accept new TCP network sockets (have %1% concurrent connections, limit of %2%), will try to accept again in 1s") % connections.size () % node.config.bootstrap_connections_max); node.logger.try_log (boost::str (boost::format ("Unable to accept new TCP network sockets (have %1% concurrent connections, limit of %2%), will try to accept again in 1s") % connections.size () % node.config.bootstrap_connections_max));
defer_acceptor.expires_after (std::chrono::seconds (1)); defer_acceptor.expires_after (std::chrono::seconds (1));
defer_acceptor.async_wait ([this](const boost::system::error_code & ec) { defer_acceptor.async_wait ([this](const boost::system::error_code & ec) {
/* /*
@ -2021,7 +2021,7 @@ void nano::bootstrap_listener::accept_action (boost::system::error_code const &
} }
else else
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Error while accepting bootstrap connections: %1%") % ec.message ()); node.logger.try_log (boost::str (boost::format ("Error while accepting bootstrap connections: %1%") % ec.message ()));
} }
} }
@ -2051,7 +2051,7 @@ nano::bootstrap_server::~bootstrap_server ()
{ {
if (node->config.logging.bulk_pull_logging ()) if (node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (node->log) << "Exiting bootstrap server"; node->logger.try_log ("Exiting bootstrap server");
} }
std::lock_guard<std::mutex> lock (node->bootstrap.mutex); std::lock_guard<std::mutex> lock (node->bootstrap.mutex);
node->bootstrap.connections.erase (this); node->bootstrap.connections.erase (this);
@ -2131,7 +2131,7 @@ void nano::bootstrap_server::receive_header_action (boost::system::error_code co
{ {
if (node->config.logging.network_logging ()) if (node->config.logging.network_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Received invalid type from bootstrap connection %1%") % static_cast<uint8_t> (header.type)); node->logger.try_log (boost::str (boost::format ("Received invalid type from bootstrap connection %1%") % static_cast<uint8_t> (header.type)));
} }
break; break;
} }
@ -2142,7 +2142,7 @@ void nano::bootstrap_server::receive_header_action (boost::system::error_code co
{ {
if (node->config.logging.bulk_pull_logging ()) if (node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Error while receiving type: %1%") % ec.message ()); node->logger.try_log (boost::str (boost::format ("Error while receiving type: %1%") % ec.message ()));
} }
} }
} }
@ -2158,7 +2158,7 @@ void nano::bootstrap_server::receive_bulk_pull_action (boost::system::error_code
{ {
if (node->config.logging.bulk_pull_logging ()) if (node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Received bulk pull for %1% down to %2%, maximum of %3%") % request->start.to_string () % request->end.to_string () % (request->count ? request->count : std::numeric_limits<double>::infinity ())); node->logger.try_log (boost::str (boost::format ("Received bulk pull for %1% down to %2%, maximum of %3%") % request->start.to_string () % request->end.to_string () % (request->count ? request->count : std::numeric_limits<double>::infinity ())));
} }
add_request (std::unique_ptr<nano::message> (request.release ())); add_request (std::unique_ptr<nano::message> (request.release ()));
receive (); receive ();
@ -2178,7 +2178,7 @@ void nano::bootstrap_server::receive_bulk_pull_account_action (boost::system::er
{ {
if (node->config.logging.bulk_pull_logging ()) if (node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Received bulk pull account for %1% with a minimum amount of %2%") % request->account.to_account () % nano::amount (request->minimum_amount).format_balance (nano::Mxrb_ratio, 10, true)); node->logger.try_log (boost::str (boost::format ("Received bulk pull account for %1% with a minimum amount of %2%") % request->account.to_account () % nano::amount (request->minimum_amount).format_balance (nano::Mxrb_ratio, 10, true)));
} }
add_request (std::unique_ptr<nano::message> (request.release ())); add_request (std::unique_ptr<nano::message> (request.release ()));
receive (); receive ();
@ -2203,7 +2203,7 @@ void nano::bootstrap_server::receive_keepalive_action (boost::system::error_code
{ {
if (node->config.logging.network_keepalive_logging ()) if (node->config.logging.network_keepalive_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Error receiving keepalive from: %1%") % ec.message ()); node->logger.try_log (boost::str (boost::format ("Error receiving keepalive from: %1%") % ec.message ()));
} }
} }
} }
@ -2219,7 +2219,7 @@ void nano::bootstrap_server::receive_frontier_req_action (boost::system::error_c
{ {
if (node->config.logging.bulk_pull_logging ()) if (node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Received frontier request for %1% with age %2%") % request->start.to_string () % request->age); node->logger.try_log (boost::str (boost::format ("Received frontier request for %1% with age %2%") % request->start.to_string () % request->age));
} }
add_request (std::unique_ptr<nano::message> (request.release ())); add_request (std::unique_ptr<nano::message> (request.release ()));
receive (); receive ();
@ -2229,7 +2229,7 @@ void nano::bootstrap_server::receive_frontier_req_action (boost::system::error_c
{ {
if (node->config.logging.network_logging ()) if (node->config.logging.network_logging ())
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Error sending receiving frontier request: %1%") % ec.message ()); node->logger.try_log (boost::str (boost::format ("Error sending receiving frontier request: %1%") % ec.message ()));
} }
} }
} }
@ -2269,7 +2269,7 @@ public:
{ {
if (connection->node->config.logging.network_keepalive_logging ()) if (connection->node->config.logging.network_keepalive_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Received keepalive message from %1%") % connection->socket->remote_endpoint ()); connection->node->logger.try_log (boost::str (boost::format ("Received keepalive message from %1%") % connection->socket->remote_endpoint ()));
} }
connection->node->stats.inc (nano::stat::type::message, nano::stat::detail::keepalive, nano::stat::dir::in); connection->node->stats.inc (nano::stat::type::message, nano::stat::detail::keepalive, nano::stat::dir::in);
connection->node->network.merge_peers (message_a.peers); connection->node->network.merge_peers (message_a.peers);
@ -2278,14 +2278,14 @@ public:
auto bytes = message.to_bytes (); auto bytes = message.to_bytes ();
if (connection->node->config.logging.network_keepalive_logging ()) if (connection->node->config.logging.network_keepalive_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Keepalive req sent to %1%") % connection->socket->remote_endpoint ()); connection->node->logger.try_log (boost::str (boost::format ("Keepalive req sent to %1%") % connection->socket->remote_endpoint ()));
} }
connection->socket->async_write (bytes, [connection = connection](boost::system::error_code const & ec, size_t size_a) { connection->socket->async_write (bytes, [connection = connection](boost::system::error_code const & ec, size_t size_a) {
if (ec) if (ec)
{ {
if (connection->node->config.logging.network_keepalive_logging ()) if (connection->node->config.logging.network_keepalive_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Error sending keepalive to %1%: %2%") % connection->socket->remote_endpoint () % ec.message ()); connection->node->logger.try_log (boost::str (boost::format ("Error sending keepalive to %1%: %2%") % connection->socket->remote_endpoint () % ec.message ()));
} }
} }
else else
@ -2366,7 +2366,7 @@ void nano::bulk_pull_server::set_current_end ()
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Bulk pull end block doesn't exist: %1%, sending everything") % request->end.to_string ()); connection->node->logger.try_log (boost::str (boost::format ("Bulk pull end block doesn't exist: %1%, sending everything") % request->end.to_string ()));
} }
request->end.clear (); request->end.clear ();
} }
@ -2375,7 +2375,7 @@ void nano::bulk_pull_server::set_current_end ()
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Bulk pull request for block hash: %1%") % request->start.to_string ()); connection->node->logger.try_log (boost::str (boost::format ("Bulk pull request for block hash: %1%") % request->start.to_string ()));
} }
current = request->start; current = request->start;
@ -2389,7 +2389,7 @@ void nano::bulk_pull_server::set_current_end ()
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Request for unknown account: %1%") % request->start.to_account ()); connection->node->logger.try_log (boost::str (boost::format ("Request for unknown account: %1%") % request->start.to_account ()));
} }
current = request->end; current = request->end;
} }
@ -2403,7 +2403,7 @@ void nano::bulk_pull_server::set_current_end ()
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Request for block that is not on account chain: %1% not on %2%") % request->end.to_string () % request->start.to_account ()); connection->node->logger.try_log (boost::str (boost::format ("Request for block that is not on account chain: %1% not on %2%") % request->end.to_string () % request->start.to_account ()));
} }
current = request->end; current = request->end;
} }
@ -2435,7 +2435,7 @@ void nano::bulk_pull_server::send_next ()
auto this_l (shared_from_this ()); auto this_l (shared_from_this ());
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Sending block: %1%") % block->hash ().to_string ()); connection->node->logger.try_log (boost::str (boost::format ("Sending block: %1%") % block->hash ().to_string ()));
} }
connection->socket->async_write (send_buffer, [this_l](boost::system::error_code const & ec, size_t size_a) { connection->socket->async_write (send_buffer, [this_l](boost::system::error_code const & ec, size_t size_a) {
this_l->sent_action (ec, size_a); this_l->sent_action (ec, size_a);
@ -2529,7 +2529,7 @@ void nano::bulk_pull_server::sent_action (boost::system::error_code const & ec,
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Unable to bulk send block: %1%") % ec.message ()); connection->node->logger.try_log (boost::str (boost::format ("Unable to bulk send block: %1%") % ec.message ()));
} }
} }
} }
@ -2541,7 +2541,7 @@ void nano::bulk_pull_server::send_finished ()
auto this_l (shared_from_this ()); auto this_l (shared_from_this ());
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << "Bulk sending finished"; connection->node->logger.try_log ("Bulk sending finished");
} }
connection->socket->async_write (send_buffer, [this_l](boost::system::error_code const & ec, size_t size_a) { connection->socket->async_write (send_buffer, [this_l](boost::system::error_code const & ec, size_t size_a) {
this_l->no_block_sent (ec, size_a); this_l->no_block_sent (ec, size_a);
@ -2559,7 +2559,7 @@ void nano::bulk_pull_server::no_block_sent (boost::system::error_code const & ec
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << "Unable to send not-a-block"; connection->node->logger.try_log ("Unable to send not-a-block");
} }
} }
} }
@ -2605,7 +2605,7 @@ void nano::bulk_pull_account_server::set_params ()
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Invalid bulk_pull_account flags supplied %1%") % static_cast<uint8_t> (request->flags)); connection->node->logger.try_log (boost::str (boost::format ("Invalid bulk_pull_account flags supplied %1%") % static_cast<uint8_t> (request->flags)));
} }
invalid_request = true; invalid_request = true;
@ -2692,7 +2692,7 @@ void nano::bulk_pull_account_server::send_next_block ()
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Sending address: %1%") % block_info->source.to_string ()); connection->node->logger.try_log (boost::str (boost::format ("Sending address: %1%") % block_info->source.to_string ()));
} }
write (output_stream, block_info->source.bytes); write (output_stream, block_info->source.bytes);
@ -2703,7 +2703,7 @@ void nano::bulk_pull_account_server::send_next_block ()
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Sending block: %1%") % block_info_key->hash.to_string ()); connection->node->logger.try_log (boost::str (boost::format ("Sending block: %1%") % block_info_key->hash.to_string ()));
} }
write (output_stream, block_info_key->hash.bytes); write (output_stream, block_info_key->hash.bytes);
@ -2730,7 +2730,7 @@ void nano::bulk_pull_account_server::send_next_block ()
*/ */
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Done sending blocks")); connection->node->logger.try_log (boost::str (boost::format ("Done sending blocks")));
} }
send_finished (); send_finished ();
@ -2826,7 +2826,7 @@ void nano::bulk_pull_account_server::sent_action (boost::system::error_code cons
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Unable to bulk send block: %1%") % ec.message ()); connection->node->logger.try_log (boost::str (boost::format ("Unable to bulk send block: %1%") % ec.message ()));
} }
} }
} }
@ -2864,7 +2864,7 @@ void nano::bulk_pull_account_server::send_finished ()
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << "Bulk sending for an account finished"; connection->node->logger.try_log ("Bulk sending for an account finished");
} }
connection->socket->async_write (send_buffer, [this_l](boost::system::error_code const & ec, size_t size_a) { connection->socket->async_write (send_buffer, [this_l](boost::system::error_code const & ec, size_t size_a) {
@ -2898,7 +2898,7 @@ void nano::bulk_pull_account_server::complete (boost::system::error_code const &
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << "Unable to pending-as-zero"; connection->node->logger.try_log ("Unable to pending-as-zero");
} }
} }
} }
@ -2928,7 +2928,7 @@ void nano::bulk_push_server::receive ()
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << "Aborting bulk_push because a bootstrap attempt is in progress"; connection->node->logger.try_log ("Aborting bulk_push because a bootstrap attempt is in progress");
} }
} }
else else
@ -2943,7 +2943,7 @@ void nano::bulk_push_server::receive ()
{ {
if (this_l->connection->node->config.logging.bulk_pull_logging ()) if (this_l->connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (this_l->connection->node->log) << boost::str (boost::format ("Error receiving block type: %1%") % ec.message ()); this_l->connection->node->logger.try_log (boost::str (boost::format ("Error receiving block type: %1%") % ec.message ()));
} }
} }
}); });
@ -3005,7 +3005,7 @@ void nano::bulk_push_server::received_type ()
{ {
if (connection->node->config.logging.network_packet_logging ()) if (connection->node->config.logging.network_packet_logging ())
{ {
BOOST_LOG (connection->node->log) << "Unknown type received as block type"; connection->node->logger.try_log ("Unknown type received as block type");
} }
break; break;
} }
@ -3030,7 +3030,7 @@ void nano::bulk_push_server::received_block (boost::system::error_code const & e
{ {
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << "Error deserializing block received from pull request"; connection->node->logger.try_log ("Error deserializing block received from pull request");
} }
} }
} }
@ -3060,7 +3060,7 @@ void nano::frontier_req_server::send_next ()
auto this_l (shared_from_this ()); auto this_l (shared_from_this ());
if (connection->node->config.logging.bulk_pull_logging ()) if (connection->node->config.logging.bulk_pull_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Sending frontier for %1% %2%") % current.to_account () % frontier.to_string ()); connection->node->logger.try_log (boost::str (boost::format ("Sending frontier for %1% %2%") % current.to_account () % frontier.to_string ()));
} }
next (); next ();
connection->socket->async_write (send_buffer, [this_l](boost::system::error_code const & ec, size_t size_a) { connection->socket->async_write (send_buffer, [this_l](boost::system::error_code const & ec, size_t size_a) {
@ -3085,7 +3085,7 @@ void nano::frontier_req_server::send_finished ()
auto this_l (shared_from_this ()); auto this_l (shared_from_this ());
if (connection->node->config.logging.network_logging ()) if (connection->node->config.logging.network_logging ())
{ {
BOOST_LOG (connection->node->log) << "Frontier sending finished"; connection->node->logger.try_log ("Frontier sending finished");
} }
connection->socket->async_write (send_buffer, [this_l](boost::system::error_code const & ec, size_t size_a) { connection->socket->async_write (send_buffer, [this_l](boost::system::error_code const & ec, size_t size_a) {
this_l->no_block_sent (ec, size_a); this_l->no_block_sent (ec, size_a);
@ -3102,7 +3102,7 @@ void nano::frontier_req_server::no_block_sent (boost::system::error_code const &
{ {
if (connection->node->config.logging.network_logging ()) if (connection->node->config.logging.network_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Error sending frontier finish: %1%") % ec.message ()); connection->node->logger.try_log (boost::str (boost::format ("Error sending frontier finish: %1%") % ec.message ()));
} }
} }
} }
@ -3118,7 +3118,7 @@ void nano::frontier_req_server::sent_action (boost::system::error_code const & e
{ {
if (connection->node->config.logging.network_logging ()) if (connection->node->config.logging.network_logging ())
{ {
BOOST_LOG (connection->node->log) << boost::str (boost::format ("Error sending frontier pair: %1%") % ec.message ()); connection->node->logger.try_log (boost::str (boost::format ("Error sending frontier pair: %1%") % ec.message ()));
} }
} }
} }

View file

@ -337,7 +337,7 @@ std::error_code nano::handle_node_options (boost::program_options::variables_map
environment.dump (std::cout); environment.dump (std::cout);
std::stringstream stream; std::stringstream stream;
environment.dump (stream); environment.dump (stream);
BOOST_LOG (node.logging.log) << stream.str (); node.logging.logger.always_log (stream.str ());
} }
else else
{ {

View file

@ -100,7 +100,7 @@ public:
{ {
if (node.config.logging.log_ipc ()) if (node.config.logging.log_ipc ())
{ {
BOOST_LOG (node.log) << "IPC: created session with id: " << session_id; node.logger.always_log ("IPC: created session with id: ", session_id);
} }
} }
@ -136,7 +136,7 @@ public:
{ {
if (this_l->node.config.logging.log_ipc ()) if (this_l->node.config.logging.log_ipc ())
{ {
BOOST_LOG (this_l->node.log) << boost::str (boost::format ("IPC: error reading %1% ") % ec.message ()); this_l->node.logger.always_log (boost::str (boost::format ("IPC: error reading %1% ") % ec.message ()));
} }
} }
else if (bytes_transferred_a > 0) else if (bytes_transferred_a > 0)
@ -176,13 +176,13 @@ public:
} }
else if (this_l->node.config.logging.log_ipc ()) else if (this_l->node.config.logging.log_ipc ())
{ {
BOOST_LOG (this_l->node.log) << "IPC: Write failed: " << error_a.message (); this_l->node.logger.always_log ("IPC: Write failed: ", error_a.message ());
} }
}); });
if (this_l->node.config.logging.log_ipc ()) if (this_l->node.config.logging.log_ipc ())
{ {
BOOST_LOG (this_l->node.log) << boost::str (boost::format ("IPC/RPC request %1% completed in: %2% %3%") % request_id_l % this_l->session_timer.stop ().count () % this_l->session_timer.unit ()); this_l->node.logger.always_log (boost::str (boost::format ("IPC/RPC request %1% completed in: %2% %3%") % request_id_l % this_l->session_timer.stop ().count () % this_l->session_timer.unit ()));
} }
}); });
@ -206,7 +206,7 @@ public:
{ {
if (this_l->node.config.logging.log_ipc ()) if (this_l->node.config.logging.log_ipc ())
{ {
BOOST_LOG (this_l->node.log) << "IPC: Invalid preamble"; this_l->node.logger.always_log ("IPC: Invalid preamble");
} }
} }
else if (this_l->buffer[preamble_offset::encoding] == static_cast<uint8_t> (nano::ipc::payload_encoding::json_legacy)) else if (this_l->buffer[preamble_offset::encoding] == static_cast<uint8_t> (nano::ipc::payload_encoding::json_legacy))
@ -223,7 +223,7 @@ public:
} }
else if (this_l->node.config.logging.log_ipc ()) else if (this_l->node.config.logging.log_ipc ())
{ {
BOOST_LOG (this_l->node.log) << "IPC: Unsupported payload encoding"; this_l->node.logger.always_log ("IPC: Unsupported payload encoding");
} }
}); });
} }
@ -313,7 +313,7 @@ public:
} }
else else
{ {
BOOST_LOG (server.node.log) << "IPC: acceptor error: " << ec.message (); server.node.logger.always_log ("IPC: acceptor error: ", ec.message ());
} }
if (acceptor->is_open () && ec != boost::asio::error::operation_aborted) if (acceptor->is_open () && ec != boost::asio::error::operation_aborted)
@ -322,7 +322,7 @@ public:
} }
else else
{ {
BOOST_LOG (server.node.log) << "IPC: shutting down"; server.node.logger.always_log ("IPC: shutting down");
} }
}); });
} }
@ -378,7 +378,7 @@ node (node_a), rpc (rpc_a)
boost::asio::local::stream_protocol::endpoint ep{ node_a.config.ipc_config.transport_domain.path }; boost::asio::local::stream_protocol::endpoint ep{ node_a.config.ipc_config.transport_domain.path };
transports.push_back (std::make_shared<socket_transport<boost::asio::local::stream_protocol::acceptor, boost::asio::local::stream_protocol::socket, boost::asio::local::stream_protocol::endpoint>> (*this, ep, node_a.config.ipc_config.transport_domain, threads)); transports.push_back (std::make_shared<socket_transport<boost::asio::local::stream_protocol::acceptor, boost::asio::local::stream_protocol::socket, boost::asio::local::stream_protocol::endpoint>> (*this, ep, node_a.config.ipc_config.transport_domain, threads));
#else #else
BOOST_LOG (node.log) << "IPC: Domain sockets are not supported on this platform"; node.logger.always_log ("IPC: Domain sockets are not supported on this platform");
#endif #endif
} }
@ -388,17 +388,17 @@ node (node_a), rpc (rpc_a)
transports.push_back (std::make_shared<socket_transport<boost::asio::ip::tcp::acceptor, boost::asio::ip::tcp::socket, boost::asio::ip::tcp::endpoint>> (*this, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v6 (), node_a.config.ipc_config.transport_tcp.port), node_a.config.ipc_config.transport_tcp, threads)); transports.push_back (std::make_shared<socket_transport<boost::asio::ip::tcp::acceptor, boost::asio::ip::tcp::socket, boost::asio::ip::tcp::endpoint>> (*this, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v6 (), node_a.config.ipc_config.transport_tcp.port), node_a.config.ipc_config.transport_tcp, threads));
} }
BOOST_LOG (node.log) << "IPC: server started"; node.logger.try_log ("IPC: server started");
} }
catch (std::runtime_error const & ex) catch (std::runtime_error const & ex)
{ {
BOOST_LOG (node.log) << "IPC: " << ex.what (); node.logger.always_log ("IPC: ", ex.what ());
} }
} }
nano::ipc::ipc_server::~ipc_server () nano::ipc::ipc_server::~ipc_server ()
{ {
BOOST_LOG (node.log) << "IPC: server stopped"; node.logger.always_log ("IPC: server stopped");
} }
void nano::ipc::ipc_server::stop () void nano::ipc::ipc_server::stop ()

View file

@ -1234,7 +1234,7 @@ void nano::mdb_store::upgrade_v12_to_v13 (size_t const batch_size)
{ {
if (cost >= batch_size) if (cost >= batch_size)
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Upgrading sideband information for account %1%... height %2%") % first.to_account ().substr (0, 24) % std::to_string (height)); logging.logger.always_log (boost::str (boost::format ("Upgrading sideband information for account %1%... height %2%") % first.to_account ().substr (0, 24) % std::to_string (height)));
auto tx (boost::polymorphic_downcast<nano::mdb_txn *> (transaction.impl.get ())); auto tx (boost::polymorphic_downcast<nano::mdb_txn *> (transaction.impl.get ()));
auto status0 (mdb_txn_commit (*tx)); auto status0 (mdb_txn_commit (*tx));
release_assert (status0 == MDB_SUCCESS); release_assert (status0 == MDB_SUCCESS);
@ -1267,7 +1267,7 @@ void nano::mdb_store::upgrade_v12_to_v13 (size_t const batch_size)
} }
if (account == not_an_account) if (account == not_an_account)
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Completed sideband upgrade")); logging.logger.always_log (boost::str (boost::format ("Completed sideband upgrade")));
version_put (transaction, 13); version_put (transaction, 13);
} }
} }

View file

@ -5,30 +5,7 @@
#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/ptree.hpp>
#include <nano/node/logging.hpp> #include <nano/node/logging.hpp>
nano::logging::logging () : std::string nano::logging::log_path_value;
ledger_logging_value (false),
ledger_duplicate_logging_value (false),
vote_logging_value (false),
network_logging_value (true),
network_message_logging_value (false),
network_publish_logging_value (false),
network_packet_logging_value (false),
network_keepalive_logging_value (false),
network_node_id_handshake_logging_value (false),
node_lifetime_tracing_value (false),
insufficient_work_logging_value (true),
log_rpc_value (true),
log_ipc_value (true),
bulk_pull_logging_value (false),
work_generation_time_value (true),
upnp_details_logging_value (false),
timing_logging_value (false),
log_to_cerr_value (false),
flush (true),
max_size (128 * 1024 * 1024),
rotation_size (4 * 1024 * 1024)
{
}
void nano::logging::init (boost::filesystem::path const & application_path_a) void nano::logging::init (boost::filesystem::path const & application_path_a)
{ {
@ -40,10 +17,23 @@ void nano::logging::init (boost::filesystem::path const & application_path_a)
{ {
boost::log::add_console_log (std::cerr, boost::log::keywords::format = "[%TimeStamp%]: %Message%"); boost::log::add_console_log (std::cerr, boost::log::keywords::format = "[%TimeStamp%]: %Message%");
} }
boost::log::add_file_log (boost::log::keywords::target = application_path_a / "log", boost::log::keywords::file_name = application_path_a / "log" / "log_%Y-%m-%d_%H-%M-%S.%N.log", boost::log::keywords::rotation_size = rotation_size, boost::log::keywords::auto_flush = flush, boost::log::keywords::scan_method = boost::log::sinks::file::scan_method::scan_matching, boost::log::keywords::max_size = max_size, boost::log::keywords::format = "[%TimeStamp%]: %Message%"); auto path = application_path_a / "log";
log_path_value = path.string ();
boost::log::add_file_log (boost::log::keywords::target = path, boost::log::keywords::file_name = path / "log_%Y-%m-%d_%H-%M-%S.%N.log", boost::log::keywords::rotation_size = rotation_size, boost::log::keywords::auto_flush = flush, boost::log::keywords::scan_method = boost::log::sinks::file::scan_method::scan_matching, boost::log::keywords::max_size = max_size, boost::log::keywords::format = "[%TimeStamp%]: %Message%");
} }
} }
// This is currently only used by tests currently
std::string const & nano::logging::log_path ()
{
if (log_path_value.empty ())
{
throw std::runtime_error ("init () has not been called yet");
}
return log_path_value;
}
nano::error nano::logging::serialize_json (nano::jsonconfig & json) const nano::error nano::logging::serialize_json (nano::jsonconfig & json) const
{ {
json.put ("version", json_version ()); json.put ("version", json_version ());
@ -68,6 +58,7 @@ nano::error nano::logging::serialize_json (nano::jsonconfig & json) const
json.put ("max_size", max_size); json.put ("max_size", max_size);
json.put ("rotation_size", rotation_size); json.put ("rotation_size", rotation_size);
json.put ("flush", flush); json.put ("flush", flush);
json.put ("min_time_between_output", min_time_between_log_output.count ());
return json.get_error (); return json.get_error ();
} }
@ -99,6 +90,10 @@ bool nano::logging::upgrade_json (unsigned version_a, nano::jsonconfig & json)
json.put ("log_ipc", true); json.put ("log_ipc", true);
upgraded_l = true; upgraded_l = true;
case 6: case 6:
json.put ("min_time_between_output", min_time_between_log_output.count ());
upgraded_l = true;
break;
case 7:
break; break;
default: default:
throw std::runtime_error ("Unknown logging_config version"); throw std::runtime_error ("Unknown logging_config version");
@ -150,7 +145,9 @@ nano::error nano::logging::deserialize_json (bool & upgraded_a, nano::jsonconfig
json.get<bool> ("flush", flush); json.get<bool> ("flush", flush);
json.get<uintmax_t> ("max_size", max_size); json.get<uintmax_t> ("max_size", max_size);
json.get<uintmax_t> ("rotation_size", rotation_size); json.get<uintmax_t> ("rotation_size", rotation_size);
uintmax_t min_time_between_log_output_raw;
json.get<uintmax_t> ("min_time_between_output", min_time_between_log_output_raw);
min_time_between_log_output = std::chrono::milliseconds (min_time_between_log_output_raw);
return json.get_error (); return json.get_error ();
} }

View file

@ -11,10 +11,82 @@
namespace nano namespace nano
{ {
// A wrapper around a boost logger object to allow
// minimum time spaced output to prevent logging happening
// too quickly.
class logger_mt
{
private:
void add_to_stream (boost::log::record_ostream & stream)
{
}
template <typename LogItem, typename... LogItems>
void add_to_stream (boost::log::record_ostream & stream, const LogItem & first_log_item, LogItems &&... remainder_log_items)
{
stream << first_log_item;
add_to_stream (stream, remainder_log_items...);
}
template <typename... LogItems>
void output (LogItems &&... log_items)
{
boost::log::record rec = boost_logger_mt.open_record ();
if (rec)
{
boost::log::record_ostream strm (rec);
add_to_stream (strm, std::forward<LogItems> (log_items)...);
strm.flush ();
boost_logger_mt.push_record (std::move (rec));
}
}
public:
/**
* @param min_log_delta_a The minimum time between successive output
*/
explicit logger_mt (std::chrono::milliseconds const & min_log_delta_a) :
min_log_delta (min_log_delta_a)
{
}
/*
* @param log_items A collection of objects with overloaded operator<< to be output to the log file
*/
template <typename... LogItems>
void always_log (LogItems &&... log_items)
{
output (std::forward<LogItems> (log_items)...);
}
/*
* @param log_items A collection of objects with overloaded operator<< to be output to the log file
* if the last time an item was logged was over min_log_delta time ago.
* @return true if the log was successful
*/
template <typename... LogItems>
bool try_log (LogItems &&... log_items)
{
auto logged (false);
auto time_now = std::chrono::steady_clock::now ();
if ((time_now - last_log_time) > min_log_delta)
{
output (std::forward<LogItems> (log_items)...);
last_log_time = time_now;
logged = true;
}
return logged;
}
private:
std::chrono::milliseconds const & min_log_delta;
std::chrono::steady_clock::time_point last_log_time;
boost::log::sources::logger_mt boost_logger_mt;
};
class logging class logging
{ {
public: public:
logging ();
nano::error serialize_json (nano::jsonconfig &) const; nano::error serialize_json (nano::jsonconfig &) const;
nano::error deserialize_json (bool &, nano::jsonconfig &); nano::error deserialize_json (bool &, nano::jsonconfig &);
bool upgrade_json (unsigned, nano::jsonconfig &); bool upgrade_json (unsigned, nano::jsonconfig &);
@ -38,32 +110,37 @@ public:
bool work_generation_time () const; bool work_generation_time () const;
bool log_to_cerr () const; bool log_to_cerr () const;
void init (boost::filesystem::path const &); void init (boost::filesystem::path const &);
static std::string const & log_path ();
bool ledger_logging_value; bool ledger_logging_value{ false };
bool ledger_duplicate_logging_value; bool ledger_duplicate_logging_value{ false };
bool vote_logging_value; bool vote_logging_value{ false };
bool network_logging_value; bool network_logging_value{ true };
bool network_message_logging_value; bool network_message_logging_value{ false };
bool network_publish_logging_value; bool network_publish_logging_value{ false };
bool network_packet_logging_value; bool network_packet_logging_value{ false };
bool network_keepalive_logging_value; bool network_keepalive_logging_value{ false };
bool network_node_id_handshake_logging_value; bool network_node_id_handshake_logging_value{ false };
bool node_lifetime_tracing_value; bool node_lifetime_tracing_value{ false };
bool insufficient_work_logging_value; bool insufficient_work_logging_value{ true };
bool log_rpc_value; bool log_rpc_value{ true };
bool log_ipc_value; bool log_ipc_value{ true };
bool bulk_pull_logging_value; bool bulk_pull_logging_value{ false };
bool work_generation_time_value; bool work_generation_time_value{ true };
bool upnp_details_logging_value; bool upnp_details_logging_value{ false };
bool timing_logging_value; bool timing_logging_value{ false };
bool log_to_cerr_value; bool log_to_cerr_value{ false };
bool flush; bool flush{ true };
uintmax_t max_size; uintmax_t max_size{ 128 * 1024 * 1024 };
uintmax_t rotation_size; uintmax_t rotation_size{ 4 * 1024 * 1024 };
boost::log::sources::logger_mt log; std::chrono::milliseconds min_time_between_log_output{ 5 };
nano::logger_mt logger{ min_time_between_log_output };
int json_version () const int json_version () const
{ {
return 6; return 7;
} }
private:
static std::string log_path_value;
}; };
} }

View file

@ -59,27 +59,27 @@ on (true)
} }
catch (boost::system::error_code & ec) catch (boost::system::error_code & ec)
{ {
BOOST_LOG (this->node.log) << FATAL_LOG_PREFIX << ec.message (); this->node.logger.try_log (FATAL_LOG_PREFIX, ec.message ());
release_assert (false); release_assert (false);
} }
catch (std::error_code & ec) catch (std::error_code & ec)
{ {
BOOST_LOG (this->node.log) << FATAL_LOG_PREFIX << ec.message (); this->node.logger.try_log (FATAL_LOG_PREFIX, ec.message ());
release_assert (false); release_assert (false);
} }
catch (std::runtime_error & err) catch (std::runtime_error & err)
{ {
BOOST_LOG (this->node.log) << FATAL_LOG_PREFIX << err.what (); this->node.logger.try_log (FATAL_LOG_PREFIX, err.what ());
release_assert (false); release_assert (false);
} }
catch (...) catch (...)
{ {
BOOST_LOG (this->node.log) << FATAL_LOG_PREFIX << "Unknown exception"; this->node.logger.try_log (FATAL_LOG_PREFIX, "Unknown exception");
release_assert (false); release_assert (false);
} }
if (this->node.config.logging.network_packet_logging ()) if (this->node.config.logging.network_packet_logging ())
{ {
BOOST_LOG (this->node.log) << "Exiting packet processing thread"; this->node.logger.try_log ("Exiting packet processing thread");
} }
})); }));
} }
@ -105,7 +105,7 @@ void nano::network::receive ()
{ {
if (node.config.logging.network_packet_logging ()) if (node.config.logging.network_packet_logging ())
{ {
BOOST_LOG (node.log) << "Receiving packet"; node.logger.try_log ("Receiving packet");
} }
std::unique_lock<std::mutex> lock (socket_mutex); std::unique_lock<std::mutex> lock (socket_mutex);
auto data (buffer_container.allocate ()); auto data (buffer_container.allocate ());
@ -123,7 +123,7 @@ void nano::network::receive ()
{ {
if (this->node.config.logging.network_logging ()) if (this->node.config.logging.network_logging ())
{ {
BOOST_LOG (this->node.log) << boost::str (boost::format ("UDP Receive error: %1%") % error.message ()); this->node.logger.try_log (boost::str (boost::format ("UDP Receive error: %1%") % error.message ()));
} }
} }
if (this->on) if (this->on)
@ -170,7 +170,7 @@ void nano::network::send_keepalive (nano::endpoint const & endpoint_a)
auto bytes = message.to_bytes (); auto bytes = message.to_bytes ();
if (node.config.logging.network_keepalive_logging ()) if (node.config.logging.network_keepalive_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Keepalive req sent to %1%") % endpoint_a); node.logger.try_log (boost::str (boost::format ("Keepalive req sent to %1%") % endpoint_a));
} }
std::weak_ptr<nano::node> node_w (node.shared ()); std::weak_ptr<nano::node> node_w (node.shared ());
send_buffer (bytes->data (), bytes->size (), endpoint_a, [bytes, node_w, endpoint_a](boost::system::error_code const & ec, size_t) { send_buffer (bytes->data (), bytes->size (), endpoint_a, [bytes, node_w, endpoint_a](boost::system::error_code const & ec, size_t) {
@ -178,7 +178,7 @@ void nano::network::send_keepalive (nano::endpoint const & endpoint_a)
{ {
if (ec && node_l->config.logging.network_keepalive_logging ()) if (ec && node_l->config.logging.network_keepalive_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Error sending keepalive to %1%: %2%") % endpoint_a % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Error sending keepalive to %1%: %2%") % endpoint_a % ec.message ()));
} }
else else
{ {
@ -206,7 +206,7 @@ void nano::node::keepalive (std::string const & address_a, uint16_t port_a, bool
} }
else else
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Error resolving address: %1%:%2%: %3%") % address_a % port_a % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Error resolving address: %1%:%2%: %3%") % address_a % port_a % ec.message ()));
} }
}); });
} }
@ -224,7 +224,7 @@ void nano::network::send_node_id_handshake (nano::endpoint const & endpoint_a, b
auto bytes = message.to_bytes (); auto bytes = message.to_bytes ();
if (node.config.logging.network_node_id_handshake_logging ()) if (node.config.logging.network_node_id_handshake_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Node ID handshake sent with node ID %1% to %2%: query %3%, respond_to %4% (signature %5%)") % node.node_id.pub.to_account () % endpoint_a % (query ? query->to_string () : std::string ("[none]")) % (respond_to ? respond_to->to_string () : std::string ("[none]")) % (response ? response->second.to_string () : std::string ("[none]"))); node.logger.try_log (boost::str (boost::format ("Node ID handshake sent with node ID %1% to %2%: query %3%, respond_to %4% (signature %5%)") % node.node_id.pub.to_account () % endpoint_a % (query ? query->to_string () : std::string ("[none]")) % (respond_to ? respond_to->to_string () : std::string ("[none]")) % (response ? response->second.to_string () : std::string ("[none]"))));
} }
node.stats.inc (nano::stat::type::message, nano::stat::detail::node_id_handshake, nano::stat::dir::out); node.stats.inc (nano::stat::type::message, nano::stat::detail::node_id_handshake, nano::stat::dir::out);
std::weak_ptr<nano::node> node_w (node.shared ()); std::weak_ptr<nano::node> node_w (node.shared ());
@ -233,7 +233,7 @@ void nano::network::send_node_id_handshake (nano::endpoint const & endpoint_a, b
{ {
if (ec && node_l->config.logging.network_node_id_handshake_logging ()) if (ec && node_l->config.logging.network_node_id_handshake_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Error sending node ID handshake to %1% %2%") % endpoint_a % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Error sending node ID handshake to %1% %2%") % endpoint_a % ec.message ()));
} }
} }
}); });
@ -243,7 +243,7 @@ void nano::network::republish (nano::block_hash const & hash_a, std::shared_ptr<
{ {
if (node.config.logging.network_publish_logging ()) if (node.config.logging.network_publish_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Publishing %1% to %2%") % hash_a.to_string () % endpoint_a); node.logger.try_log (boost::str (boost::format ("Publishing %1% to %2%") % hash_a.to_string () % endpoint_a));
} }
std::weak_ptr<nano::node> node_w (node.shared ()); std::weak_ptr<nano::node> node_w (node.shared ());
send_buffer (buffer_a->data (), buffer_a->size (), endpoint_a, [node_w, endpoint_a](boost::system::error_code const & ec, size_t size) { send_buffer (buffer_a->data (), buffer_a->size (), endpoint_a, [node_w, endpoint_a](boost::system::error_code const & ec, size_t size) {
@ -251,7 +251,7 @@ void nano::network::republish (nano::block_hash const & hash_a, std::shared_ptr<
{ {
if (ec && node_l->config.logging.network_logging ()) if (ec && node_l->config.logging.network_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Error sending publish to %1%: %2%") % endpoint_a % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Error sending publish to %1%: %2%") % endpoint_a % ec.message ()));
} }
else else
{ {
@ -367,7 +367,7 @@ void nano::network::republish_block (std::shared_ptr<nano::block> block)
} }
if (node.config.logging.network_logging ()) if (node.config.logging.network_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Block %1% was republished to peers") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Block %1% was republished to peers") % hash.to_string ()));
} }
} }
@ -383,7 +383,7 @@ void nano::network::republish_block (std::shared_ptr<nano::block> block, nano::e
republish (hash, std::make_shared<std::vector<uint8_t>> (bytes), peer_a); republish (hash, std::make_shared<std::vector<uint8_t>> (bytes), peer_a);
if (node.config.logging.network_logging ()) if (node.config.logging.network_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Block %1% was republished to peer") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Block %1% was republished to peers") % hash.to_string ()));
} }
} }
@ -453,7 +453,7 @@ void nano::network::broadcast_confirm_req_base (std::shared_ptr<nano::block> blo
const size_t max_reps = 10; const size_t max_reps = 10;
if (!resumption && node.config.logging.network_logging ()) if (!resumption && node.config.logging.network_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Broadcasting confirm req for block %1% to %2% representatives") % block_a->hash ().to_string () % endpoints_a->size ()); node.logger.try_log (boost::str (boost::format ("Broadcasting confirm req for block %1% to %2% representatives") % block_a->hash ().to_string () % endpoints_a->size ()));
} }
auto count (0); auto count (0);
while (!endpoints_a->empty () && count < max_reps) while (!endpoints_a->empty () && count < max_reps)
@ -481,7 +481,7 @@ void nano::network::broadcast_confirm_req_batch (std::unordered_map<nano::endpoi
const size_t max_reps = 10; const size_t max_reps = 10;
if (!resumption && node.config.logging.network_logging ()) if (!resumption && node.config.logging.network_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Broadcasting batch confirm req to %1% representatives") % request_bundle_a.size ()); node.logger.try_log (boost::str (boost::format ("Broadcasting batch confirm req to %1% representatives") % request_bundle_a.size ()));
} }
auto count (0); auto count (0);
while (!request_bundle_a.empty () && count < max_reps) while (!request_bundle_a.empty () && count < max_reps)
@ -544,7 +544,7 @@ void nano::network::send_confirm_req (nano::endpoint const & endpoint_a, std::sh
auto bytes = message.to_bytes (); auto bytes = message.to_bytes ();
if (node.config.logging.network_message_logging ()) if (node.config.logging.network_message_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Sending confirm req to %1%") % endpoint_a); node.logger.try_log (boost::str (boost::format ("Sending confirm req to %1%") % endpoint_a));
} }
std::weak_ptr<nano::node> node_w (node.shared ()); std::weak_ptr<nano::node> node_w (node.shared ());
node.stats.inc (nano::stat::type::message, nano::stat::detail::confirm_req, nano::stat::dir::out); node.stats.inc (nano::stat::type::message, nano::stat::detail::confirm_req, nano::stat::dir::out);
@ -553,7 +553,7 @@ void nano::network::send_confirm_req (nano::endpoint const & endpoint_a, std::sh
{ {
if (ec && node_l->config.logging.network_logging ()) if (ec && node_l->config.logging.network_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Error sending confirm request: %1%") % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Error sending confirm request: %1%") % ec.message ()));
} }
} }
}); });
@ -569,7 +569,7 @@ void nano::network::send_confirm_req_hashes (nano::endpoint const & endpoint_a,
} }
if (node.config.logging.network_message_logging ()) if (node.config.logging.network_message_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Sending confirm req hashes to %1%") % endpoint_a); node.logger.try_log (boost::str (boost::format ("Sending confirm req hashes to %1%") % endpoint_a));
} }
std::weak_ptr<nano::node> node_w (node.shared ()); std::weak_ptr<nano::node> node_w (node.shared ());
node.stats.inc (nano::stat::type::message, nano::stat::detail::confirm_req, nano::stat::dir::out); node.stats.inc (nano::stat::type::message, nano::stat::detail::confirm_req, nano::stat::dir::out);
@ -578,7 +578,7 @@ void nano::network::send_confirm_req_hashes (nano::endpoint const & endpoint_a,
{ {
if (ec && node_l->config.logging.network_logging ()) if (ec && node_l->config.logging.network_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Error sending confirm request: %1%") % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Error sending confirm request: %1%") % ec.message ()));
} }
} }
}); });
@ -627,7 +627,7 @@ public:
{ {
if (node.config.logging.network_keepalive_logging ()) if (node.config.logging.network_keepalive_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Received keepalive message from %1%") % sender); node.logger.try_log (boost::str (boost::format ("Received keepalive message from %1%") % sender));
} }
node.stats.inc (nano::stat::type::message, nano::stat::detail::keepalive, nano::stat::dir::in); node.stats.inc (nano::stat::type::message, nano::stat::detail::keepalive, nano::stat::dir::in);
if (node.peers.contacted (sender, message_a.header.version_using)) if (node.peers.contacted (sender, message_a.header.version_using))
@ -645,7 +645,7 @@ public:
{ {
if (node.config.logging.network_message_logging ()) if (node.config.logging.network_message_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Publish message from %1% for %2%") % sender % message_a.block->hash ().to_string ()); node.logger.try_log (boost::str (boost::format ("Publish message from %1% for %2%") % sender % message_a.block->hash ().to_string ()));
} }
node.stats.inc (nano::stat::type::message, nano::stat::detail::publish, nano::stat::dir::in); node.stats.inc (nano::stat::type::message, nano::stat::detail::publish, nano::stat::dir::in);
node.peers.contacted (sender, message_a.header.version_using); node.peers.contacted (sender, message_a.header.version_using);
@ -661,11 +661,11 @@ public:
{ {
if (!message_a.roots_hashes.empty ()) if (!message_a.roots_hashes.empty ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Confirm_req message from %1% for hashes:roots %2%") % sender % message_a.roots_string ()); node.logger.try_log (boost::str (boost::format ("Confirm_req message from %1% for hashes:roots %2%") % sender % message_a.roots_string ()));
} }
else else
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Confirm_req message from %1% for %2%") % sender % message_a.block->hash ().to_string ()); node.logger.try_log (boost::str (boost::format ("Confirm_req message from %1% for %2%") % sender % message_a.block->hash ().to_string ()));
} }
} }
node.stats.inc (nano::stat::type::message, nano::stat::detail::confirm_req, nano::stat::dir::in); node.stats.inc (nano::stat::type::message, nano::stat::detail::confirm_req, nano::stat::dir::in);
@ -733,7 +733,7 @@ public:
{ {
if (node.config.logging.network_message_logging ()) if (node.config.logging.network_message_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Received confirm_ack message from %1% for %2%sequence %3%") % sender % message_a.vote->hashes_string () % std::to_string (message_a.vote->sequence)); node.logger.try_log (boost::str (boost::format ("Received confirm_ack message from %1% for %2%sequence %3%") % sender % message_a.vote->hashes_string () % std::to_string (message_a.vote->sequence)));
} }
node.stats.inc (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::in); node.stats.inc (nano::stat::type::message, nano::stat::detail::confirm_ack, nano::stat::dir::in);
node.peers.contacted (sender, message_a.header.version_using); node.peers.contacted (sender, message_a.header.version_using);
@ -771,7 +771,7 @@ public:
{ {
if (node.config.logging.network_node_id_handshake_logging ()) if (node.config.logging.network_node_id_handshake_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Received node_id_handshake message from %1% with query %2% and response account %3%") % sender % (message_a.query ? message_a.query->to_string () : std::string ("[none]")) % (message_a.response ? message_a.response->first.to_account () : std::string ("[none]"))); node.logger.try_log (boost::str (boost::format ("Received node_id_handshake message from %1% with query %2% and response account %3%") % sender % (message_a.query ? message_a.query->to_string () : std::string ("[none]")) % (message_a.response ? message_a.response->first.to_account () : std::string ("[none]"))));
} }
auto endpoint_l (nano::map_endpoint_to_v6 (sender)); auto endpoint_l (nano::map_endpoint_to_v6 (sender));
boost::optional<nano::uint256_union> out_query; boost::optional<nano::uint256_union> out_query;
@ -793,7 +793,7 @@ public:
} }
else if (node.config.logging.network_node_id_handshake_logging ()) else if (node.config.logging.network_node_id_handshake_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Failed to validate syn cookie signature %1% by %2%") % message_a.response->second.to_string () % message_a.response->first.to_account ()); node.logger.try_log (boost::str (boost::format ("Failed to validate syn cookie signature %1% by %2%") % message_a.response->second.to_string () % message_a.response->first.to_account ()));
} }
} }
if (!validated_response && !node.peers.known_peer (endpoint_l)) if (!validated_response && !node.peers.known_peer (endpoint_l))
@ -878,7 +878,7 @@ void nano::network::receive_action (nano::udp_data * data_a, nano::endpoint cons
if (node.config.logging.network_logging () && parser.status != nano::message_parser::parse_status::outdated_version) if (node.config.logging.network_logging () && parser.status != nano::message_parser::parse_status::outdated_version)
{ {
BOOST_LOG (node.log) << "Could not parse message. Error: " << parser.status_string (); node.logger.try_log ("Could not parse message. Error: ", parser.status_string ());
} }
} }
else else
@ -890,7 +890,7 @@ void nano::network::receive_action (nano::udp_data * data_a, nano::endpoint cons
{ {
if (node.config.logging.network_logging ()) if (node.config.logging.network_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Reserved sender %1%") % data_a->endpoint.address ().to_string ()); node.logger.try_log (boost::str (boost::format ("Reserved sender %1%") % data_a->endpoint.address ().to_string ()));
} }
node.stats.inc_detail_only (nano::stat::type::error, nano::stat::detail::bad_sender); node.stats.inc_detail_only (nano::stat::type::error, nano::stat::detail::bad_sender);
@ -1088,7 +1088,7 @@ void nano::vote_processor::process_loop ()
* the results are probably not useful as well, * the results are probably not useful as well,
* so don't spam the logs. * so don't spam the logs.
*/ */
BOOST_LOG (node.log) << boost::str (boost::format ("Processed %1% votes in %2% milliseconds (rate of %3% votes per second)") % votes_l.size () % elapsed_time_ms_int % ((votes_l.size () * 1000ULL) / elapsed_time_ms_int)); node.logger.try_log (boost::str (boost::format ("Processed %1% votes in %2% milliseconds (rate of %3% votes per second)") % votes_l.size () % elapsed_time_ms_int % ((votes_l.size () * 1000ULL) / elapsed_time_ms_int)));
} }
} }
} }
@ -1150,7 +1150,7 @@ void nano::vote_processor::vote (std::shared_ptr<nano::vote> vote_a, nano::endpo
node.stats.inc (nano::stat::type::vote, nano::stat::detail::vote_overflow); node.stats.inc (nano::stat::type::vote, nano::stat::detail::vote_overflow);
if (node.config.logging.vote_logging ()) if (node.config.logging.vote_logging ())
{ {
BOOST_LOG (node.log) << "Votes overflow"; node.logger.try_log ("Votes overflow");
} }
} }
} }
@ -1244,7 +1244,7 @@ nano::vote_code nano::vote_processor::vote_blocking (nano::transaction const & t
} }
if (node.config.logging.vote_logging ()) if (node.config.logging.vote_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Vote from: %1% sequence: %2% block(s): %3%status: %4%") % vote_a->account.to_account () % std::to_string (vote_a->sequence) % vote_a->hashes_string () % status); node.logger.try_log (boost::str (boost::format ("Vote from: %1% sequence: %2% block(s): %3%status: %4%") % vote_a->account.to_account () % std::to_string (vote_a->sequence) % vote_a->hashes_string () % status));
} }
return result; return result;
} }
@ -1415,6 +1415,7 @@ config (config_a),
flags (flags_a), flags (flags_a),
alarm (alarm_a), alarm (alarm_a),
work (work_a), work (work_a),
logger (config_a.logging.min_time_between_log_output),
store_impl (std::make_unique<nano::mdb_store> (init_a.block_store_init, config.logging, application_path_a / "data.ldb", config_a.lmdb_max_dbs, !flags.disable_unchecked_drop, flags.sideband_batch_size)), store_impl (std::make_unique<nano::mdb_store> (init_a.block_store_init, config.logging, application_path_a / "data.ldb", config_a.lmdb_max_dbs, !flags.disable_unchecked_drop, flags.sideband_batch_size)),
store (*store_impl), store (*store_impl),
wallets_store_impl (std::make_unique<nano::mdb_wallets_store> (init_a.wallets_store_init, application_path_a / "wallets.ldb", config_a.lmdb_max_dbs)), wallets_store_impl (std::make_unique<nano::mdb_wallets_store> (init_a.wallets_store_init, application_path_a / "wallets.ldb", config_a.lmdb_max_dbs)),
@ -1486,7 +1487,7 @@ startup_time (std::chrono::steady_clock::now ())
{ {
if (node_l->config.logging.callback_logging ()) if (node_l->config.logging.callback_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Error resolving callback: %1%:%2%: %3%") % address % port % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Error resolving callback: %1%:%2%: %3%") % address % port % ec.message ()));
} }
node_l->stats.inc (nano::stat::type::error, nano::stat::detail::http_callback, nano::stat::dir::out); node_l->stats.inc (nano::stat::type::error, nano::stat::detail::http_callback, nano::stat::dir::out);
} }
@ -1525,7 +1526,7 @@ startup_time (std::chrono::steady_clock::now ())
// We see a valid non-replay vote for a block we requested, this node is probably a representative // We see a valid non-replay vote for a block we requested, this node is probably a representative
if (this->peers.rep_response (endpoint_a, vote_a->account, rep_weight)) if (this->peers.rep_response (endpoint_a, vote_a->account, rep_weight))
{ {
BOOST_LOG (log) << boost::str (boost::format ("Found a representative at %1%") % endpoint_a); logger.try_log (boost::str (boost::format ("Found a representative at %1%") % endpoint_a));
// Rebroadcasting all active votes to new representative // Rebroadcasting all active votes to new representative
auto blocks (this->active.list_blocks (true)); auto blocks (this->active.list_blocks (true));
for (auto i (blocks.begin ()), n (blocks.end ()); i != n; ++i) for (auto i (blocks.begin ()), n (blocks.end ()); i != n; ++i)
@ -1541,19 +1542,19 @@ startup_time (std::chrono::steady_clock::now ())
}); });
if (NANO_VERSION_PATCH == 0) if (NANO_VERSION_PATCH == 0)
{ {
BOOST_LOG (log) << "Node starting, version: " << NANO_MAJOR_MINOR_VERSION; logger.try_log ("Node starting, version: ", NANO_MAJOR_MINOR_VERSION);
} }
else else
{ {
BOOST_LOG (log) << "Node starting, version: " << NANO_MAJOR_MINOR_RC_VERSION; logger.try_log ("Node starting, version: ", NANO_MAJOR_MINOR_RC_VERSION);
} }
BOOST_LOG (log) << boost::str (boost::format ("Work pool running %1% threads") % work.threads.size ()); logger.try_log (boost::str (boost::format ("Work pool running %1% threads") % work.threads.size ()));
if (!init_a.error ()) if (!init_a.error ())
{ {
if (config.logging.node_lifetime_tracing ()) if (config.logging.node_lifetime_tracing ())
{ {
BOOST_LOG (log) << "Constructing node"; logger.try_log ("Constructing node");
} }
nano::genesis genesis; nano::genesis genesis;
auto transaction (store.tx_begin_write ()); auto transaction (store.tx_begin_write ());
@ -1564,12 +1565,12 @@ startup_time (std::chrono::steady_clock::now ())
} }
if (!store.block_exists (transaction, genesis.hash ())) if (!store.block_exists (transaction, genesis.hash ()))
{ {
BOOST_LOG (log) << "Genesis block not found. Make sure the node network ID is correct."; logger.try_log ("Genesis block not found. Make sure the node network ID is correct.");
std::exit (1); std::exit (1);
} }
node_id = nano::keypair (store.get_node_id (transaction)); node_id = nano::keypair (store.get_node_id (transaction));
BOOST_LOG (log) << "Node ID: " << node_id.pub.to_account (); logger.try_log ("Node ID: ", node_id.pub.to_account ());
} }
peers.online_weight_minimum = config.online_weight_minimum.number (); peers.online_weight_minimum = config.online_weight_minimum.number ();
if (nano::is_live_network || nano::is_beta_network) if (nano::is_live_network || nano::is_beta_network)
@ -1595,7 +1596,7 @@ startup_time (std::chrono::steady_clock::now ())
{ {
break; break;
} }
BOOST_LOG (log) << "Using bootstrap rep weight: " << account.to_account () << " -> " << weight.format_balance (Mxrb_ratio, 0, true) << " XRB"; logger.try_log ("Using bootstrap rep weight: ", account.to_account (), " -> ", weight.format_balance (Mxrb_ratio, 0, true), " XRB");
ledger.bootstrap_weights[account] = weight.number (); ledger.bootstrap_weights[account] = weight.number ();
} }
} }
@ -1607,7 +1608,7 @@ nano::node::~node ()
{ {
if (config.logging.node_lifetime_tracing ()) if (config.logging.node_lifetime_tracing ())
{ {
BOOST_LOG (log) << "Destructing node"; logger.try_log ("Destructing node");
} }
stop (); stop ();
} }
@ -1645,7 +1646,7 @@ void nano::node::do_rpc_callback (boost::asio::ip::tcp::resolver::iterator i_a,
{ {
if (node_l->config.logging.callback_logging ()) if (node_l->config.logging.callback_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Callback to %1%:%2% failed with status: %3%") % address % port % resp->result ()); node_l->logger.try_log (boost::str (boost::format ("Callback to %1%:%2% failed with status: %3%") % address % port % resp->result ()));
} }
node_l->stats.inc (nano::stat::type::error, nano::stat::detail::http_callback, nano::stat::dir::out); node_l->stats.inc (nano::stat::type::error, nano::stat::detail::http_callback, nano::stat::dir::out);
} }
@ -1654,7 +1655,7 @@ void nano::node::do_rpc_callback (boost::asio::ip::tcp::resolver::iterator i_a,
{ {
if (node_l->config.logging.callback_logging ()) if (node_l->config.logging.callback_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Unable complete callback: %1%:%2%: %3%") % address % port % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Unable complete callback: %1%:%2%: %3%") % address % port % ec.message ()));
} }
node_l->stats.inc (nano::stat::type::error, nano::stat::detail::http_callback, nano::stat::dir::out); node_l->stats.inc (nano::stat::type::error, nano::stat::detail::http_callback, nano::stat::dir::out);
}; };
@ -1664,7 +1665,7 @@ void nano::node::do_rpc_callback (boost::asio::ip::tcp::resolver::iterator i_a,
{ {
if (node_l->config.logging.callback_logging ()) if (node_l->config.logging.callback_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Unable to send callback: %1%:%2%: %3%") % address % port % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Unable to send callback: %1%:%2%: %3%") % address % port % ec.message ()));
} }
node_l->stats.inc (nano::stat::type::error, nano::stat::detail::http_callback, nano::stat::dir::out); node_l->stats.inc (nano::stat::type::error, nano::stat::detail::http_callback, nano::stat::dir::out);
} }
@ -1674,7 +1675,7 @@ void nano::node::do_rpc_callback (boost::asio::ip::tcp::resolver::iterator i_a,
{ {
if (node_l->config.logging.callback_logging ()) if (node_l->config.logging.callback_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Unable to connect to callback address: %1%:%2%: %3%") % address % port % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Unable to connect to callback address: %1%:%2%: %3%") % address % port % ec.message ()));
} }
node_l->stats.inc (nano::stat::type::error, nano::stat::detail::http_callback, nano::stat::dir::out); node_l->stats.inc (nano::stat::type::error, nano::stat::detail::http_callback, nano::stat::dir::out);
++i_a; ++i_a;
@ -1723,7 +1724,7 @@ void nano::node::process_fork (nano::transaction const & transaction_a, std::sha
} }
})) }))
{ {
BOOST_LOG (log) << boost::str (boost::format ("Resolving fork between our block: %1% and block %2% both with root %3%") % ledger_block->hash ().to_string () % block_a->hash ().to_string () % block_a->root ().to_string ()); logger.try_log (boost::str (boost::format ("Resolving fork between our block: %1% and block %2% both with root %3%") % ledger_block->hash ().to_string () % block_a->hash ().to_string () % block_a->root ().to_string ()));
network.broadcast_confirm_req (ledger_block); network.broadcast_confirm_req (ledger_block);
} }
} }
@ -1822,7 +1823,7 @@ void nano::gap_cache::vote (std::shared_ptr<nano::vote> vote_a)
{ {
if (!node_l->bootstrap_initiator.in_progress ()) if (!node_l->bootstrap_initiator.in_progress ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Missing block %1% which has enough votes to warrant lazy bootstrapping it") % hash.to_string ()); node_l->logger.try_log (boost::str (boost::format ("Missing block %1% which has enough votes to warrant lazy bootstrapping it") % hash.to_string ()));
} }
if (!node_l->flags.disable_lazy_bootstrap) if (!node_l->flags.disable_lazy_bootstrap)
{ {
@ -1868,7 +1869,7 @@ void nano::network::confirm_send (nano::confirm_ack const & confirm_a, std::shar
{ {
if (node.config.logging.network_publish_logging ()) if (node.config.logging.network_publish_logging ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Sending confirm_ack for block(s) %1%to %2% sequence %3%") % confirm_a.vote->hashes_string () % endpoint_a % std::to_string (confirm_a.vote->sequence)); node.logger.try_log (boost::str (boost::format ("Sending confirm_ack for block(s) %1%to %2% sequence %3%") % confirm_a.vote->hashes_string () % endpoint_a % std::to_string (confirm_a.vote->sequence)));
} }
std::weak_ptr<nano::node> node_w (node.shared ()); std::weak_ptr<nano::node> node_w (node.shared ());
node.network.send_buffer (bytes_a->data (), bytes_a->size (), endpoint_a, [bytes_a, node_w, endpoint_a](boost::system::error_code const & ec, size_t size_a) { node.network.send_buffer (bytes_a->data (), bytes_a->size (), endpoint_a, [bytes_a, node_w, endpoint_a](boost::system::error_code const & ec, size_t size_a) {
@ -1876,7 +1877,7 @@ void nano::network::confirm_send (nano::confirm_ack const & confirm_a, std::shar
{ {
if (ec && node_l->config.logging.network_logging ()) if (ec && node_l->config.logging.network_logging ())
{ {
BOOST_LOG (node_l->log) << boost::str (boost::format ("Error broadcasting confirm_ack to %1%: %2%") % endpoint_a % ec.message ()); node_l->logger.try_log (boost::str (boost::format ("Error broadcasting confirm_ack to %1%: %2%") % endpoint_a % ec.message ()));
} }
else else
{ {
@ -1940,7 +1941,7 @@ void nano::node::start ()
void nano::node::stop () void nano::node::stop ()
{ {
BOOST_LOG (log) << "Node stopping"; logger.try_log ("Node stopping");
block_processor.stop (); block_processor.stop ();
if (block_processor_thread.joinable ()) if (block_processor_thread.joinable ())
{ {
@ -2306,7 +2307,7 @@ public:
} }
else else
{ {
BOOST_LOG (this_l->node->log) << boost::str (boost::format ("Error resolving work peer: %1%:%2%: %3%") % current.first % current.second % ec.message ()); this_l->node->logger.try_log (boost::str (boost::format ("Error resolving work peer: %1%:%2%: %3%") % current.first % current.second % ec.message ()));
} }
this_l->start (); this_l->start ();
}); });
@ -2355,27 +2356,27 @@ public:
} }
else else
{ {
BOOST_LOG (this_l->node->log) << boost::str (boost::format ("Work peer responded with an error %1% %2%: %3%") % connection->address % connection->port % connection->response.result ()); this_l->node->logger.try_log (boost::str (boost::format ("Work peer responded with an error %1% %2%: %3%") % connection->address % connection->port % connection->response.result ()));
this_l->failure (connection->address); this_l->failure (connection->address);
} }
} }
else else
{ {
BOOST_LOG (this_l->node->log) << boost::str (boost::format ("Unable to read from work_peer %1% %2%: %3% (%4%)") % connection->address % connection->port % ec.message () % ec.value ()); this_l->node->logger.try_log (boost::str (boost::format ("Unable to read from work_peer %1% %2%: %3% (%4%)") % connection->address % connection->port % ec.message () % ec.value ()));
this_l->failure (connection->address); this_l->failure (connection->address);
} }
}); });
} }
else else
{ {
BOOST_LOG (this_l->node->log) << boost::str (boost::format ("Unable to write to work_peer %1% %2%: %3% (%4%)") % connection->address % connection->port % ec.message () % ec.value ()); this_l->node->logger.try_log (boost::str (boost::format ("Unable to write to work_peer %1% %2%: %3% (%4%)") % connection->address % connection->port % ec.message () % ec.value ()));
this_l->failure (connection->address); this_l->failure (connection->address);
} }
}); });
} }
else else
{ {
BOOST_LOG (this_l->node->log) << boost::str (boost::format ("Unable to connect to work_peer %1% %2%: %3% (%4%)") % connection->address % connection->port % ec.message () % ec.value ()); this_l->node->logger.try_log (boost::str (boost::format ("Unable to connect to work_peer %1% %2%: %3% (%4%)") % connection->address % connection->port % ec.message () % ec.value ()));
this_l->failure (connection->address); this_l->failure (connection->address);
} }
}); });
@ -2436,19 +2437,19 @@ public:
} }
else else
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Incorrect work response from %1% for root %2%: %3%") % address % root.to_string () % work_text); node->logger.try_log (boost::str (boost::format ("Incorrect work response from %1% for root %2%: %3%") % address % root.to_string () % work_text));
handle_failure (last); handle_failure (last);
} }
} }
else else
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Work response from %1% wasn't a number: %2%") % address % work_text); node->logger.try_log (boost::str (boost::format ("Work response from %1% wasn't a number: %2%") % address % work_text));
handle_failure (last); handle_failure (last);
} }
} }
catch (...) catch (...)
{ {
BOOST_LOG (node->log) << boost::str (boost::format ("Work response from %1% wasn't parsable: %2%") % address % body_a); node->logger.try_log (boost::str (boost::format ("Work response from %1% wasn't parsable: %2%") % address % body_a));
handle_failure (last); handle_failure (last);
} }
} }
@ -2484,7 +2485,7 @@ public:
{ {
if (backoff == 1 && node->config.logging.work_generation_time ()) if (backoff == 1 && node->config.logging.work_generation_time ())
{ {
BOOST_LOG (node->log) << "Work peer(s) failed to generate work for root " << root.to_string () << ", retrying..."; node->logger.try_log ("Work peer(s) failed to generate work for root ", root.to_string (), ", retrying...");
} }
auto now (std::chrono::steady_clock::now ()); auto now (std::chrono::steady_clock::now ());
auto root_l (root); auto root_l (root);
@ -2628,12 +2629,12 @@ public:
{ {
if (!node.store.block_exists (transaction, hash)) if (!node.store.block_exists (transaction, hash))
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Confirmed block is missing: %1%") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Confirmed block is missing: %1%") % hash.to_string ()));
assert (false && "Confirmed block is missing"); assert (false && "Confirmed block is missing");
} }
else else
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Block %1% has already been received") % hash.to_string ()); node.logger.try_log (boost::str (boost::format ("Block %1% has already been received") % hash.to_string ()));
} }
} }
} }
@ -2721,7 +2722,7 @@ nano::endpoint nano::network::endpoint ()
auto port (socket.local_endpoint (ec).port ()); auto port (socket.local_endpoint (ec).port ());
if (ec) if (ec)
{ {
BOOST_LOG (node.log) << "Unable to retrieve port: " << ec.message (); node.logger.try_log ("Unable to retrieve port: ", ec.message ());
} }
return nano::endpoint (boost::asio::ip::address_v6::loopback (), port); return nano::endpoint (boost::asio::ip::address_v6::loopback (), port);
} }
@ -2976,7 +2977,7 @@ void nano::network::send_buffer (uint8_t const * data_a, size_t size_a, nano::en
std::unique_lock<std::mutex> lock (socket_mutex); std::unique_lock<std::mutex> lock (socket_mutex);
if (node.config.logging.network_packet_logging ()) if (node.config.logging.network_packet_logging ())
{ {
BOOST_LOG (node.log) << "Sending packet"; node.logger.try_log ("Sending packet");
} }
if (on.load ()) if (on.load ())
{ {
@ -2989,7 +2990,7 @@ void nano::network::send_buffer (uint8_t const * data_a, size_t size_a, nano::en
} }
if (this->node.config.logging.network_packet_logging ()) if (this->node.config.logging.network_packet_logging ())
{ {
BOOST_LOG (this->node.log) << "Packet send complete"; this->node.logger.try_log ("Packet send complete");
} }
}); });
} }
@ -3158,7 +3159,7 @@ void nano::election::log_votes (nano::tally_t const & tally_a)
{ {
tally << boost::str (boost::format ("\n%1% %2%") % i->first.to_account () % i->second.hash.to_string ()); tally << boost::str (boost::format ("\n%1% %2%") % i->first.to_account () % i->second.hash.to_string ());
} }
BOOST_LOG (node.log) << tally.str (); node.logger.try_log (tally.str ());
} }
nano::election_vote_result nano::election::vote (nano::account rep, uint64_t sequence, nano::block_hash block_hash) nano::election_vote_result nano::election::vote (nano::account rep, uint64_t sequence, nano::block_hash block_hash)
@ -3418,7 +3419,7 @@ void nano::active_transactions::request_confirm (std::unique_lock<std::mutex> &
++j; ++j;
if (node.config.logging.vote_logging ()) if (node.config.logging.vote_logging ())
{ {
BOOST_LOG (node.log) << "Representative did not respond to confirm_req, retrying: " << rep_acct.to_account (); node.logger.try_log ("Representative did not respond to confirm_req, retrying: ", rep_acct.to_account ());
} }
} }
} }
@ -3514,7 +3515,7 @@ void nano::active_transactions::request_confirm (std::unique_lock<std::mutex> &
} }
if (unconfirmed_count > 0) if (unconfirmed_count > 0)
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("%1% blocks have been unconfirmed averaging %2% announcements") % unconfirmed_count % (unconfirmed_announcements / unconfirmed_count)); node.logger.try_log (boost::str (boost::format ("%1% blocks have been unconfirmed averaging %2% announcements") % unconfirmed_count % (unconfirmed_announcements / unconfirmed_count)));
} }
} }
@ -3673,7 +3674,7 @@ void nano::active_transactions::erase (nano::block const & block_a)
if (roots.find (nano::uint512_union (block_a.previous (), block_a.root ())) != roots.end ()) if (roots.find (nano::uint512_union (block_a.previous (), block_a.root ())) != roots.end ())
{ {
roots.erase (nano::uint512_union (block_a.previous (), block_a.root ())); roots.erase (nano::uint512_union (block_a.previous (), block_a.root ()));
BOOST_LOG (node.log) << boost::str (boost::format ("Election erased for block block %1% root %2%") % block_a.hash ().to_string () % block_a.root ().to_string ()); node.logger.try_log (boost::str (boost::format ("Election erased for block block %1% root %2%") % block_a.hash ().to_string () % block_a.root ().to_string ()));
} }
} }

View file

@ -489,7 +489,7 @@ public:
nano::node_flags flags; nano::node_flags flags;
nano::alarm & alarm; nano::alarm & alarm;
nano::work_pool & work; nano::work_pool & work;
boost::log::sources::logger_mt log; nano::logger_mt logger;
std::unique_ptr<nano::block_store> store_impl; std::unique_ptr<nano::block_store> store_impl;
nano::block_store & store; nano::block_store & store;
std::unique_ptr<nano::wallets_store> wallets_store_impl; std::unique_ptr<nano::wallets_store> wallets_store_impl;

View file

@ -597,75 +597,75 @@ logging (logging_a)
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Bind argument 2 error %1%") % arg2_error); logging.logger.always_log (boost::str (boost::format ("Bind argument 2 error %1%") % arg2_error));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Bind argument 1 error %1%") % arg1_error); logging.logger.always_log (boost::str (boost::format ("Bind argument 1 error %1%") % arg1_error));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Bind argument 0 error %1%") % arg0_error); logging.logger.always_log (boost::str (boost::format ("Bind argument 0 error %1%") % arg0_error));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Create kernel error %1%") % kernel_error); logging.logger.always_log (boost::str (boost::format ("Create kernel error %1%") % kernel_error));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Build program error %1%") % clBuildProgramError); logging.logger.always_log (boost::str (boost::format ("Build program error %1%") % clBuildProgramError));
for (auto i (selected_devices.begin ()), n (selected_devices.end ()); i != n; ++i) for (auto i (selected_devices.begin ()), n (selected_devices.end ()); i != n; ++i)
{ {
size_t log_size (0); size_t log_size (0);
clGetProgramBuildInfo (program, *i, CL_PROGRAM_BUILD_LOG, 0, nullptr, &log_size); clGetProgramBuildInfo (program, *i, CL_PROGRAM_BUILD_LOG, 0, nullptr, &log_size);
std::vector<char> log (log_size); std::vector<char> log (log_size);
clGetProgramBuildInfo (program, *i, CL_PROGRAM_BUILD_LOG, log.size (), log.data (), nullptr); clGetProgramBuildInfo (program, *i, CL_PROGRAM_BUILD_LOG, log.size (), log.data (), nullptr);
BOOST_LOG (logging.log) << log.data (); logging.logger.always_log (log.data ());
} }
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Create program error %1%") % program_error); logging.logger.always_log (boost::str (boost::format ("Create program error %1%") % program_error));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Item buffer error %1%") % item_error); logging.logger.always_log (boost::str (boost::format ("Item buffer error %1%") % item_error));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Result buffer error %1%") % result_error); logging.logger.always_log (boost::str (boost::format ("Result buffer error %1%") % result_error));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Attempt buffer error %1%") % attempt_error); logging.logger.always_log (boost::str (boost::format ("Attempt buffer error %1%") % attempt_error));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Unable to create command queue %1%") % queue_error); logging.logger.always_log (boost::str (boost::format ("Unable to create command queue %1%") % queue_error));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Unable to create context %1%") % createContextError); logging.logger.always_log (boost::str (boost::format ("Unable to create context %1%") % createContextError));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Requested device %1%, and only have %2%") % config.device % platform.devices.size ()); logging.logger.always_log (boost::str (boost::format ("Requested device %1%, and only have %2%") % config.device % platform.devices.size ()));
} }
} }
else else
{ {
BOOST_LOG (logging.log) << boost::str (boost::format ("Requested platform %1% and only have %2%") % config.platform % environment_a.platforms.size ()); logging.logger.always_log (boost::str (boost::format ("Requested platform %1% and only have %2%") % config.platform % environment_a.platforms.size ()));
} }
} }
@ -714,31 +714,31 @@ boost::optional<uint64_t> nano::opencl_work::generate_work (nano::uint256_union
else else
{ {
error = true; error = true;
BOOST_LOG (logging.log) << boost::str (boost::format ("Error finishing queue %1%") % finishError); logging.logger.always_log (boost::str (boost::format ("Error finishing queue %1%") % finishError));
} }
} }
else else
{ {
error = true; error = true;
BOOST_LOG (logging.log) << boost::str (boost::format ("Error reading result %1%") % read_error1); logging.logger.always_log (boost::str (boost::format ("Error reading result %1%") % read_error1));
} }
} }
else else
{ {
error = true; error = true;
BOOST_LOG (logging.log) << boost::str (boost::format ("Error enqueueing kernel %1%") % enqueue_error); logging.logger.always_log (boost::str (boost::format ("Error enqueueing kernel %1%") % enqueue_error));
} }
} }
else else
{ {
error = true; error = true;
BOOST_LOG (logging.log) << boost::str (boost::format ("Error writing item %1%") % write_error2); logging.logger.always_log (boost::str (boost::format ("Error writing item %1%") % write_error2));
} }
} }
else else
{ {
error = true; error = true;
BOOST_LOG (logging.log) << boost::str (boost::format ("Error writing attempt %1%") % write_error1); logging.logger.always_log (boost::str (boost::format ("Error writing attempt %1%") % write_error1));
} }
} }
boost::optional<uint64_t> value; boost::optional<uint64_t> value;
@ -758,7 +758,7 @@ std::unique_ptr<nano::opencl_work> nano::opencl_work::create (bool create_a, nan
nano::opencl_environment environment (error); nano::opencl_environment environment (error);
std::stringstream stream; std::stringstream stream;
environment.dump (stream); environment.dump (stream);
BOOST_LOG (logging_a.log) << stream.str (); logging_a.logger.always_log (stream.str ());
if (!error) if (!error)
{ {
result.reset (new nano::opencl_work (error, config_a, environment, logging_a)); result.reset (new nano::opencl_work (error, config_a, environment, logging_a));

View file

@ -36,12 +36,12 @@ void nano::port_mapping::refresh_devices ()
} }
if (check_count % 15 == 0) if (check_count % 15 == 0)
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("UPnP local address: %1%, discovery: %2%, IGD search: %3%") % local_address.data () % discover_error % igd_error); node.logger.try_log (boost::str (boost::format ("UPnP local address: %1%, discovery: %2%, IGD search: %3%") % local_address.data () % discover_error % igd_error));
if (node.config.logging.upnp_details_logging ()) if (node.config.logging.upnp_details_logging ())
{ {
for (auto i (devices); i != nullptr; i = i->pNext) for (auto i (devices); i != nullptr; i = i->pNext)
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("UPnP device url: %1% st: %2% usn: %3%") % i->descURL % i->st % i->usn); node.logger.try_log (boost::str (boost::format ("UPnP device url: %1% st: %2% usn: %3%") % i->descURL % i->st % i->usn));
} }
} }
} }
@ -63,7 +63,7 @@ void nano::port_mapping::refresh_mapping ()
auto add_port_mapping_error (UPNP_AddAnyPortMapping (urls.controlURL, data.first.servicetype, node_port.c_str (), node_port.c_str (), address.to_string ().c_str (), nullptr, protocol.name, nullptr, std::to_string (mapping_timeout).c_str (), actual_external_port.data ())); auto add_port_mapping_error (UPNP_AddAnyPortMapping (urls.controlURL, data.first.servicetype, node_port.c_str (), node_port.c_str (), address.to_string ().c_str (), nullptr, protocol.name, nullptr, std::to_string (mapping_timeout).c_str (), actual_external_port.data ()));
if (check_count % 15 == 0) if (check_count % 15 == 0)
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("UPnP %1% port mapping response: %2%, actual external port %3%") % protocol.name % add_port_mapping_error % actual_external_port.data ()); node.logger.try_log (boost::str (boost::format ("UPnP %1% port mapping response: %2%, actual external port %3%") % protocol.name % add_port_mapping_error % actual_external_port.data ()));
} }
if (add_port_mapping_error == UPNPCOMMAND_SUCCESS) if (add_port_mapping_error == UPNPCOMMAND_SUCCESS)
{ {
@ -115,7 +115,7 @@ int nano::port_mapping::check_mapping ()
} }
if (check_count % 15 == 0) if (check_count % 15 == 0)
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("UPnP %1% mapping verification response: %2%, external ip response: %3%, external ip: %4%, internal ip: %5%, remaining lease: %6%") % protocol.name % verify_port_mapping_error % external_ip_error % external_address.data () % address.to_string () % remaining_mapping_duration.data ()); node.logger.try_log (boost::str (boost::format ("UPnP %1% mapping verification response: %2%, external ip response: %3%, external ip: %4%, internal ip: %5%, remaining lease: %6%") % protocol.name % verify_port_mapping_error % external_ip_error % external_address.data () % address.to_string () % remaining_mapping_duration.data ()));
} }
} }
} }
@ -140,7 +140,7 @@ void nano::port_mapping::check_mapping_loop ()
wait_duration = 300; wait_duration = 300;
if (check_count < 10) if (check_count < 10)
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("UPnP No IGD devices found")); node.logger.try_log (boost::str (boost::format ("UPnP No IGD devices found")));
} }
} }
++check_count; ++check_count;
@ -163,7 +163,7 @@ void nano::port_mapping::stop ()
{ {
// Be a good citizen for the router and shut down our mapping // Be a good citizen for the router and shut down our mapping
auto delete_error (UPNP_DeletePortMapping (urls.controlURL, data.first.servicetype, std::to_string (protocol.external_port).c_str (), protocol.name, address.to_string ().c_str ())); auto delete_error (UPNP_DeletePortMapping (urls.controlURL, data.first.servicetype, std::to_string (protocol.external_port).c_str (), protocol.name, address.to_string ().c_str ()));
BOOST_LOG (node.log) << boost::str (boost::format ("Shutdown port mapping response: %1%") % delete_error); node.logger.always_log (boost::str (boost::format ("Shutdown port mapping response: %1%") % delete_error));
} }
} }
freeUPNPDevlist (devices); freeUPNPDevlist (devices);

View file

@ -40,7 +40,7 @@ void nano::rpc::start (bool rpc_enabled_a)
acceptor.bind (endpoint, ec); acceptor.bind (endpoint, ec);
if (ec) if (ec)
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Error while binding for RPC on port %1%: %2%") % endpoint.port () % ec.message ()); node.logger.always_log (boost::str (boost::format ("Error while binding for RPC on port %1%: %2%") % endpoint.port () % ec.message ()));
throw std::runtime_error (ec.message ()); throw std::runtime_error (ec.message ());
} }
@ -69,7 +69,7 @@ void nano::rpc::accept ()
} }
else else
{ {
BOOST_LOG (this->node.log) << boost::str (boost::format ("Error accepting RPC connections: %1% (%2%)") % ec.message () % ec.value ()); this->node.logger.always_log (boost::str (boost::format ("Error accepting RPC connections: %1% (%2%)") % ec.message () % ec.value ()));
} }
}); });
} }
@ -2291,7 +2291,7 @@ void nano::rpc_handler::payment_begin ()
wallet->free_accounts.erase (existing); wallet->free_accounts.erase (existing);
if (wallet->store.find (transaction, account) == wallet->store.end ()) if (wallet->store.find (transaction, account) == wallet->store.end ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Transaction wallet %1% externally modified listing account %2% as free but no longer exists") % id.to_string () % account.to_account ()); node.logger.always_log (boost::str (boost::format ("Transaction wallet %1% externally modified listing account %2% as free but no longer exists") % id.to_string () % account.to_account ()));
account.clear (); account.clear ();
} }
else else
@ -2299,7 +2299,7 @@ void nano::rpc_handler::payment_begin ()
auto block_transaction (node.store.tx_begin_read ()); auto block_transaction (node.store.tx_begin_read ());
if (!node.ledger.account_balance (block_transaction, account).is_zero ()) if (!node.ledger.account_balance (block_transaction, account).is_zero ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Skipping account %1% for use as a transaction account: non-zero balance") % account.to_account ()); node.logger.always_log (boost::str (boost::format ("Skipping account %1% for use as a transaction account: non-zero balance") % account.to_account ()));
account.clear (); account.clear ();
} }
} }
@ -4160,7 +4160,7 @@ void nano::rpc_connection::read ()
if (this_l->node->config.logging.log_rpc ()) if (this_l->node->config.logging.log_rpc ())
{ {
BOOST_LOG (this_l->node->log) << boost::str (boost::format ("RPC request %2% completed in: %1% microseconds") % std::chrono::duration_cast<std::chrono::microseconds> (std::chrono::steady_clock::now () - start).count () % request_id); this_l->node->logger.always_log (boost::str (boost::format ("RPC request %2% completed in: %1% microseconds") % std::chrono::duration_cast<std::chrono::microseconds> (std::chrono::steady_clock::now () - start).count () % request_id));
} }
}); });
auto method = this_l->request.method (); auto method = this_l->request.method ();
@ -4190,7 +4190,7 @@ void nano::rpc_connection::read ()
} }
else else
{ {
BOOST_LOG (this_l->node->log) << "RPC read error: " << ec.message (); this_l->node->logger.always_log ("RPC read error: ", ec.message ());
} }
}); });
} }
@ -4263,7 +4263,7 @@ void nano::rpc_handler::process_request ()
std::string action (request.get<std::string> ("action")); std::string action (request.get<std::string> ("action"));
if (node.config.logging.log_rpc ()) if (node.config.logging.log_rpc ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("%1% ") % request_id) << filter_request (request); rpc.node.logger.always_log (boost::str (boost::format ("%1% ") % request_id), filter_request (request));
} }
if (action == "account_balance") if (action == "account_balance")
{ {
@ -4795,7 +4795,7 @@ void nano::payment_observer::complete (nano::payment_status status)
{ {
if (rpc.node.config.logging.log_rpc ()) if (rpc.node.config.logging.log_rpc ())
{ {
BOOST_LOG (rpc.node.log) << boost::str (boost::format ("Exiting payment_observer for account %1% status %2%") % account.to_account () % static_cast<unsigned> (status)); rpc.node.logger.always_log (boost::str (boost::format ("Exiting payment_observer for account %1% status %2%") % account.to_account () % static_cast<unsigned> (status)));
} }
switch (status) switch (status)
{ {

View file

@ -441,7 +441,7 @@ void nano::landing::write_store ()
{ {
std::stringstream str; std::stringstream str;
store.serialize (str); store.serialize (str);
BOOST_LOG (node.log) << boost::str (boost::format ("Error writing store file %1%") % str.str ()); node.logger.always_log (boost::str (boost::format ("Error writing store file %1%") % str.str ()));
} }
} }
@ -502,13 +502,13 @@ void nano::landing::distribute_one ()
last = wallet->send_sync (store.source, store.destination, amount); last = wallet->send_sync (store.source, store.destination, amount);
if (!last.is_zero ()) if (!last.is_zero ())
{ {
BOOST_LOG (node.log) << boost::str (boost::format ("Successfully distributed %1% in block %2%") % amount % last.to_string ()); node.logger.always_log (boost::str (boost::format ("Successfully distributed %1% in block %2%") % amount % last.to_string ()));
store.last += distribution_interval.count (); store.last += distribution_interval.count ();
write_store (); write_store ();
} }
else else
{ {
BOOST_LOG (node.log) << "Error while sending distribution"; node.logger.always_log ("Error while sending distribution");
} }
} }
} }
@ -516,7 +516,7 @@ void nano::landing::distribute_one ()
void nano::landing::distribute_ongoing () void nano::landing::distribute_ongoing ()
{ {
distribute_one (); distribute_one ();
BOOST_LOG (node.log) << "Waiting for next distribution cycle"; node.logger.always_log ("Waiting for next distribution cycle");
node.alarm.add (std::chrono::steady_clock::now () + sleep_seconds, [this]() { distribute_ongoing (); }); node.alarm.add (std::chrono::steady_clock::now () + sleep_seconds, [this]() { distribute_ongoing (); });
} }

View file

@ -948,7 +948,7 @@ std::shared_ptr<nano::block> nano::wallet::receive_action (nano::block const & s
} }
else else
{ {
BOOST_LOG (wallets.node.log) << "Unable to receive, wallet locked"; wallets.node.logger.try_log ("Unable to receive, wallet locked");
} }
} }
else else
@ -963,14 +963,14 @@ std::shared_ptr<nano::block> nano::wallet::receive_action (nano::block const & s
} }
else else
{ {
BOOST_LOG (wallets.node.log) << boost::str (boost::format ("Not receiving block %1% due to minimum receive threshold") % hash.to_string ()); wallets.node.logger.try_log (boost::str (boost::format ("Not receiving block %1% due to minimum receive threshold") % hash.to_string ()));
// Someone sent us something below the threshold of receiving // Someone sent us something below the threshold of receiving
} }
if (block != nullptr) if (block != nullptr)
{ {
if (nano::work_validate (*block)) if (nano::work_validate (*block))
{ {
BOOST_LOG (wallets.node.log) << boost::str (boost::format ("Cached or provided work for block %1% account %2% is invalid, regenerating") % block->hash ().to_string () % account.to_account ()); wallets.node.logger.try_log (boost::str (boost::format ("Cached or provided work for block %1% account %2% is invalid, regenerating") % block->hash ().to_string () % account.to_account ()));
wallets.node.work_generate_blocking (*block); wallets.node.work_generate_blocking (*block);
} }
wallets.node.process_active (block); wallets.node.process_active (block);
@ -1012,7 +1012,7 @@ std::shared_ptr<nano::block> nano::wallet::change_action (nano::account const &
{ {
if (nano::work_validate (*block)) if (nano::work_validate (*block))
{ {
BOOST_LOG (wallets.node.log) << boost::str (boost::format ("Cached or provided work for block %1% account %2% is invalid, regenerating") % block->hash ().to_string () % source_a.to_account ()); wallets.node.logger.try_log (boost::str (boost::format ("Cached or provided work for block %1% account %2% is invalid, regenerating") % block->hash ().to_string () % source_a.to_account ()));
wallets.node.work_generate_blocking (*block); wallets.node.work_generate_blocking (*block);
} }
wallets.node.process_active (block); wallets.node.process_active (block);
@ -1098,7 +1098,7 @@ std::shared_ptr<nano::block> nano::wallet::send_action (nano::account const & so
{ {
if (nano::work_validate (*block)) if (nano::work_validate (*block))
{ {
BOOST_LOG (wallets.node.log) << boost::str (boost::format ("Cached or provided work for block %1% account %2% is invalid, regenerating") % block->hash ().to_string () % account_a.to_account ()); wallets.node.logger.try_log (boost::str (boost::format ("Cached or provided work for block %1% account %2% is invalid, regenerating") % block->hash ().to_string () % account_a.to_account ()));
wallets.node.work_generate_blocking (*block); wallets.node.work_generate_blocking (*block);
} }
wallets.node.process_active (block); wallets.node.process_active (block);
@ -1187,7 +1187,7 @@ void nano::wallet::work_update (nano::transaction const & transaction_a, nano::a
} }
else else
{ {
BOOST_LOG (wallets.node.log) << "Cached work no longer valid, discarding"; wallets.node.logger.try_log ("Cached work no longer valid, discarding");
} }
} }
@ -1204,7 +1204,7 @@ bool nano::wallet::search_pending ()
auto result (!store.valid_password (transaction)); auto result (!store.valid_password (transaction));
if (!result) if (!result)
{ {
BOOST_LOG (wallets.node.log) << "Beginning pending block search"; wallets.node.logger.try_log ("Beginning pending block search");
for (auto i (store.begin (transaction)), n (store.end ()); i != n; ++i) for (auto i (store.begin (transaction)), n (store.end ()); i != n; ++i)
{ {
auto block_transaction (wallets.node.store.tx_begin_read ()); auto block_transaction (wallets.node.store.tx_begin_read ());
@ -1220,17 +1220,17 @@ bool nano::wallet::search_pending ()
auto amount (pending.amount.number ()); auto amount (pending.amount.number ());
if (wallets.node.config.receive_minimum.number () <= amount) if (wallets.node.config.receive_minimum.number () <= amount)
{ {
BOOST_LOG (wallets.node.log) << boost::str (boost::format ("Found a pending block %1% for account %2%") % hash.to_string () % pending.source.to_account ()); wallets.node.logger.try_log (boost::str (boost::format ("Found a pending block %1% for account %2%") % hash.to_string () % pending.source.to_account ()));
wallets.node.block_confirm (wallets.node.store.block_get (block_transaction, hash)); wallets.node.block_confirm (wallets.node.store.block_get (block_transaction, hash));
} }
} }
} }
} }
BOOST_LOG (wallets.node.log) << "Pending block search phase complete"; wallets.node.logger.try_log ("Pending block search phase complete");
} }
else else
{ {
BOOST_LOG (wallets.node.log) << "Stopping search, wallet is locked"; wallets.node.logger.try_log ("Stopping search, wallet is locked");
} }
return result; return result;
} }
@ -1319,7 +1319,7 @@ void nano::wallet::work_cache_blocking (nano::account const & account_a, nano::b
*/ */
auto difficulty (nano::work_pool::publish_threshold); auto difficulty (nano::work_pool::publish_threshold);
BOOST_LOG (wallets.node.log) << "Work generation for " << root_a.to_string () << ", with a difficulty of " << difficulty << " complete: " << (std::chrono::duration_cast<std::chrono::microseconds> (std::chrono::steady_clock::now () - begin).count ()) << " us"; wallets.node.logger.try_log ("Work generation for ", root_a.to_string (), ", with a difficulty of ", difficulty, " complete: ", (std::chrono::duration_cast<std::chrono::microseconds> (std::chrono::steady_clock::now () - begin).count ()), " us");
} }
auto transaction (wallets.tx_begin_write ()); auto transaction (wallets.tx_begin_write ());
if (live () && store.exists (transaction, account_a)) if (live () && store.exists (transaction, account_a))
@ -1560,7 +1560,7 @@ void nano::wallets::foreach_representative (nano::transaction const & transactio
if (last_log < std::chrono::steady_clock::now () - std::chrono::seconds (60)) if (last_log < std::chrono::steady_clock::now () - std::chrono::seconds (60))
{ {
last_log = std::chrono::steady_clock::now (); last_log = std::chrono::steady_clock::now ();
BOOST_LOG (node.log) << boost::str (boost::format ("Representative locked inside wallet %1%") % i->first.to_string ()); node.logger.try_log (boost::str (boost::format ("Representative locked inside wallet %1%") % i->first.to_string ()));
} }
} }
} }