![]() |
HPX uses a sophisticated logging framework allowing to follow in detail what operations have been performed inside the HPX library in what sequence. This information proves to be very useful for diagnosing problems or just for improving the understanding what is happening in HPX as a consequence of invoking HPX API functionality.
Enabling default logging is a simple process. The detailed description in the remainder of this section explains different ways to customize the defaults. Default logging can be enabled by using one of the following:
--hpx:debug-hpx-log
,
which will enable logging to the console terminal
--hpx:debug-hpx-log=<filename>
, which enables logging to
a given file <filename>
, or
HPX_LOGLEVEL=<loglevel>
while running the HPX
application. In this case <loglevel>
should be a number between (or equal to) 1
and 5
, where 1
means minimal logging and 5
causes to log all available messages.
When setting a the environment variable the logs will be written to
a file named hpx.<PID>.log
in the current working directory,
where <PID>
is the process id of the console
instance of the application.
Generally, logging can be customized either using environment variable settings or using by an ini configuration file. Logging is generated in several categories, each of which can be customized independently. All customizable configuration parameters have reasonable defaults, allowing to use logging without any additional configuration effort. The following table lists the available categories.
Table 9. Logging categories
Category |
Category shortcut |
Information to be generated |
Environment variable |
---|---|---|---|
General |
None |
Logging information generated by different subsystems of HPX, such as thread-manager, parcel layer, LCOs, etc. |
|
AGAS |
|
Logging output generated by the AGAS subsystem |
|
Application |
|
Logging generated by applications. |
|
By default, all logging output is redirected to the console instance of an application, where it is collected and written to a file, one file for each logging category.
Each logging category can be customized at two levels, the parameters for
each are stored in the ini configuration sections hpx.logging.CATEGORY
and hpx.logging.console.CATEGORY
(where 'CATEGORY' is the category
shortcut as listed in the table above). The former influences logging at
the source locality and the latter modifies the logging behaviour for each
of the categories at the console instance of an application.
All HPX logging output have seven different logging levels. These levels can be set explicitly or through environmental variables in the main HPX ini file as shown below. The logging levels and their associated integral values are shown in the table below, ordered from most verbose to least verbose. By default, all HPX logs are set to 0, e.g. all logging output is disabled by default.
Table 10. Logging levels
Logging level |
Integral value |
---|---|
<debug> |
|
<info> |
|
<warning> |
|
<error> |
|
<fatal> |
|
No logging |
|
![]() |
Tip |
---|---|
The easiest way to enable logging output is to set the environment variable
corresponding to the logging category to an integral value as described
in the table above. For instance, setting |
Logs will be saved to destinations as configured by the user. By default,
logging output is saved on the console instance of an application to hpx.<CATEGORY>.<PID>.log
(where <CATEGORY>
and <PID>
are placeholders for the category shortcut
and the OS process id). The output for the general logging category is
saved to hpx.<PID>.log
. The default settings for the general
logging category are shown here (the syntax is described in the section
The HPX
INI File Format):
[hpx.logging] level = ${HPX_LOGLEVEL:0} destination = ${HPX_LOGDESTINATION:console} format = ${HPX_LOGFORMAT:(T%locality%/%hpxthread%.%hpxphase%/%hpxcomponent%) P%parentloc%/%hpxparent%.%hpxparentphase% %time%($hh:$mm.$ss.$mili) [%idx%]|\\n}
The logging level is taken from the environment variable HPX_LOGLEVEL
and defaults to zero, e.g.
no logging. The default logging destination is read from the environment
variable HPX_LOGDESTINATION
.
On any of the localities it defaults to console
which redirects all generated logging output to the console instance of
an application. The following table lists the possible destinations for
any logging output. It is possible to specify more than one destination
separated by whitespace.
Table 11. Logging destinations
Logging destination |
Description |
---|---|
file(<filename>) |
Direct all output to a file with the given <filename>. |
cout |
Direct all output to the local standard output of the application instance on this locality. |
cerr |
Direct all output to the local standard error output of the application instance on this locality. |
console |
Direct all output to the console instance of the application. The console instance has its logging destinations configured separately. |
android_log |
Direct all output to the (Android) system log (available on Android systems only). |
The logging format is read from the environment variable HPX_LOGFORMAT
and it defaults to a complex
format description. This format consists of several placeholder fields
(for instance %locality%
) which will be replaced by concrete values
when the logging output is generated. All other information is transferred
verbatim to the output. The table below describes the available field placeholders.
The separator character |
separates the logging message prefix formatted as shown and the actual
log message which will replace the separator.
Table 12. Available field placeholders
Name |
Description |
---|---|
locality |
The id of the locality on which the logging message was generated. |
hpxthread |
The id of the HPX-thread generating this logging output. |
hpxphase |
The phase[a] of the HPX-thread generating this logging output. |
hpxcomponent |
The local virtual address of the component which the current HPX-thread is accessing. |
parentloc |
The id of the locality where the HPX thread was running which initiated the current HPX-thread. The current HPX-thread is generating this logging output. |
hpxparent |
The id of the HPX-thread which initiated the current HPX-thread. The current HPX-thread is generating this logging output. |
hpxparentphase |
The phase of the HPX-thread when it initiated the current HPX-thread. The current HPX-thread is generating this logging output. |
time |
The time stamp for this logging outputline as generated by the source locality. |
idx |
The sequence number of the logging output line as generated on the source locality. |
osthread |
The sequence number of the OS-thread which executes the current HPX-thread. |
[a] The phase of a HPX-thread counts how often this thread has been activated |
![]() |
Note |
---|---|
Not all of the field placeholder may be expanded for all generated logging
output. If no value is available for a particular field it is replaced
with a sequence of |
Here is an example line from a logging output generated by one of the HPX examples (please note that this is generated on a single line, without line break):
(T00000000/0000000002d46f90.01/00000000009ebc10) P--------/0000000002d46f80.02 17:49.37.320 [000000000000004d] <info> [RT] successfully created component {0000000100ff0001, 0000000000030002} of type: component_barrier[7(3)]
The default settings for the general logging category on the console is shown here:
[hpx.logging.console] level = ${HPX_LOGLEVEL:$[hpx.logging.level]} destination = ${HPX_CONSOLE_LOGDESTINATION:file(hpx.$[system.pid].log)} format = ${HPX_CONSOLE_LOGFORMAT:|}
These settings define how the logging is customized once the logging output
is received by the console instance of an application. The logging level
is read from the environment variable HPX_LOGLEVEL
(as set for the console instance of the application). The level defaults
to the same values as the corresponding settings in the general logging
configuration shown before. The destination on the console instance is
set to be a file which name is generated based from its OS process id.
Setting the environment variable HPX_CONSOLE_LOGDESTINATION
allows customization of the naming scheme for the output file. The logging
format is set to leave the original logging output unchanged, as received
from one of the localities the application runs on.