summaryrefslogtreecommitdiff
path: root/doc/rtd/development/logging.rst
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rtd/development/logging.rst')
-rw-r--r--doc/rtd/development/logging.rst278
1 files changed, 278 insertions, 0 deletions
diff --git a/doc/rtd/development/logging.rst b/doc/rtd/development/logging.rst
new file mode 100644
index 00000000..e99eef8b
--- /dev/null
+++ b/doc/rtd/development/logging.rst
@@ -0,0 +1,278 @@
+.. _logging:
+
+Logging
+*******
+
+``Cloud-init`` supports both local and remote logging configurable through
+multiple configurations:
+
+- Python's built-in logging configuration
+- ``Cloud-init``'s event reporting system
+- The ``cloud-init`` ``rsyslog`` module
+
+Python logging
+==============
+
+``Cloud-init`` uses the Python logging module, and can accept config for this
+module using the standard Python ``fileConfig`` format. ``Cloud-init`` looks
+for config for the logging module under the ``logcfg`` key.
+
+.. note::
+ The logging configuration is not YAML, it is Python ``fileConfig`` format,
+ and is passed through directly to the Python logging module. Please use
+ the correct syntax for a multi-line string in YAML.
+
+By default, ``cloud-init`` uses the logging configuration provided in
+:file:`/etc/cloud/cloud.cfg.d/05_logging.cfg`. The default Python logging
+configuration writes all ``cloud-init`` events with a priority of ``WARNING``
+or higher to console, and writes all events with a level of ``DEBUG`` or
+higher to :file:`/var/log/cloud-init.log` and via :file:`syslog`.
+
+Python's ``fileConfig`` format consists of sections with headings in the
+format ``[title]`` and key value pairs in each section. Configuration for
+Python logging must contain the sections ``[loggers]``, ``[handlers]``, and
+``[formatters]``, which name the entities of their respective types that will
+be defined. The section name for each defined logger, handler and formatter
+will start with its type, followed by an underscore (``_``) and the name of
+the entity. For example, if a logger was specified with the name ``log01``,
+config for the logger would be in the section ``[logger_log01]``.
+
+Logger config entries contain basic logging setup. They may specify a list of
+handlers to send logging events to as well as the lowest priority level of
+events to handle. A logger named ``root`` must be specified and its
+configuration (under ``[logger_root]``) must contain a level and a list of
+handlers. A level entry can be any of the following: ``DEBUG``, ``INFO``,
+``WARNING``, ``ERROR``, ``CRITICAL``, or ``NOTSET``. For the ``root`` logger
+the ``NOTSET`` option will allow all logging events to be recorded.
+
+Each configured handler must specify a class under Python's ``logging``
+package namespace. A handler may specify a message formatter to use, a
+priority level, and arguments for the handler class. Common handlers are
+``StreamHandler``, which handles stream redirects (i.e., logging to
+``stderr``), and ``FileHandler`` which outputs to a log file. The logging
+module also supports logging over net sockets, over http, via smtp, and
+additional complex configurations. For full details about the handlers
+available for Python logging, please see the documentation for
+`python logging handlers`_.
+
+Log messages are formatted using the ``logging.Formatter`` class, which is
+configured using ``formatter`` config entities. A default format of
+``%(message)s`` is given if no formatter configs are specified. Formatter
+config entities accept a format string which supports variable replacements.
+These may also accept a ``datefmt`` string which may be used to configure the
+timestamp used in the log messages. The format variables ``%(asctime)s``,
+``%(levelname)s`` and ``%(message)s`` are commonly used and represent the
+timestamp, the priority level of the event and the event message. For
+additional information on logging formatters see `python logging formatters`_.
+
+.. note::
+ By default, the format string used in the logging formatter are in Python's
+ old style ``%s`` form. The ``str.format()`` and ``string.Template`` styles
+ can also be used by using ``{`` or ``$`` in place of ``%`` by setting the
+ ``style`` parameter in formatter config.
+
+A simple (but functional) Python logging configuration for ``cloud-init`` is
+below. It will log all messages of priority ``DEBUG`` or higher to both
+:file:`stderr` and :file:`/tmp/my.log` using a ``StreamHandler`` and a
+``FileHandler``, using the default format string ``%(message)s``: ::
+
+ logcfg: |
+ [loggers]
+ keys=root,cloudinit
+ [handlers]
+ keys=ch,cf
+ [formatters]
+ keys=
+ [logger_root]
+ level=DEBUG
+ handlers=
+ [logger_cloudinit]
+ level=DEBUG
+ qualname=cloudinit
+ handlers=ch,cf
+ [handler_ch]
+ class=StreamHandler
+ level=DEBUG
+ args=(sys.stderr,)
+ [handler_cf]
+ class=FileHandler
+ level=DEBUG
+ args=('/tmp/my.log',)
+
+For additional information about configuring Python's logging module, please
+see the documentation for `python logging config`_.
+
+.. _logging_command_output:
+
+Command output
+==============
+
+``Cloud-init`` can redirect its :file:`stdout` and :file:`stderr` based on
+config given under the ``output`` config key. The output of any commands run
+by ``cloud-init`` and any user or vendor scripts provided will also be
+included here. The ``output`` key accepts a dictionary for configuration.
+Output files may be specified individually for each stage (``init``,
+``config``, and ``final``), or a single key ``all`` may be used to specify
+output for all stages.
+
+The output for each stage may be specified as a dictionary of ``output`` and
+``error`` keys, for :file:`stdout` and :file:`stderr` respectively, as a tuple
+with :file:`stdout` first and :file:`stderr` second, or as a single string to
+use for both. The strings passed to all of these keys are handled by the
+system shell, so any form of redirection that can be used in bash is valid,
+including piping ``cloud-init``'s output to ``tee``, or ``logger``. If only a
+filename is provided, ``cloud-init`` will append its output to the file as
+though ``>>`` was specified.
+
+By default, ``cloud-init`` loads its output configuration from
+:file:`/etc/cloud/cloud.cfg.d/05_logging.cfg`. The default config directs both
+:file:`stdout` and :file:`stderr` from all ``cloud-init`` stages to
+:file:`/var/log/cloud-init-output.log`. The default config is given as: ::
+
+ output: { all: "| tee -a /var/log/cloud-init-output.log" }
+
+For a more complex example, the following configuration would output the init
+stage to :file:`/var/log/cloud-init.out` and :file:`/var/log/cloud-init.err`,
+for :file:`stdout` and :file:`stderr` respectively, replacing anything that
+was previously there. For the config stage, it would pipe both :file:`stdout`
+and :file:`stderr` through :command:`tee -a /var/log/cloud-config.log`. For
+the final stage it would append the output of :file:`stdout` and
+:file:`stderr` to :file:`/var/log/cloud-final.out` and
+:file:`/var/log/cloud-final.err` respectively. ::
+
+ output:
+ init:
+ output: "> /var/log/cloud-init.out"
+ error: "> /var/log/cloud-init.err"
+ config: "tee -a /var/log/cloud-config.log"
+ final:
+ - ">> /var/log/cloud-final.out"
+ - "/var/log/cloud-final.err"
+
+Event reporting
+===============
+
+``Cloud-init`` contains an eventing system that allows events to be emitted
+to a variety of destinations.
+
+Three configurations are available for reporting events:
+
+- ``webhook``: POST to a web server.
+- ``log``: Write to the ``cloud-init`` log at configurable log level.
+- ``stdout``: Print to :file:`stdout`.
+
+The default configuration is to emit events to the ``cloud-init`` log file
+at ``DEBUG`` level.
+
+Event reporting can be configured using the ``reporting`` key in
+``cloud-config`` user data.
+
+Configuration
+-------------
+
+``webhook``
+^^^^^^^^^^^
+
+.. code-block:: yaml
+
+ reporting:
+ <user-defined name>:
+ type: webhook
+ endpoint: <url>
+ timeout: <timeout in seconds>
+ retries: <number of retries>
+ consumer_key: <OAuth consumer key>
+ token_key: <OAuth token key>
+ token_secret: <OAuth token secret>
+ consumer_secret: <OAuth consumer secret>
+
+``endpoint`` is the only additional required key when specifying
+``type: webhook``.
+
+``log``
+^^^^^^^
+
+.. code-block:: yaml
+
+ reporting:
+ <user-defined name>:
+ type: log
+ level: <DEBUG|INFO|WARN|ERROR|FATAL>
+
+``level`` is optional and defaults to "DEBUG".
+
+``print``
+^^^^^^^^^
+
+.. code-block:: yaml
+
+ reporting:
+ <user-defined name>:
+ type: print
+
+
+Example
+^^^^^^^
+
+The follow example shows configuration for all three sources:
+
+.. code-block:: yaml
+
+ #cloud-config
+ reporting:
+ webserver:
+ type: webhook
+ endpoint: "http://10.0.0.1:55555/asdf"
+ timeout: 5
+ retries: 3
+ consumer_key: <consumer_key>
+ token_key: <token_key>
+ token_secret: <token_secret>
+ consumer_secret: <consumer_secret>
+ info_log:
+ type: log
+ level: WARN
+ stdout:
+ type: print
+
+``rsyslog`` module
+==================
+
+``Cloud-init``'s ``cc_rsyslog`` module allows for fully customizable
+``rsyslog`` configuration under the ``rsyslog`` config key. The simplest way
+to use the ``rsyslog`` module is by specifying remote servers under the
+``remotes`` key in ``rsyslog`` config. The ``remotes`` key takes a dictionary
+where each key represents the name of an ``rsyslog`` server and each value is
+the configuration for that server. The format for server config is:
+
+ - optional filter for log messages (defaults to ``*.*``)
+ - optional leading ``@`` or ``@@``, indicating UDP and TCP respectively
+ (defaults to ``@``, for UDP)
+ - IPv4 or IPv6 hostname or address. IPv6 addresses must be in ``[::1]``
+ format (e.g., ``@[fd00::1]:514``)
+ - optional port number (defaults to ``514``)
+
+For example, to send logging to an ``rsyslog`` server named ``log_serv`` with
+address ``10.0.4.1``, using port number ``514``, over UDP, with all log
+messages enabled one could use either of the following.
+
+With all options specified::
+
+ rsyslog:
+ remotes:
+ log_serv: "*.* @10.0.4.1:514"
+
+With defaults used::
+
+ rsyslog:
+ remotes:
+ log_serv: "10.0.4.1"
+
+
+For more information on ``rsyslog`` configuration, see
+:ref:`our module reference page<mod-rsyslog>`.
+
+.. LINKS:
+.. _python logging config: https://docs.python.org/3/library/logging.config.html#configuration-file-format
+.. _python logging handlers: https://docs.python.org/3/library/logging.handlers.html
+.. _python logging formatters: https://docs.python.org/3/library/logging.html#formatter-objects