cmacmackin / flogging

Fortran logging library
GNU Lesser General Public License v3.0
56 stars 3 forks source link

Flogging: Fortran Logging Library

GitHub license GitHub release Travis Codecov

Flogging provides an easy-to-use interface for logging events and errors in Fortran applications and libraries. Its use and functionality is similar to that of logging library in Python. It is meant to be used for providing warnings, error messages, debug information, or routine output which should be logged. It is not ideal for all output, such as that used to prompt the user for input.

Documentation

Often in software it is desirable to print output to the screen and to a log-file simultaneously. Furthermore, it is often useful to to vary the amount of output depending on verbosity settings. These requirements tend to result in at least four lines of coding being needed to output even a single line of information, and more if, e.g., the time of the IO is to be included in the information.

The solution to this is a logging library. This library encapsulates in its procedures all of the logic needed to accomplish the above requirements. At the start of execution, it can be told how verbose it should be and then will be able to handle all decisions about what should be printed. Furthermore, it will include in the message a time-stamp, a colour-coded label for the type of message, and it provide a standard format for messages.

Flogger provides a module called logger_mod, which implements an object called a logger. This contains methods for outputting the following types of messages:

Each type of message is assigned a priority, ranging from 10 (debug) to 60 (fatal). The priority value for each type of message is specified in a parameter of the same name. Depending on the priority of the message, it may be printed to a log file, standard out, and/or standard error.

While users can instantiate a logger instance and use that, it is recommended that they use the master_logger object provided in the logger_mod module. This way, multiple libraries can make calls to the same logger and all information will end up in the same log file.

Usage

Before using the master logger, logger_init must be called to set the logging file and what priority messages will be printed. The call signature is

subroutine logger_init(logfile, stderr_threshold, stdout_threshold, &
                       logfile_threshold)

Arguments are:

A message is logged by calling the type-bound subroutine with the same name as the desired message type. These subroutines take the following arguments:

Example

program logging_example
  use logger_mod, only: logger_init, logger => master_logger

  ! Initialise the logger prior to use
  call logger_init()

  ! Write some debugging information
  call logger%debug('logger_example','Starting program logger_example')

  ! Perform some calculation
  ! ...
  call logger%info('logger_example','Found result of calculation')

  ! Perform another calculation
  ! ...
  ! Oh no, an error has occurred
  call logger%error('logger_example','Calculation failed due to error')

  call logger%debug('logger_example','Ending program logger_example')
end program logging_example

This produces the following output to the screen.

Output from the example program above

Note that debug information is not displayed, as its priority falls below the default threshold for this.

API

Detailed API documentation is available in the Github pages of this repository and can be generated locally using the FORD tool.

Installation

The easiest way to install Flogging is via the FLATPack repository for the Spack package manager. It can be installed with the command

spack install flogging

If compiling manually, you will need to have the FACE library installed. It is recommended that you compile Flogging using the FoBiS.py (≥v2.2.2) tool, which can be installed from PyPI. The provided fobos configuration file allows the library to be compiled with the command

FoBiS.py build -mode COMPILER-LIBTYPE -dlib FACELOCATION -i FACEMODLOCATION

where COMPILER is either gnu or intel, LIBTYPE is either static or shared, FACELOCATION is the path to the directory containing the compiled FACE library in either static or shared format, and FACEMODLOCATION is the path to the directory containing the .mod file for FACE.

A makefile is provided with this repository, but is not officially supported. It has been configured for the developer's computer and will not work elsewhere without modification.

To Do

License

Flogging is licensed under the GNU Lesser General Public License (LGPL) v3.0 or later. The terms are provided in the file LICENSE. The LGPL make reference to the GNU General Public License (GPL), which is provided in the file GPL. In brief, the LGPL allows this library to be linked to software under any license (with a few, minor, restrictions). However, should a modified version of the library itself be released, it must be licensed under the terms of the LGPL or GPL.