This is an example of how to use the logger.
#include <thread>
#include <chrono>
BOOST_LOG_SCOPED_THREAD_ATTR("Timeline", attrs::timer());
MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Hello, world!";
std::this_thread::sleep_for(std::chrono::milliseconds(300));
MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Hello, second time world!";
}
MOFEM_LOG(
"SYNC", Sev::verbose) <<
"Hello, sync!";
MOFEM_LOG(
"SYNC", Sev::verbose) <<
"Hello again, sync!";
}
MOFEM_LOG(
"SYNC", Sev::verbose) <<
"Hello, sync!";
MOFEM_LOG(
"SYNC", Sev::verbose) <<
"Hello again, sync!";
}
static char help[] =
"...\n\n";
int main(
int argc,
char *argv[]) {
try {
moab::Core mb_instance;
moab::Interface &moab = mb_instance;
CHKERR PetscPrintf(PETSC_COMM_WORLD,
"\nTesting logging for obsolete way of printing "
"messages\nnext line\nnext line\n\n");
CHKERR PetscPrintf(PETSC_COMM_WORLD,
"Ala have ");
CHKERR PetscPrintf(PETSC_COMM_WORLD,
"a ");
CHKERR PetscPrintf(PETSC_COMM_WORLD,
"cat\n");
CHKERR PetscPrintf(PETSC_COMM_WORLD,
"WARNING\n");
{
MOFEM_LOG(
"WORLD", Sev::error) <<
"Hello, self error!";
MOFEM_LOG(
"WORLD", Sev::warning) <<
"Hello, self warning!";
MOFEM_LOG(
"WORLD", Sev::inform) <<
"Hello, self inform!";
MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Hello, self verbose!";
MOFEM_LOG(
"WORLD", Sev::noisy) <<
"Hello, self noisy!";
}
{
MOFEM_LOG_C(
"WORLD", Sev::inform,
"%s %d %d %d",
"Hello C, self error!",
1, 2, 3);
}
{
}
auto core_log = logging::core::get();
core_log->add_sink(
LogManager::createSink(LogManager::getStrmSelf(), "ATOM_TEST"));
LogManager::setLog("ATOM_TEST");
core_log->add_sink(LogManager::createSink(
boost::make_shared<std::ofstream>("log0.log"), "ATOM_TEST"));
logging::add_file_log(keywords::file_name = "log1.log",
keywords::filter =
MoFEM::LogKeywords::channel == "ATOM_TEST");
auto backend = boost::make_shared<sinks::text_ostream_backend>();
backend->add_stream(boost::make_shared<std::ofstream>("log2.log"));
auto sink = boost::make_shared<LogManager::SinkType>(backend);
sink->set_filter((expr::has_attr(MoFEM::LogKeywords::channel) &&
MoFEM::LogKeywords::channel == "ATOM_TEST"));
core_log->add_sink(sink);
MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"Test atom test channel";
}
}
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
#define MOFEM_LOG_C(channel, severity, format,...)
#define CATCH_ERRORS
Catch errors.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
#define MOFEM_LOG_ATTRIBUTES(channel, bit)
Add attributes to channel.
#define MOFEM_LOG_FUNCTION()
Set scope.
MoFEMErrorCode log_fun1()
MoFEMErrorCode log_fun3()
MoFEMErrorCode log_fun2()
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
virtual MPI_Comm & get_comm() const =0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.