SU2 icon indicating copy to clipboard operation
SU2 copied to clipboard

Adding logger to SU2

Open kursatyurt opened this issue 1 year ago • 2 comments

There is a lot of boilerplate code in the code base for screen output like

 if (rank == MASTER_NODE) {
cout << "My Message" << endl;
}

This is not a good example from many points of view.

From performance-wise overly used std::endl is a killer. If one needs to redirect output to file it is additional loss etc. From the user's perspective, it is not possible to set the logging level. At least a three-level logging would be nice (INFO/WARNING/DEBUG) this also makes life easier for developers too.

It is also nice to have a rotating log file if one runs longer cases on the HPC systems. After a while the log files getting so bloating

Describe the solution you'd like

A configurable logger would be better with defaults not changing the current system

% LOGGING LOCATIONS default is SCREEN
LOG= (SCREEN, FILE)
% Default  is SU2.log
LOG_FILE = "myLog.log"
% Logging level INFO/DEBUG 
LOG_LEVEL = "DEBUG" 

In the code

For general messages

INFO <<  "My useful information";
DEBUG << "Operation done in "  << time << " seconds";

There is also a lot of --------------- Start Solver ---------- type headers in the code we can automate this as

HEADER << "Start Solver"; 

Describe alternatives you've considered

A proper choice of logging library is required. Alternatives I considered:

AixLog

  • Header only
  • Vanilla C++11, no dependencies
  • Uses << operator
  • MIT licence

spdlog

  • Header only/compiled
  • C++11
  • Uses LOG("") syntax
  • More users/mature project
  • MIT licence

easylogging

  • Header only
  • C++11
  • Uses << operator
  • MIT licence

glog

  • C++14 required the codebase must be bumped (may not be worth it)
  • Uses << operator
  • Google Licence (IDK if it comp. with GPL)

I am in favor of spdlog library

Additional context Add any other context or screenshots about the feature request here.

kursatyurt avatar Mar 28 '23 10:03 kursatyurt

This is a nice-to-have but there are 2600 uses of cout << in SU2, are you sure you want to refactor all of them? If you pick something with operator << it will be easier.

pcarruscag avatar Mar 29 '23 09:03 pcarruscag

There are some tricks possible to add the << operator. Not all the code base needs refactoring. We can have both styles for the future as () syntax is very powerful thanks to fmtlib.

cout << "Values at node<< nodeId << " are " << val[0] << " " << val[1] << " " << val[3] << endl;

can be transformed directly to

LOG("Values at node {} are {}",nodeId,val);

Equivalently

LOG << fmt::format("Values at node {} are {}",nodeId,val); 

kursatyurt avatar Mar 29 '23 10:03 kursatyurt