Channel
Channels are named output streams that can be configured and redirected individually. All system components use so called channels to produce output. Channels also take care of character set conversion and (optionally) XML formatting. They are used for logging and for storing small data structures in XML format. A Channel inherits from std::ostream so the usage is intuitive. The content written to a channel is sent to its targets. Channels are named output streams that can be configured and redirected individually. Channels are managed by a singleton Core::Channel::Manager that wraps rdbuf of std::cout and std::cerr, which might cause problems under certain circumstances.
Channels cause NO (!) overhead compared to standard streams if you use only a single destination stream. Multiple destination streams through redirection have the overhead of making multiple copies of the data to be written (conversion to character strings occurs only once!).
Upon creation a Channel determines its set of targets via the
standard configuration process. E.g. if your component is
called "recognizer" then Channel(config, "statistics"), will
look for a resource matching "recognizer.statistics.channel".
The resource’s value is interpreted as a comma separated list
of target names, specifying were the channel’s data is sent.
Channel Configuration
Upon creation a Channel determines its set of targets via the standard configuration process. E.g. if your component is called recognizer and owns a channel named statistics, then the channel can be configured with a resource matching recognizer.statistics.channel.
Channel Targets
The following channel targets are predefined:
- stdout
standard output of process
- stderr
standard error output of process
- nil
suppress output
All other target names cause the channel manager to create additional targets as needed. Each target is a configurable object registered under <application-title>.channels.<target-name>. If the target name contains a dot, only the part after the dot is used as parameter name. By default a channel target will open a file by its own name and write all output to this file. This can be overridden with the file parameter.
Channel targets can be configured in several ways:
The file name can be changed to something different from the target name using the
"file"parameter.If the file already exists it is overwritten by default. By setting
"append"to true, the channel manager will append to the file instead of overwriting.File output is buffered by default, which can cause long delay in the output. Set
"unbuffered"to change to line-buffering mode.Internally channels expect to be provided with UTF-8 encoded character data. (Plain ASCII is a subset of UTF-8.) It is possible to specify a specific output encoding for each channel target, by setting the parameter
"encoding"(ISO-8859-1 by default, set viaCore::defaultEncodinginsrc/Core/Unicode.hh). The channel will convert the data into this character set encoding upon output.Channels feature automatic word-wrapping, which is disabled by default. To enable word-wrapping, set the parameter
"margin"to the number of characters per line.XML (and possibly other) text is automatically indented. The parameter “indentation” controls the depth of indentation. Naturally, a value of zero, disable auto-indentation.
zlib compression can be activated using the “compressed” parameter. The filename will be extended by the suffix
".gz"if not already present
You can check whether a channel’s output is actually used by calling isOpen(). Make use of this especially if your output needs additional calculations.
For plain text output use Channel. If you want to produce XML output, use the derived class Core::XmlChannel.
Target Parameters
- file
The file name can be changed to something different from the target name using the file parameter.
- append
If the file already exists it is overwritten by default. By setting append to true, the channel manager will append to the file instead of overwriting.
- unbuffered
File output is buffered by default, which can cause long delay in the output. Set unbuffered to change to line-buffering mode.
- encoding
Internally channels expect to be provided with UTF-8 encoded character data. (Plain ASCII is a subset of UTF-8.) It is possible to specify a specific output encoding for each channel target, by setting the parameter encoding (ISO-8859-1 by default). The channel will convert the data into this character set encoding upon output.
- margin
Channels feature automatic word-wrapping, which is disabled by default. To enable word-wrapping, set the parameter margin to the number of characters per line.
- indentation
XML (and possibly other) text is automatically indented. The parameter indentation controls the depth of indentation. Naturally, a value of zero, disables auto-indentation.
- compressed
zlib compression can be activated using the compressed parameter. The filename will be extended by the suffix “.gz” if not already present
Example
[*]
log.channel = output-channel
warning.channel = output-channel, stderr
error.channel = output-channel, stderr
dot.channel = nil
All channels named log of all components (because of the leading *) are assigned to a target named output-channel.
The channels named warning and error (which are used for reporting of warning and error messages) will sent their output to the output-channel target and additionally to the standard error output.
The output of all dot channels is suppressed.
Now we define the properties of the output-channel target:
[*.channels.output-channel]
file = log/my-logfile.log
append = false
encoding = UTF-8
unbuffered = true
compressed = false
Thus, the content of output-channel will be written unbuffered and uncompressed to a file log/my-logfile.log using UTF-8 encoding. If the file already exists, it will be overwritten.
Default Channels
Most components write to the following channels:
- error
error messages
- warning
warning messages
- log
log messages
The Application provide the following channels:
- system-info
information about the machine and the operating system
- version
software version information
- configuration
dump all configured parameters
- configuration-usage
dump used configurated parameters together with the requesting component
- time
run time