Log stable filename (#2534)
* Support stable log filename on rotation * Add to toml test
This commit is contained in:
		
					parent
					
						
							
								9d9d377fce
							
						
					
				
			
			
				commit
				
					
						b63a535fa4
					
				
			
		
					 3 changed files with 46 additions and 1 deletions
				
			
		| 
						 | 
					@ -202,6 +202,7 @@ TEST (toml, daemon_config_deserialize_defaults)
 | 
				
			||||||
	ASSERT_EQ (conf.node.logging.network_telemetry_logging_value, defaults.node.logging.network_telemetry_logging_value);
 | 
						ASSERT_EQ (conf.node.logging.network_telemetry_logging_value, defaults.node.logging.network_telemetry_logging_value);
 | 
				
			||||||
	ASSERT_EQ (conf.node.logging.rotation_size, defaults.node.logging.rotation_size);
 | 
						ASSERT_EQ (conf.node.logging.rotation_size, defaults.node.logging.rotation_size);
 | 
				
			||||||
	ASSERT_EQ (conf.node.logging.single_line_record_value, defaults.node.logging.single_line_record_value);
 | 
						ASSERT_EQ (conf.node.logging.single_line_record_value, defaults.node.logging.single_line_record_value);
 | 
				
			||||||
 | 
						ASSERT_EQ (conf.node.logging.stable_log_filename, defaults.node.logging.stable_log_filename);
 | 
				
			||||||
	ASSERT_EQ (conf.node.logging.timing_logging_value, defaults.node.logging.timing_logging_value);
 | 
						ASSERT_EQ (conf.node.logging.timing_logging_value, defaults.node.logging.timing_logging_value);
 | 
				
			||||||
	ASSERT_EQ (conf.node.logging.active_update_value, defaults.node.logging.active_update_value);
 | 
						ASSERT_EQ (conf.node.logging.active_update_value, defaults.node.logging.active_update_value);
 | 
				
			||||||
	ASSERT_EQ (conf.node.logging.upnp_details_logging_value, defaults.node.logging.upnp_details_logging_value);
 | 
						ASSERT_EQ (conf.node.logging.upnp_details_logging_value, defaults.node.logging.upnp_details_logging_value);
 | 
				
			||||||
| 
						 | 
					@ -467,6 +468,7 @@ TEST (toml, daemon_config_deserialize_no_defaults)
 | 
				
			||||||
	node_lifetime_tracing = true
 | 
						node_lifetime_tracing = true
 | 
				
			||||||
	rotation_size = 999
 | 
						rotation_size = 999
 | 
				
			||||||
	single_line_record = true
 | 
						single_line_record = true
 | 
				
			||||||
 | 
						stable_log_filename = true
 | 
				
			||||||
	timing = true
 | 
						timing = true
 | 
				
			||||||
	active_update = true
 | 
						active_update = true
 | 
				
			||||||
	upnp_details = true
 | 
						upnp_details = true
 | 
				
			||||||
| 
						 | 
					@ -598,6 +600,7 @@ TEST (toml, daemon_config_deserialize_no_defaults)
 | 
				
			||||||
	ASSERT_NE (conf.node.logging.node_lifetime_tracing_value, defaults.node.logging.node_lifetime_tracing_value);
 | 
						ASSERT_NE (conf.node.logging.node_lifetime_tracing_value, defaults.node.logging.node_lifetime_tracing_value);
 | 
				
			||||||
	ASSERT_NE (conf.node.logging.rotation_size, defaults.node.logging.rotation_size);
 | 
						ASSERT_NE (conf.node.logging.rotation_size, defaults.node.logging.rotation_size);
 | 
				
			||||||
	ASSERT_NE (conf.node.logging.single_line_record_value, defaults.node.logging.single_line_record_value);
 | 
						ASSERT_NE (conf.node.logging.single_line_record_value, defaults.node.logging.single_line_record_value);
 | 
				
			||||||
 | 
						ASSERT_NE (conf.node.logging.stable_log_filename, defaults.node.logging.stable_log_filename);
 | 
				
			||||||
	ASSERT_NE (conf.node.logging.timing_logging_value, defaults.node.logging.timing_logging_value);
 | 
						ASSERT_NE (conf.node.logging.timing_logging_value, defaults.node.logging.timing_logging_value);
 | 
				
			||||||
	ASSERT_NE (conf.node.logging.active_update_value, defaults.node.logging.active_update_value);
 | 
						ASSERT_NE (conf.node.logging.active_update_value, defaults.node.logging.active_update_value);
 | 
				
			||||||
	ASSERT_NE (conf.node.logging.upnp_details_logging_value, defaults.node.logging.upnp_details_logging_value);
 | 
						ASSERT_NE (conf.node.logging.upnp_details_logging_value, defaults.node.logging.upnp_details_logging_value);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,9 +68,48 @@ void nano::logging::init (boost::filesystem::path const & application_path_a)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		auto path = application_path_a / "log";
 | 
					//clang-format off
 | 
				
			||||||
		file_sink = 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 = format_with_timestamp);
 | 
					#if BOOST_VERSION < 107000
 | 
				
			||||||
 | 
							if (stable_log_filename)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								stable_log_filename = false;
 | 
				
			||||||
 | 
								std::cerr << "The stable_log_filename config setting is only available when building with Boost 1.70 or later. Reverting to old behavior." << std::endl;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							auto path = application_path_a / "log";
 | 
				
			||||||
 | 
							if (stable_log_filename)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					#if BOOST_VERSION >= 107000
 | 
				
			||||||
 | 
								// Logging to node.log and node_<pattern> instead of log_<pattern>.log is deliberate. This way,
 | 
				
			||||||
 | 
								// existing log monitoring scripts expecting the old logfile structure will fail immediately instead
 | 
				
			||||||
 | 
								// of reading only rotated files with old entries.
 | 
				
			||||||
 | 
								file_sink = boost::log::add_file_log (boost::log::keywords::target = path,
 | 
				
			||||||
 | 
								boost::log::keywords::file_name = path / "node.log",
 | 
				
			||||||
 | 
								boost::log::keywords::target_file_name = path / "node_%Y-%m-%d_%H-%M-%S.%N.log",
 | 
				
			||||||
 | 
								boost::log::keywords::open_mode = std::ios_base::out | std::ios_base::app, // append to node.log if it exists
 | 
				
			||||||
 | 
								boost::log::keywords::enable_final_rotation = false, // for stable log filenames, don't rotate on destruction
 | 
				
			||||||
 | 
								boost::log::keywords::rotation_size = rotation_size, // max file size in bytes before rotation
 | 
				
			||||||
 | 
								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, // max total size in bytes of all log files
 | 
				
			||||||
 | 
								boost::log::keywords::format = format_with_timestamp);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
								assert (false);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								file_sink = 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 = format_with_timestamp);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						//clang-format on
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void nano::logging::release_file_sink ()
 | 
					void nano::logging::release_file_sink ()
 | 
				
			||||||
