Wire-Cell News

Updates from the Wire-Cell team.

Logging

Out with cout and its an error to use cerr!

A user (or devloper) may sometimes want a silent job that emits no logging messages and in other cases a very verbose one. When verbosity is desired it is almost always for a specific part of the code and not everywhere. Sometimes the user wants to write logging to file, sometimes to stdout and sometimes to stderr. It is not uncommon for uncontrolled verbose logging to dominate job output and lead to real practical problems.

When the developer uses cout and cerr it leaves the user with no control over these messages. Recently WCT has added a logging system and use of cout and cerr is strongly discouraged, especially in library code.

The WCT logging system is a thin layer on top of spdlog. The spdlog package was chosen after a survey of likely candidates. It was chosen for some of the following reasons:

  • it is fast and thread safe
  • a header-only package and includes the nice fmt sub package
  • provides multiple loggers with individual levels
  • fairly undemanding of the code that uses it
  • may be integrated into application-level logging

The fact that spdlog is provided as a header-only library means that it can and has been added directly into WCT code so that the user need not install another external package.

The multiple logger feature is used to define a loosely coupled set of loggers identified by name. Any given logger should be used in whatever code might be considered associated. The use of given logger may span packages. For example, the glue logger is used in all "simple" DFP components that don't do anything special but housekeeping (eg, fanout/fanin type nodes). One can then turn up or down the log levels for these separate from say sigproc or img loggers.

As WCT is a toolkit meant to be embedded in larger frameworks or applications and as these tend to provide their own logging systems, it is important to provide a mechanism by which WCT logging may be integrated. The spdlog package allows for new message "sinks" to be developed. This provides the a logging vector from WCT logging to application or framework logging. Thus, a spdlog sink can be developed which simply forwards every message it is given to the app logging system.

More information on WCT logging can be found in the WCT manual.