Open vSwitch (OVS) is a virtual switch used in production from small to large scale deployments. It is designed to provide network automation along with support for a number of management interfaces and protocols.
However, the developer or the administrator might need to understand more of what is going on under the hoods and OVS does a good job providing a very good logging facility which is the subject of this article.
Editor's note: Red Hat Knowledgebase - "What Red Hat products provide support for Open vSwitch?"
Introduction
The OVS logging facility provides not only flexibility but granularity as well. Different from other software packages that you have a single logging output and a set of few message levels, OVS provides control over three possible outputs and message levels per module. It comes ready out-of-box and it can be controlled at runtime.
Controlling the outputs
One common scenario is to log to a file. The ovs-vswitchd(8) accepts the option --log-file[=file] to enable logging to a specific file. The file argument is actually optional, so if it is specified, it is used as the exact name for the log file. The default is used if file is not specified. Usually the default is /var/log/openvswitch/ovs-vswitch.log but it can change depending on compile time options. The correct information is available in the man-page.
Another common scenario is to log to syslog. The ovs-vswitchd(8) provides an option to specify a remote syslog server (--syslog-target=host:port) and an option to specify the method to be used (--syslog-method) which can be libc syslog(), unix:file or udp:ip:port.
The last method is the console output. It doesn't require specific configuration parameters. However, logging to console will have no effect if --detach is used because ovs-vswitchd will close its standard file descriptors.
Controlling the logging levels
Usually increasing log level is a concern on production environments because it can cause undesired side effects. OVS has internal modules and the logging facility is capable of setting specific message levels for each of them. This granularity helps to reduce the overall impact and in turn enables its usage in production.
The list of modules can change for different reasons, so use the command below to see the list of available modules at runtime.
# ovs-appctl vlog/list console syslog file ------- ------ ------ backtrace OFF ERR INFO bfd OFF ERR INFO bond OFF ERR INFO bridge OFF ERR INFO bundle OFF ERR INFO bundles OFF ERR INFO cfm OFF ERR INFO collectors OFF ERR INFO command_line OFF ERR INFO connmgr OFF ERR INFO conntrack OFF ERR INFO ...
The list above is far from being complete because for example OVS 2.5 provides more than 90 modules. The screenshot above shows four columns. The module's name used in the commands is in the first column, the second column is the minimum message level required for the message to be sent on console output. The third column is the same but for syslog output and the last column controls the file log output.
The logging levels can be off, emer, err, warn, info or dbg. Messages of the given severity or higher will be logged while others will be filtered out.
Those levels can be set using command line parameter --verbose=[spec] where the argument can set a level for everything, or to specific output, or even to specific module on specific output. Using the command line is specially useful to debug during the initialization, otherwise the levels can be easily modified at runtime.
The levels for each output can be modified using -v<output>:<level> syntax where the <output> is either console, syslog or file. For example, -vconsole:emer would set the minimum required log level to be emer.
The defaults usually are -vconsole:emer -vsyslog:err -vfile:info.
What about runtime? There is a tool called ovs-appctl(8) to manage logging. Actually the 'vlog' is the only subcommand documented in its man-page because other subcommands are registered during initialization of the modules. Anyway, this is probably a topic for another future blog post maybe.
Coming back to ovs-appctl, there is the vlog/list to list the modules and their levels for each output as shown already. And there is the vlog/set to manage the list. See below some interesting examples with outputs.
This is an example setting all modules on all output to dbg. # ovs-appctl vlog/set dbg # ovs-appctl vlog/list | head -n 10 console syslog file ------- ------ ------ backtrace DBG DBG DBG bfd DBG DBG DBG bond DBG DBG DBG bridge DBG DBG DBG bundle DBG DBG DBG bundles DBG DBG DBG cfm DBG DBG DBG collectors DBG DBG DBG This is an example of turning off all messages to console. # ovs-appctl vlog/set console:off # ovs-appctl vlog/list | head -n 10 console syslog file ------- ------ ------ backtrace OFF DBG DBG bfd OFF DBG DBG bond OFF DBG DBG bridge OFF DBG DBG bundle OFF DBG DBG bundles OFF DBG DBG cfm OFF DBG DBG collectors OFF DBG DBG This example sets cfm module logging level to emer only for the console output. # ovs-appctl vlog/set console:cfm:emer # ovs-appctl vlog/list | head -n 10 console syslog file ------- ------ ------ backtrace OFF DBG DBG bfd OFF DBG DBG bond OFF DBG DBG bridge OFF DBG DBG bundle OFF DBG DBG bundles OFF DBG DBG cfm EMER DBG DBG collectors OFF DBG DBG The tool accepts multiple arguments so the following example changes cfm log level for different outputs at the same time. # ovs-appctl vlog/set console:cfm:emer syslog:cfm:info file:cfm:off # ovs-appctl vlog/list | grep cfm cfm EMER INFO OFF
There is more. The tool ovs-appctl provides things like changing the log pattern, or reopen the file log, or change the syslog facility (RFC5424). The reader can find the details in the tool's man-page.
Conclusion
OVS is more than a simple virtual switch. It is programmable and has many features built-in. The fact that OVS provides a great deal of flexibility and granularity managing logging helps to support it, specially in production environments.