| 
						 | 
					@ -109,6 +148,7 @@ nano::error nano::logging::serialize_toml (nano::tomlconfig & toml) const
 | 
				
			||||||
	toml.put ("flush", flush, "If enabled, immediately flush new entries to log file.\nWarning: this may negatively affect logging performance.\ntype:bool");
 | 
						toml.put ("flush", flush, "If enabled, immediately flush new entries to log file.\nWarning: this may negatively affect logging performance.\ntype:bool");
 | 
				
			||||||
	toml.put ("min_time_between_output", min_time_between_log_output.count (), "Minimum time that must pass for low priority entries to be logged.\nWarning: decreasing this value may result in a very large amount of logs.\ntype:milliseconds");
 | 
						toml.put ("min_time_between_output", min_time_between_log_output.count (), "Minimum time that must pass for low priority entries to be logged.\nWarning: decreasing this value may result in a very large amount of logs.\ntype:milliseconds");
 | 
				
			||||||
	toml.put ("single_line_record", single_line_record_value, "Keep log entries on single lines.\ntype:bool");
 | 
						toml.put ("single_line_record", single_line_record_value, "Keep log entries on single lines.\ntype:bool");
 | 
				
			||||||
 | 
						toml.put ("stable_log_filename", stable_log_filename, "Append to log/node.log without a timestamp in the filename.\nThe file is not emptied on startup if it exists, but appended to.\ntype:bool");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return toml.get_error ();
 | 
						return toml.get_error ();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -142,6 +182,7 @@ nano::error nano::logging::deserialize_toml (nano::tomlconfig & toml)
 | 
				
			||||||
	auto min_time_between_log_output_l = min_time_between_log_output.count ();
 | 
						auto min_time_between_log_output_l = min_time_between_log_output.count ();
 | 
				
			||||||
	toml.get ("min_time_between_output", min_time_between_log_output_l);
 | 
						toml.get ("min_time_between_output", min_time_between_log_output_l);
 | 
				
			||||||
	min_time_between_log_output = std::chrono::milliseconds (min_time_between_log_output_l);
 | 
						min_time_between_log_output = std::chrono::milliseconds (min_time_between_log_output_l);
 | 
				
			||||||
 | 
						toml.get ("stable_log_filename", stable_log_filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return toml.get_error ();
 | 
						return toml.get_error ();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,6 +89,7 @@ public:
 | 
				
			||||||
	bool flush{ true };
 | 
						bool flush{ true };
 | 
				
			||||||
	uintmax_t max_size{ 128 * 1024 * 1024 };
 | 
						uintmax_t max_size{ 128 * 1024 * 1024 };
 | 
				
			||||||
	uintmax_t rotation_size{ 4 * 1024 * 1024 };
 | 
						uintmax_t rotation_size{ 4 * 1024 * 1024 };
 | 
				
			||||||
 | 
						bool stable_log_filename{ false };
 | 
				
			||||||
	std::chrono::milliseconds min_time_between_log_output{ 5 };
 | 
						std::chrono::milliseconds min_time_between_log_output{ 5 };
 | 
				
			||||||
	bool single_line_record_value{ false };
 | 
						bool single_line_record_value{ false };
 | 
				
			||||||
	static void release_file_sink ();
 | 
						static void release_file_sink ();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue