1313 * @brief
1414 */
1515
16+ #include " shambase/stacktrace.hpp"
1617#include " shambase/term_colors.hpp"
1718#include " shamcmdopt/env.hpp"
1819#include " shamcmdopt/tty.hpp"
@@ -186,6 +187,73 @@ namespace logformatter {
186187 shambase::term_colors::bold ());
187188 }
188189
190+ /* *
191+ * @brief Log formatter for style 3, full details + time
192+ * @brief Log formatter for style 4, full details + time
193+ * @param args The arguments for the log formatter
194+ * @return std::string The formatted log
195+ */
196+ std::string style4_formatter_full (const logger::ReformatArgs &args) {
197+
198+ u32 tty_width = shamcmdopt::get_tty_columns ();
199+
200+ std::string ansi_reset = shambase::term_colors::reset ();
201+ std::string ansi_faint = shambase::term_colors::faint ();
202+
203+ std::string lineend = shambase::format (
204+ " {5:} [{3:}][rank={6:}][{7:.2f}s]{2:}" ,
205+ args.color ,
206+ args.level_name ,
207+ ansi_reset,
208+ args.module_name ,
209+ args.content ,
210+ ansi_faint,
211+ shamcomm::world_rank (),
212+ shambase::details::get_wtime ());
213+
214+ std::string log = shambase::format (
215+ " {0:}{1:}{2:}: {4:}" ,
216+ args.color ,
217+ args.level_name ,
218+ ansi_reset,
219+ args.module_name ,
220+ args.content ,
221+ ansi_faint,
222+ shamcomm::world_rank ());
223+
224+ std::string log_line1, log_line2;
225+ size_t first_nl = log.find_first_of (' \n ' );
226+ if (first_nl != std::string::npos) {
227+ log_line1 = log.substr (0 , first_nl);
228+ log_line2 = log.substr (first_nl);
229+ } else {
230+ log_line1 = log;
231+ log_line2 = " " ;
232+ }
233+
234+ u32 ansi_count = ansi_reset.size () * 2 + ansi_faint.size () + args.color .size ();
235+
236+ return shambase::format (" {:<{}}" , log_line1, tty_width - lineend.size () + ansi_count - 1 )
237+ + lineend + log_line2;
238+ }
239+
240+ /* *
241+ * @brief Log formatter for style 3, simple details + time
242+ * @brief Log formatter for style 4, simple details
243+ * @param args The arguments for the log formatter
244+ * @return std::string The formatted log
245+ */
246+ std::string style4_formatter_simple (const logger::ReformatArgs &args) {
247+ return shambase::format (
248+ " {5:}{3:}{2:}: {4:}" ,
249+ args.color ,
250+ args.level_name ,
251+ shambase::term_colors::reset (),
252+ args.module_name ,
253+ args.content ,
254+ shambase::term_colors::bold ());
255+ }
256+
189257 /* *
190258 * @brief The callback called when an exception is thrown
191259 *
@@ -201,7 +269,7 @@ namespace logformatter {
201269} // namespace logformatter
202270
203271std::string SHAMLOGFORMATTER = shamcmdopt::getenv_str_default_register(
204- " SHAMLOGFORMATTER" , " 3" , " Change the log formatter (values :0-3 ) [default: 3]" );
272+ " SHAMLOGFORMATTER" , " 3" , " Change the log formatter (values :0-4 ) [default: 3]" );
205273
206274std::string SHAMLOG_ERR_ON_EXCEPT = shamcmdopt::getenv_str_default_register(
207275 " SHAMLOG_ERR_ON_EXCEPT" , " 1" , " Enable logging of exceptions (default to 1)" );
@@ -224,6 +292,9 @@ namespace shamsys {
224292 } else if (SHAMLOGFORMATTER == " 3" ) {
225293 logger::change_formaters (
226294 logformatter::style3_formatter_full, logformatter::style3_formatter_simple);
295+ } else if (SHAMLOGFORMATTER == " 4" ) {
296+ logger::change_formaters (
297+ logformatter::style4_formatter_full, logformatter::style4_formatter_simple);
227298 } else {
228299 logger::err_ln (" Log" , " Unknown formatter" );
229300 shambase::throw_unimplemented (" Unknown formatter" );
0 commit comments