kibana/docs/setup/configuring-logging.asciidoc
Mirko Bez 2ed9f18fc0
Update configuring-logging.asciidoc (#180835)
Update levels ordering

## Summary

The documentation is currently reporting a misleading information
https://www.elastic.co/guide/en/kibana/current/logging-configuration.html#log-level:

<img width="546" alt="image"
src="573f82c5-51f8-4e32-a85d-6895cc1b2041">


indeed the "maximum" should be off and the "minimum" should be all,
because:

>A log record will be logged by the logger if its level **(ed: its
refers to log)** is higher than or equal to the level of its logger.
Otherwise, the log record is ignored.

There is no value smaller than all that will result in all types of logs
being outputted.

### Checklist

Delete any items that are not applicable to this PR.

### For maintainers

- [ ] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)

---------

Co-authored-by: Christiane (Tina) Heiligers <christiane.heiligers@elastic.co>
2024-04-19 08:45:59 +02:00

700 lines
20 KiB
Text

[[logging-configuration]]
== Configure logging
The {kib} logging system has three main components: _loggers_, _appenders_ and _layouts_. These components allow us to log messages according to message type and level, to control how these messages are formatted and where the final logs will be displayed or stored.
- <<loggers-appenders-layout>>
- <<log-level>>
- <<logging-layouts>>
- <<logger-hierarchy>>
[float]
[[loggers-appenders-layout]]
=== Loggers, Appenders and Layouts
__Loggers__ define what logging settings should be applied to a particular logger.
__<<logging-appenders,Appenders>>__ define where log messages are displayed (eg. stdout or console) and stored (eg. file on the disk).
__<<logging-layouts,Layouts>>__ define how log messages are formatted and what type of information they include.
[float]
[[log-level]]
=== Log level
Currently we support the following log levels: _off_, _fatal_, _error_, _warn_, _info_, _debug_, _trace_, _all_.
Levels are ordered, so _off_ > _fatal_ > _error_ > _warn_ > _info_ > _debug_ > _trace_ > _all_.
A log record will be logged by the logger if its level is higher than or equal to the level of its logger. For example:
If the output of an API call is configured to log at the `info` level and the parameters passed to the API call are set to `debug`, with a global logging configuration in `kibana.yml` set to `debug`, both the output _and_ parameters are logged. If the log level is set to `info`, the debug logs are ignored, meaning that you'll only get a record for the API output and _not_ for the parameters.
Logging set at a plugin level is always respected, regardless of the `root` logger level. In other words, if root logger is set to fatal and pluginA logging is set to `debug`, debug logs are only shown for pluginA, with other logs only reporting on `fatal`.
The _all_ and _off_ levels can only be used in configuration and are handy shortcuts that allow you to log every log record or disable logging entirely for a specific logger. These levels can also be specified using <<logging-cli-migration,cli arguments>>.
[float]
[[logging-layouts]]
=== Layouts
Every appender should know exactly how to format log messages before they are written to the console or file on the disk.
This behavior is controlled by the layouts and configured through `appender.layout` configuration property for every
custom appender. Currently we don't define any default layout for the
custom appenders, so one should always make the choice explicitly.
There are two types of layout supported at the moment: <<pattern-layout,`pattern`>> and <<json-layout,`json`>>.
[float]
[[pattern-layout]]
==== Pattern layout
With `pattern` layout it's possible to define a string pattern with special placeholders `%conversion_pattern` that will be replaced with data from the actual log message. By default the following pattern is used: `[%date][%level][%logger] %message`.
NOTE: The `pattern` layout uses a sub-set of https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout[log4j 2 pattern syntax] and **doesn't implement** all `log4j 2` capabilities.
The conversions that are provided out of the box are:
**level**
Outputs the <<log-level,level>> of the logging event.
Example of `%level` output: `TRACE`, `DEBUG`, `INFO`.
**logger**
Outputs the name of the logger that published the logging event.
Example of `%logger` output: `server`, `server.http`, `server.http.kibana`.
**message**
Outputs the application supplied message associated with the logging event.
**meta**
Outputs the entries of `meta` object data in **json** format, if one is present in the event.
Example of `%meta` output:
[source,bash]
----
// Meta{from: 'v7', to: 'v8'}
'{"from":"v7","to":"v8"}'
// Meta empty object
'{}'
// no Meta provided
''
----
[float]
[[date-format]]
**date**
Outputs the date of the logging event. The date conversion specifier may be followed by a set of braces containing a name of predefined date format and canonical timezone name.
Timezone name is expected to be one from https://en.wikipedia.org/wiki/List_of_tz_database_time_zones[TZ database name].
Timezone defaults to the host timezone when not explicitly specified.
Example of `%date` output:
[float]
[[date-conversion-pattern-examples]]
[options="header"]
|===
| Conversion pattern | Example
| `%date`
| `2012-02-01T14:30:22.011Z` uses `ISO8601` format by default
| `%date{ISO8601}`
| `2012-02-01T14:30:22.011Z`
| `%date{ISO8601_TZ}`
| `2012-02-01T09:30:22.011-05:00` `ISO8601` with timezone
| `%date{ISO8601_TZ}{America/Los_Angeles}`
| `2012-02-01T06:30:22.011-08:00`
| `%date{ABSOLUTE}`
| `09:30:22.011`
| `%date{ABSOLUTE}{America/Los_Angeles}`
| `06:30:22.011`
| `%date{UNIX}`
| `1328106622`
| `%date{UNIX_MILLIS}`
| `1328106622011`
|===
**pid**
Outputs the process ID.
The pattern layout also offers a `highlight` option that allows you to highlight
some parts of the log message with different colors. Highlighting is quite handy if log messages are forwarded
to a terminal with color support.
[float]
[[json-layout]]
==== JSON layout
With `json` layout log messages will be formatted as JSON strings in https://www.elastic.co/guide/en/ecs/current/ecs-reference.html[ECS format] that includes a timestamp, log level, logger, message text and any other metadata that may be associated with the log message itself.
[float]
[[logger-hierarchy]]
=== Logger hierarchy
Every logger has a unique name that follows a hierarchical naming rule. The logger is considered to be an
ancestor of another logger if its name followed by a `.` is a prefix of the descendant logger. For example, a logger
named `a.b` is an ancestor of logger `a.b.c`. All top-level loggers are descendants of a special `root` logger at the top of the logger hierarchy. The `root` logger always exists, is fully configured and logs to `info` level by default. The `root` logger must also be configured if any other logging configuration is specified in your `kibana.yml`.
You can configure _<<log-level, log level>>_ and _appenders_ for a specific logger. If a logger only has a _log level_ configured, then the _appenders_ configuration applied to the logger is inherited from the ancestor logger, up to the `root` logger.
NOTE: In the current implementation we __don't support__ so called _appender additivity_ when log messages are forwarded to _every_ distinct appender within the
ancestor chain including `root`. That means that log messages are only forwarded to appenders that are configured for a particular logger. If a logger doesn't have any appenders configured, the configuration of that particular logger will be inherited from its closest ancestor.
[float]
[[dedicated-loggers]]
===== Dedicated loggers
**Root**
The `root` logger has a dedicated configuration node since this logger is special and should always exist. By default `root` is configured with `info` level and `default` appender that is also always available. This is the configuration that all custom loggers will use unless they're re-configured explicitly.
For example to see _all_ log messages that fall back on the `root` logger configuration, just add one line to the configuration:
[source,yaml]
----
logging.root.level: all
----
Or disable logging entirely with `off`:
[source,yaml]
----
logging.root.level: off
----
**Metrics Logs**
The `metrics.ops` logger is configured with `debug` level and will automatically output sample system and process information at a regular interval.
The metrics that are logged are a subset of the data collected and are formatted in the log message as follows:
[options="header"]
|===
| Ops formatted log property | Location in metrics service | Log units
| memory | process.memory.heap.used_in_bytes | http://numeraljs.com/#format[depends on the value], typically MB or GB
| uptime | process.uptime_in_millis | HH:mm:ss
| load | os.load | [ "load for the last 1 min" "load for the last 5 min" "load for the last 15 min"]
| delay | process.event_loop_delay | ms
|===
The log interval is the same as the interval at which system and process information is refreshed and is configurable under `ops.interval`:
[source,yaml]
----
ops.interval: 5000
----
The minimum interval is 100ms and defaults to 5000ms.
[[request-response-logger]]
**Request and Response Logs**
The `http.server.response` logger is configured with `debug` level and will automatically output
data about http requests and responses occurring on the {kib} server.
The message contains some high-level information, and the corresponding log meta contains the following:
[options="header"]
|===
| Meta property | Description | Format
| client.ip | IP address of the requesting client | ip
| http.request.method | http verb for the request (uppercase) | string
| http.request.mime_type | (optional) mime as specified in the headers | string
| http.request.referrer | (optional) referrer | string
| http.request.headers | request headers | object
| http.response.body.bytes | (optional) Calculated response payload size in bytes | number
| http.response.status_code | status code returned | number
| http.response.headers | response headers | object
| http.response.responseTime | (optional) Calculated response time in ms | number
| url.path | request path | string
| url.query | (optional) request query string | string
| user_agent.original | raw user-agent string provided in request headers | string
|===
[float]
[[logging-appenders]]
=== Appenders
[float]
[[rolling-file-appender]]
==== Rolling File Appender
Similar to Log4j's `RollingFileAppender`, this appender will log into a file, and rotate it following a rolling
strategy when the configured policy triggers.
[float]
====== Triggering Policies
The triggering policy determines when a rollover should occur.
There are currently two policies supported: `size-limit` and `time-interval`.
[float]
[[size-limit-triggering-policy]]
**Size-limit triggering policy**
This policy will rotate the file when it reaches a predetermined size.
[source,yaml]
----
logging:
appenders:
rolling-file:
type: rolling-file
fileName: /var/logs/kibana.log
policy:
type: size-limit
size: 50mb
strategy:
//...
layout:
type: pattern
----
The options are:
- `size`
The maximum size the log file should reach before a rollover should be performed. The default value is `100mb`
[[time-interval-triggering-policy]]
**Time-interval triggering policy**
This policy will rotate the file every given interval of time.
[source,yaml]
----
logging:
appenders:
rolling-file:
type: rolling-file
fileName: /var/logs/kibana.log
policy:
type: time-interval
interval: 10s
modulate: true
strategy:
//...
layout:
type: pattern
----
The options are:
- `interval`
How often a rollover should occur. The default value is `24h`
- `modulate`
Whether the interval should be adjusted to cause the next rollover to occur on the interval boundary.
For example, if modulate is true and the interval is `4h`, if the current hour is 3 am then the first rollover will occur at 4 am
and then next ones will occur at 8 am, noon, 4pm, etc. The default value is `true`.
[float]
===== Rolling strategies
The rolling strategy determines how the rollover should occur: both the naming of the rolled files,
and their retention policy.
There is currently one strategy supported: `numeric`.
**Numeric rolling strategy**
This strategy will suffix the file with a given pattern when rolling,
and will retains a fixed amount of rolled files.
[source,yaml]
----
logging:
appenders:
rolling-file:
type: rolling-file
fileName: /var/logs/kibana.log
policy:
// ...
strategy:
type: numeric
pattern: '-%i'
max: 2
layout:
type: pattern
----
For example, with this configuration:
- During the first rollover kibana.log is renamed to kibana-1.log. A new kibana.log file is created and starts
being written to.
- During the second rollover kibana-1.log is renamed to kibana-2.log and kibana.log is renamed to kibana-1.log.
A new kibana.log file is created and starts being written to.
- During the third and subsequent rollovers, kibana-2.log is deleted, kibana-1.log is renamed to kibana-2.log and
kibana.log is renamed to kibana-1.log. A new kibana.log file is created and starts being written to.
The options are:
- `pattern`
The suffix to append to the file path when rolling. Must include `%i`, as this is the value
that will be converted to the file index.
For example, with `fileName: /var/logs/kibana.log` and `pattern: '-%i'`, the rolling files created
will be `/var/logs/kibana-1.log`, `/var/logs/kibana-2.log`, and so on. The default value is `-%i`
- `max`
The maximum number of files to keep. Once this number is reached, oldest files will be deleted. The default value is `7`
[float]
[[rewrite-appender]]
==== Rewrite appender
WARNING: This appender is currently considered experimental and is not intended
for public consumption. The API is subject to change at any time.
Similar to log4j's `RewriteAppender`, this appender serves as a sort of middleware,
modifying the provided log events before passing them along to another
appender.
[source,yaml]
----
logging:
appenders:
my-rewrite-appender:
type: rewrite
appenders: [console, file] # name of "destination" appender(s)
policy:
# ...
----
The most common use case for the `RewriteAppender` is when you want to
filter or censor sensitive data that may be contained in a log entry.
In fact, with a default configuration, {kib} will automatically redact
any `authorization`, `cookie`, or `set-cookie` headers when logging http
requests & responses.
To configure additional rewrite rules, you'll need to specify a <<rewrite-policies,`RewritePolicy`>>.
[float]
[[rewrite-policies]]
====== Rewrite policies
Rewrite policies exist to indicate which parts of a log record can be
modified within the rewrite appender.
**Meta**
The `meta` rewrite policy can read and modify any data contained in the
`LogMeta` before passing it along to a destination appender.
Meta policies must specify one of three modes, which indicate which action
to perform on the configured properties:
- `update` updates an existing property at the provided `path`.
- `remove` removes an existing property at the provided `path`.
The `properties` are listed as a `path` and `value` pair, where `path` is
the dot-delimited path to the target property in the `LogMeta` object, and
`value` is the value to add or update in that target property. When using
the `remove` mode, a `value` is not necessary.
Here's an example of how you would replace any `cookie` header values with `[REDACTED]`:
[source,yaml]
----
logging:
appenders:
my-rewrite-appender:
type: rewrite
appenders: [console]
policy:
type: meta # indicates that we want to rewrite the LogMeta
mode: update # will update an existing property only
properties:
- path: "http.request.headers.cookie" # path to property
value: "[REDACTED]" # value to replace at path
----
Rewrite appenders can even be passed to other rewrite appenders to apply
multiple filter policies/modes, as long as it doesn't create a circular
reference. Each rewrite appender is applied sequentially (one after the other).
[source,yaml]
----
logging:
appenders:
remove-request-headers:
type: rewrite
appenders: [censor-response-headers] # redirect to the next rewrite appender
policy:
type: meta
mode: remove
properties:
- path: "http.request.headers" # remove all request headers
censor-response-headers:
type: rewrite
appenders: [console] # output to console
policy:
type: meta
mode: update
properties:
- path: "http.response.headers.set-cookie"
value: "[REDACTED]"
----
[float]
====== Complete Example For Rewrite Appender
[source,yaml]
----
logging:
appenders:
custom_console:
type: console
layout:
type: pattern
highlight: true
pattern: "[%date][%level][%logger] %message %meta"
file:
type: file
fileName: ./kibana.log
layout:
type: json
censor:
type: rewrite
appenders: [custom_console, file]
policy:
type: meta
mode: update
properties:
- path: "http.request.headers.cookie"
value: "[REDACTED]"
loggers:
- name: http.server.response
appenders: [censor] # pass these logs to our rewrite appender
level: debug
----
[[log-settings-examples]]
=== Examples
Here are some configuration examples for the most common logging use cases:
[float]
[[log-to-file-example]]
==== Log to a file
Log the default log format to a file instead of to stdout (the default).
[source,yaml]
----
logging:
appenders:
file:
type: file
fileName: /var/log/kibana.log
layout:
type: pattern
root:
appenders: [file]
----
[float]
[[log-in-json-ECS-example]]
==== Log in JSON format
Log the default log format to JSON layout instead of pattern (the default).
With `json` layout, log messages will be formatted as JSON strings in https://www.elastic.co/guide/en/ecs/current/ecs-reference.html[ECS format] that includes a timestamp, log level, logger, message text and any other metadata that may be associated with the log message itself.
[source,yaml]
----
logging:
appenders:
json-layout:
type: console
layout:
type: json
root:
appenders: [json-layout]
----
[float]
[[log-with-meta-to-stdout]]
==== Log with meta to stdout
Include `%meta` in your pattern layout:
[source,yaml]
----
logging:
appenders:
console-meta:
type: console
layout:
type: pattern
pattern: "[%date] [%level] [%logger] [%meta] %message"
root:
appenders: [console-meta]
----
[float]
[[log-elasticsearch-queries]]
==== Log {es} queries
[source,yaml]
--
logging:
appenders:
console_appender:
type: console
layout:
type: pattern
highlight: true
root:
appenders: [console_appender]
level: warn
loggers:
- name: elasticsearch.query
level: debug
--
[float]
[[change-overall-log-level]]
==== Change overall log level
[source,yaml]
----
logging:
root:
level: debug
----
[float]
[[customize-specific-log-records]]
==== Customize specific log records
Here is a detailed configuration example that can be used to configure _loggers_, _appenders_ and _layouts_:
[source,yaml]
----
logging:
appenders:
console:
type: console
layout:
type: pattern
highlight: true
file:
type: file
fileName: /var/log/kibana.log
custom:
type: console
layout:
type: pattern
pattern: "[%date][%level] %message"
json-file-appender:
type: file
fileName: /var/log/kibana-json.log
layout:
type: json
root:
appenders: [console, file]
level: error
loggers:
- name: plugins
appenders: [custom]
level: warn
- name: plugins.myPlugin
level: info
- name: server
level: fatal
- name: optimize
appenders: [console]
- name: telemetry
appenders: [json-file-appender]
level: all
- name: metrics.ops
appenders: [console]
level: debug
----
Here is what we get with the config above:
[options="header"]
|===
| Context name | Appenders | Level
| root | console, file | error
| plugins | custom | warn
| plugins.myPlugin | custom | info
| server | console, file | fatal
| optimize | console | error
| telemetry | json-file-appender | all
| metrics.ops | console | debug
|===
=== Cli configuration
[float]
[[logging-cli-migration]]
=== Logging configuration via CLI
As is the case for any of Kibana's config settings, you can specify your logging configuration via the CLI. For convenience, the `--verbose` and `--silent` flags exist as shortcuts and will continue to be supported beyond v7.
If you wish to override these flags, you can always do so by passing your preferred logging configuration directly to the CLI. For example, with the following configuration:
[source,yaml]
----
logging:
appenders:
custom:
type: console
layout:
type: pattern
pattern: "[%date][%level] %message"
root:
level: warn
appenders: [custom]
----
you can override the root logging level with:
[options="header"]
[cols="1, 4, 1"]
|===
|legacy logging|{kib} Platform logging|cli shortcuts
|--verbose
|--logging.root.level=debug
|--verbose
|--silent
|--logging.root.level=off
|--silent
|===