diff --git a/docs/development/core/server/kibana-plugin-core-server.logger.debug.md b/docs/development/core/server/kibana-plugin-core-server.logger.debug.md
deleted file mode 100644
index c2b95d92b21d1..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.logger.debug.md
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Logger](./kibana-plugin-core-server.logger.md) > [debug](./kibana-plugin-core-server.logger.debug.md)
-
-## Logger.debug() method
-
-Log messages useful for debugging and interactive investigation
-
-Signature:
-
-```typescript
-debug(message: string, meta?: LogMeta): void;
-```
-
-## Parameters
-
-| Parameter | Type | Description |
-| --- | --- | --- |
-| message | string
| The log message |
-| meta | LogMeta
| |
-
-Returns:
-
-`void`
-
diff --git a/docs/development/core/server/kibana-plugin-core-server.logger.error.md b/docs/development/core/server/kibana-plugin-core-server.logger.error.md
deleted file mode 100644
index 68e7499fabc32..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.logger.error.md
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Logger](./kibana-plugin-core-server.logger.md) > [error](./kibana-plugin-core-server.logger.error.md)
-
-## Logger.error() method
-
-Logs abnormal or unexpected errors or messages that caused a failure in the application flow
-
-Signature:
-
-```typescript
-error(errorOrMessage: string | Error, meta?: LogMeta): void;
-```
-
-## Parameters
-
-| Parameter | Type | Description |
-| --- | --- | --- |
-| errorOrMessage | string | Error
| An Error object or message string to log |
-| meta | LogMeta
| |
-
-Returns:
-
-`void`
-
diff --git a/docs/development/core/server/kibana-plugin-core-server.logger.fatal.md b/docs/development/core/server/kibana-plugin-core-server.logger.fatal.md
deleted file mode 100644
index d39194d2126b7..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.logger.fatal.md
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Logger](./kibana-plugin-core-server.logger.md) > [fatal](./kibana-plugin-core-server.logger.fatal.md)
-
-## Logger.fatal() method
-
-Logs abnormal or unexpected errors or messages that caused an unrecoverable failure
-
-Signature:
-
-```typescript
-fatal(errorOrMessage: string | Error, meta?: LogMeta): void;
-```
-
-## Parameters
-
-| Parameter | Type | Description |
-| --- | --- | --- |
-| errorOrMessage | string | Error
| An Error object or message string to log |
-| meta | LogMeta
| |
-
-Returns:
-
-`void`
-
diff --git a/docs/development/core/server/kibana-plugin-core-server.logger.get.md b/docs/development/core/server/kibana-plugin-core-server.logger.get.md
deleted file mode 100644
index 5f69831a73808..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.logger.get.md
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Logger](./kibana-plugin-core-server.logger.md) > [get](./kibana-plugin-core-server.logger.get.md)
-
-## Logger.get() method
-
-Returns a new [Logger](./kibana-plugin-core-server.logger.md) instance extending the current logger context.
-
-Signature:
-
-```typescript
-get(...childContextPaths: string[]): Logger;
-```
-
-## Parameters
-
-| Parameter | Type | Description |
-| --- | --- | --- |
-| childContextPaths | string[]
| |
-
-Returns:
-
-`Logger`
-
-## Example
-
-
-```typescript
-const logger = loggerFactory.get('plugin', 'service'); // 'plugin.service' context
-const subLogger = logger.get('feature'); // 'plugin.service.feature' context
-
-```
-
diff --git a/docs/development/core/server/kibana-plugin-core-server.logger.info.md b/docs/development/core/server/kibana-plugin-core-server.logger.info.md
deleted file mode 100644
index 7e786ed0e3f9b..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.logger.info.md
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Logger](./kibana-plugin-core-server.logger.md) > [info](./kibana-plugin-core-server.logger.info.md)
-
-## Logger.info() method
-
-Logs messages related to general application flow
-
-Signature:
-
-```typescript
-info(message: string, meta?: LogMeta): void;
-```
-
-## Parameters
-
-| Parameter | Type | Description |
-| --- | --- | --- |
-| message | string
| The log message |
-| meta | LogMeta
| |
-
-Returns:
-
-`void`
-
diff --git a/docs/development/core/server/kibana-plugin-core-server.logger.md b/docs/development/core/server/kibana-plugin-core-server.logger.md
deleted file mode 100644
index 7012358524c35..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.logger.md
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Logger](./kibana-plugin-core-server.logger.md)
-
-## Logger interface
-
-Logger exposes all the necessary methods to log any type of information and this is the interface used by the logging consumers including plugins.
-
-Signature:
-
-```typescript
-export interface Logger
-```
-
-## Methods
-
-| Method | Description |
-| --- | --- |
-| [debug(message, meta)](./kibana-plugin-core-server.logger.debug.md) | Log messages useful for debugging and interactive investigation |
-| [error(errorOrMessage, meta)](./kibana-plugin-core-server.logger.error.md) | Logs abnormal or unexpected errors or messages that caused a failure in the application flow |
-| [fatal(errorOrMessage, meta)](./kibana-plugin-core-server.logger.fatal.md) | Logs abnormal or unexpected errors or messages that caused an unrecoverable failure |
-| [get(childContextPaths)](./kibana-plugin-core-server.logger.get.md) | Returns a new [Logger](./kibana-plugin-core-server.logger.md) instance extending the current logger context. |
-| [info(message, meta)](./kibana-plugin-core-server.logger.info.md) | Logs messages related to general application flow |
-| [trace(message, meta)](./kibana-plugin-core-server.logger.trace.md) | Log messages at the most detailed log level |
-| [warn(errorOrMessage, meta)](./kibana-plugin-core-server.logger.warn.md) | Logs abnormal or unexpected errors or messages |
-
diff --git a/docs/development/core/server/kibana-plugin-core-server.logger.trace.md b/docs/development/core/server/kibana-plugin-core-server.logger.trace.md
deleted file mode 100644
index b8d761f69541e..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.logger.trace.md
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Logger](./kibana-plugin-core-server.logger.md) > [trace](./kibana-plugin-core-server.logger.trace.md)
-
-## Logger.trace() method
-
-Log messages at the most detailed log level
-
-Signature:
-
-```typescript
-trace(message: string, meta?: LogMeta): void;
-```
-
-## Parameters
-
-| Parameter | Type | Description |
-| --- | --- | --- |
-| message | string
| The log message |
-| meta | LogMeta
| |
-
-Returns:
-
-`void`
-
diff --git a/docs/development/core/server/kibana-plugin-core-server.logger.warn.md b/docs/development/core/server/kibana-plugin-core-server.logger.warn.md
deleted file mode 100644
index 21cefe4f748dd..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.logger.warn.md
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Logger](./kibana-plugin-core-server.logger.md) > [warn](./kibana-plugin-core-server.logger.warn.md)
-
-## Logger.warn() method
-
-Logs abnormal or unexpected errors or messages
-
-Signature:
-
-```typescript
-warn(errorOrMessage: string | Error, meta?: LogMeta): void;
-```
-
-## Parameters
-
-| Parameter | Type | Description |
-| --- | --- | --- |
-| errorOrMessage | string | Error
| An Error object or message string to log |
-| meta | LogMeta
| |
-
-Returns:
-
-`void`
-
diff --git a/docs/development/core/server/kibana-plugin-core-server.loggerfactory.get.md b/docs/development/core/server/kibana-plugin-core-server.loggerfactory.get.md
deleted file mode 100644
index d081d359b9480..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.loggerfactory.get.md
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [LoggerFactory](./kibana-plugin-core-server.loggerfactory.md) > [get](./kibana-plugin-core-server.loggerfactory.get.md)
-
-## LoggerFactory.get() method
-
-Returns a `Logger` instance for the specified context.
-
-Signature:
-
-```typescript
-get(...contextParts: string[]): Logger;
-```
-
-## Parameters
-
-| Parameter | Type | Description |
-| --- | --- | --- |
-| contextParts | string[]
| Parts of the context to return logger for. For example get('plugins', 'pid') will return a logger for the plugins.pid
context. |
-
-Returns:
-
-`Logger`
-
diff --git a/docs/development/core/server/kibana-plugin-core-server.loggerfactory.md b/docs/development/core/server/kibana-plugin-core-server.loggerfactory.md
deleted file mode 100644
index 8795413bf675a..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.loggerfactory.md
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [LoggerFactory](./kibana-plugin-core-server.loggerfactory.md)
-
-## LoggerFactory interface
-
-The single purpose of `LoggerFactory` interface is to define a way to retrieve a context-based logger instance.
-
-Signature:
-
-```typescript
-export interface LoggerFactory
-```
-
-## Methods
-
-| Method | Description |
-| --- | --- |
-| [get(contextParts)](./kibana-plugin-core-server.loggerfactory.get.md) | Returns a Logger
instance for the specified context. |
-
diff --git a/docs/development/core/server/kibana-plugin-core-server.logmeta.md b/docs/development/core/server/kibana-plugin-core-server.logmeta.md
deleted file mode 100644
index 56a2af7e826c6..0000000000000
--- a/docs/development/core/server/kibana-plugin-core-server.logmeta.md
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [LogMeta](./kibana-plugin-core-server.logmeta.md)
-
-## LogMeta interface
-
-Contextual metadata
-
-Signature:
-
-```typescript
-export interface LogMeta
-```
diff --git a/docs/development/core/server/kibana-plugin-core-server.md b/docs/development/core/server/kibana-plugin-core-server.md
index dfffdffb08a08..0a9bc39ede4e7 100644
--- a/docs/development/core/server/kibana-plugin-core-server.md
+++ b/docs/development/core/server/kibana-plugin-core-server.md
@@ -118,11 +118,8 @@ The plugin integrates with the core system via lifecycle events: `setup`
| [LegacyRequest](./kibana-plugin-core-server.legacyrequest.md) | |
| [LegacyServiceSetupDeps](./kibana-plugin-core-server.legacyservicesetupdeps.md) | |
| [LegacyServiceStartDeps](./kibana-plugin-core-server.legacyservicestartdeps.md) | |
-| [Logger](./kibana-plugin-core-server.logger.md) | Logger exposes all the necessary methods to log any type of information and this is the interface used by the logging consumers including plugins. |
| [LoggerContextConfigInput](./kibana-plugin-core-server.loggercontextconfiginput.md) | |
-| [LoggerFactory](./kibana-plugin-core-server.loggerfactory.md) | The single purpose of LoggerFactory
interface is to define a way to retrieve a context-based logger instance. |
| [LoggingServiceSetup](./kibana-plugin-core-server.loggingservicesetup.md) | Provides APIs to plugins for customizing the plugin's logger. |
-| [LogMeta](./kibana-plugin-core-server.logmeta.md) | Contextual metadata |
| [MetricsServiceSetup](./kibana-plugin-core-server.metricsservicesetup.md) | APIs to retrieves metrics gathered and exposed by the core platform. |
| [NodesVersionCompatibility](./kibana-plugin-core-server.nodesversioncompatibility.md) | |
| [OnPostAuthToolkit](./kibana-plugin-core-server.onpostauthtoolkit.md) | A tool set defining an outcome of OnPostAuth interceptor for incoming request. |
diff --git a/package.json b/package.json
index 95a6de337f62a..f52c35261fea0 100644
--- a/package.json
+++ b/package.json
@@ -140,6 +140,7 @@
"@kbn/config-schema": "1.0.0",
"@kbn/i18n": "1.0.0",
"@kbn/interpreter": "1.0.0",
+ "@kbn/logging": "1.0.0",
"@kbn/pm": "1.0.0",
"@kbn/telemetry-tools": "1.0.0",
"@kbn/test-subj-selector": "0.2.1",
diff --git a/packages/kbn-logging/README.md b/packages/kbn-logging/README.md
new file mode 100644
index 0000000000000..be09e186bbaf9
--- /dev/null
+++ b/packages/kbn-logging/README.md
@@ -0,0 +1,61 @@
+# kbn-logging
+
+Base types for the kibana platform logging system.
+
+Note that this package currently only contains logging types. The only concrete implementation
+is still in `core`.
+
+- [Loggers, Appenders and Layouts](#loggers-appenders-and-layouts)
+- [Logger hierarchy](#logger-hierarchy)
+- [Log level](#log-level)
+- [Layouts](#layouts)
+
+The way logging works in Kibana is inspired by `log4j 2` logging framework used by [Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html#logging).
+The main idea is to have consistent logging behaviour (configuration, log format etc.) across the entire Elastic Stack
+where possible.
+
+## Loggers, Appenders and Layouts
+
+Kibana logging system has three main components: _loggers_, _appenders_ and _layouts_. These components allow us to log
+messages according to message type and level, and to control how these messages are formatted and where the final logs
+will be displayed or stored.
+
+__Loggers__ define what logging settings should be applied at the particular context.
+
+__Appenders__ define where log messages are displayed (eg. stdout or console) and stored (eg. file on the disk).
+
+__Layouts__ define how log messages are formatted and what type of information they include.
+
+
+## Logger hierarchy
+
+Every logger has its unique name or context that follows 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 name. For example logger
+with `a.b` context is an ancestor of logger with `a.b.c` context. All top-level loggers are descendants of special
+logger with `root` context that resides at the top of the logger hierarchy. This logger always exists and
+fully configured.
+
+Developer can configure _log level_ and _appenders_ that should be used within particular context. If logger configuration
+specifies only _log level_ then _appenders_ configuration will be inherited from the ancestor logger.
+
+__Note:__ in the current implementation log messages are only forwarded to appenders configured for a particular logger
+context or to appenders of the closest ancestor if current logger doesn't have any appenders configured. That means that
+we __don't support__ so called _appender additivity_ when log messages are forwarded to _every_ distinct appender within
+ancestor chain including `root`.
+
+## Log level
+
+Currently we support the following log levels: _all_, _fatal_, _error_, _warn_, _info_, _debug_, _trace_, _off_.
+Levels are ordered, so _all_ > _fatal_ > _error_ > _warn_ > _info_ > _debug_ > _trace_ > _off_.
+A log record is being logged by the logger if its level is higher than or equal to the level of its logger. Otherwise,
+the log record is ignored.
+
+The _all_ and _off_ levels can be used only in configuration and are just handy shortcuts that allow developer to log every
+log record or disable logging entirely for the specific context.
+
+## Layouts
+
+Every appender should know exactly how to format log messages before they are written to the console or file on the disk.
+This behaviour is controlled by the layouts and configured through `appender.layout` configuration property for every
+custom appender (see examples in [Configuration](#configuration)). Currently we don't define any default layout for the
+custom appenders, so one should always make the choice explicitly.
diff --git a/packages/kbn-logging/package.json b/packages/kbn-logging/package.json
new file mode 100644
index 0000000000000..71a9bb57d9bad
--- /dev/null
+++ b/packages/kbn-logging/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "@kbn/logging",
+ "version": "1.0.0",
+ "private": true,
+ "license": "Apache-2.0",
+ "main": "./target/index.js",
+ "scripts": {
+ "build": "tsc",
+ "kbn:bootstrap": "yarn build",
+ "kbn:watch": "yarn build --watch"
+ },
+ "dependencies": {
+ "rxjs": "^6.5.5",
+ "@kbn/config-schema": "1.0.0",
+ "moment-timezone": "^0.5.27"
+ },
+ "devDependencies": {
+ "typescript": "4.0.2"
+ }
+}
diff --git a/packages/kbn-logging/src/appenders.ts b/packages/kbn-logging/src/appenders.ts
new file mode 100644
index 0000000000000..346d3d6dd1068
--- /dev/null
+++ b/packages/kbn-logging/src/appenders.ts
@@ -0,0 +1,39 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { LogRecord } from './log_record';
+
+/**
+ * Entity that can append `LogRecord` instances to file, stdout, memory or whatever
+ * is implemented internally. It's supposed to be used by `Logger`.
+ * @internal
+ */
+export interface Appender {
+ append(record: LogRecord): void;
+}
+
+/**
+ * This interface should be additionally implemented by the `Appender`'s if they are supposed
+ * to be properly disposed. It's intentionally separated from `Appender` interface so that `Logger`
+ * that interacts with `Appender` doesn't have control over appender lifetime.
+ * @internal
+ */
+export interface DisposableAppender extends Appender {
+ dispose: () => void;
+}
diff --git a/packages/kbn-logging/src/index.ts b/packages/kbn-logging/src/index.ts
new file mode 100644
index 0000000000000..d06218ac2eeb5
--- /dev/null
+++ b/packages/kbn-logging/src/index.ts
@@ -0,0 +1,25 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export { LogLevel, LogLevelId } from './log_level';
+export { LogRecord } from './log_record';
+export { Logger, LogMeta } from './logger';
+export { LoggerFactory } from './logger_factory';
+export { Layout } from './layout';
+export { Appender, DisposableAppender } from './appenders';
diff --git a/packages/kbn-logging/src/layout.ts b/packages/kbn-logging/src/layout.ts
new file mode 100644
index 0000000000000..75556eab88bb6
--- /dev/null
+++ b/packages/kbn-logging/src/layout.ts
@@ -0,0 +1,28 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { LogRecord } from './log_record';
+
+/**
+ * Entity that can format `LogRecord` instance into a string.
+ * @internal
+ */
+export interface Layout {
+ format(record: LogRecord): string;
+}
diff --git a/src/core/server/logging/log_level.test.ts b/packages/kbn-logging/src/log_level.test.ts
similarity index 100%
rename from src/core/server/logging/log_level.test.ts
rename to packages/kbn-logging/src/log_level.test.ts
diff --git a/src/core/server/logging/log_level.ts b/packages/kbn-logging/src/log_level.ts
similarity index 98%
rename from src/core/server/logging/log_level.ts
rename to packages/kbn-logging/src/log_level.ts
index 577239ddae8e5..38074b444edc4 100644
--- a/src/core/server/logging/log_level.ts
+++ b/packages/kbn-logging/src/log_level.ts
@@ -17,7 +17,7 @@
* under the License.
*/
-import { assertNever } from '../../utils';
+import { assertNever } from './utils';
/**
* Possible log level string values.
diff --git a/src/core/server/logging/log_record.ts b/packages/kbn-logging/src/log_record.ts
similarity index 100%
rename from src/core/server/logging/log_record.ts
rename to packages/kbn-logging/src/log_record.ts
diff --git a/packages/kbn-logging/src/logger.ts b/packages/kbn-logging/src/logger.ts
new file mode 100644
index 0000000000000..50e002a87fc52
--- /dev/null
+++ b/packages/kbn-logging/src/logger.ts
@@ -0,0 +1,96 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { LogRecord } from './log_record';
+
+/**
+ * Contextual metadata
+ *
+ * @public
+ */
+export interface LogMeta {
+ [key: string]: any;
+}
+
+/**
+ * Logger exposes all the necessary methods to log any type of information and
+ * this is the interface used by the logging consumers including plugins.
+ *
+ * @public
+ */
+export interface Logger {
+ /**
+ * Log messages at the most detailed log level
+ *
+ * @param message - The log message
+ * @param meta -
+ */
+ trace(message: string, meta?: LogMeta): void;
+
+ /**
+ * Log messages useful for debugging and interactive investigation
+ * @param message - The log message
+ * @param meta -
+ */
+ debug(message: string, meta?: LogMeta): void;
+
+ /**
+ * Logs messages related to general application flow
+ * @param message - The log message
+ * @param meta -
+ */
+ info(message: string, meta?: LogMeta): void;
+
+ /**
+ * Logs abnormal or unexpected errors or messages
+ * @param errorOrMessage - An Error object or message string to log
+ * @param meta -
+ */
+ warn(errorOrMessage: string | Error, meta?: LogMeta): void;
+
+ /**
+ * Logs abnormal or unexpected errors or messages that caused a failure in the application flow
+ *
+ * @param errorOrMessage - An Error object or message string to log
+ * @param meta -
+ */
+ error(errorOrMessage: string | Error, meta?: LogMeta): void;
+
+ /**
+ * Logs abnormal or unexpected errors or messages that caused an unrecoverable failure
+ *
+ * @param errorOrMessage - An Error object or message string to log
+ * @param meta -
+ */
+ fatal(errorOrMessage: string | Error, meta?: LogMeta): void;
+
+ /** @internal */
+ log(record: LogRecord): void;
+
+ /**
+ * Returns a new {@link Logger} instance extending the current logger context.
+ *
+ * @example
+ * ```typescript
+ * const logger = loggerFactory.get('plugin', 'service'); // 'plugin.service' context
+ * const subLogger = logger.get('feature'); // 'plugin.service.feature' context
+ * ```
+ */
+ get(...childContextPaths: string[]): Logger;
+}
diff --git a/src/core/server/logging/logger_factory.ts b/packages/kbn-logging/src/logger_factory.ts
similarity index 100%
rename from src/core/server/logging/logger_factory.ts
rename to packages/kbn-logging/src/logger_factory.ts
diff --git a/packages/kbn-logging/src/utils/assert_never.ts b/packages/kbn-logging/src/utils/assert_never.ts
new file mode 100644
index 0000000000000..c713b373493c5
--- /dev/null
+++ b/packages/kbn-logging/src/utils/assert_never.ts
@@ -0,0 +1,28 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Can be used in switch statements to ensure we perform exhaustive checks, see
+ * https://www.typescriptlang.org/docs/handbook/advanced-types.html#exhaustiveness-checking
+ *
+ * @public
+ */
+export function assertNever(x: never): never {
+ throw new Error(`Unexpected object: ${x}`);
+}
diff --git a/packages/kbn-logging/src/utils/index.ts b/packages/kbn-logging/src/utils/index.ts
new file mode 100644
index 0000000000000..829ceed210b00
--- /dev/null
+++ b/packages/kbn-logging/src/utils/index.ts
@@ -0,0 +1,20 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export { assertNever } from './assert_never';
diff --git a/packages/kbn-logging/tsconfig.json b/packages/kbn-logging/tsconfig.json
new file mode 100644
index 0000000000000..c63fd8ce94920
--- /dev/null
+++ b/packages/kbn-logging/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "target",
+ "stripInternal": false,
+ "declaration": true,
+ "declarationMap": true,
+ "types": [
+ "jest",
+ "node"
+ ]
+ },
+ "include": [
+ "./src/**/*.ts"
+ ]
+}
diff --git a/packages/kbn-logging/yarn.lock b/packages/kbn-logging/yarn.lock
new file mode 120000
index 0000000000000..3f82ebc9cdbae
--- /dev/null
+++ b/packages/kbn-logging/yarn.lock
@@ -0,0 +1 @@
+../../yarn.lock
\ No newline at end of file
diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md
index c473ea67d9bcd..ebc86af0bfe6a 100644
--- a/src/core/public/public.api.md
+++ b/src/core/public/public.api.md
@@ -20,6 +20,8 @@ import { KibanaClient } from '@elastic/elasticsearch/api/kibana';
import { KibanaConfigType } from 'src/core/server/kibana_config';
import { Location } from 'history';
import { LocationDescriptorObject } from 'history';
+import { Logger } from '@kbn/logging';
+import { LogMeta } from '@kbn/logging';
import { MaybePromise } from '@kbn/utility-types';
import { Observable } from 'rxjs';
import { ParsedQuery } from 'query-string';
diff --git a/src/core/server/legacy/logging/appenders/legacy_appender.test.ts b/src/core/server/legacy/logging/appenders/legacy_appender.test.ts
index 538d987e781d0..697e5bc37d602 100644
--- a/src/core/server/legacy/logging/appenders/legacy_appender.test.ts
+++ b/src/core/server/legacy/logging/appenders/legacy_appender.test.ts
@@ -19,8 +19,7 @@
jest.mock('../legacy_logging_server');
-import { LogLevel } from '../../../logging/log_level';
-import { LogRecord } from '../../../logging/log_record';
+import { LogRecord, LogLevel } from '../../../logging';
import { LegacyLoggingServer } from '../legacy_logging_server';
import { LegacyAppender } from './legacy_appender';
diff --git a/src/core/server/legacy/logging/appenders/legacy_appender.ts b/src/core/server/legacy/logging/appenders/legacy_appender.ts
index a5d36423ba4c6..67337c7d67629 100644
--- a/src/core/server/legacy/logging/appenders/legacy_appender.ts
+++ b/src/core/server/legacy/logging/appenders/legacy_appender.ts
@@ -18,8 +18,7 @@
*/
import { schema } from '@kbn/config-schema';
-import { DisposableAppender } from '../../../logging/appenders/appenders';
-import { LogRecord } from '../../../logging/log_record';
+import { DisposableAppender, LogRecord } from '../../../logging';
import { LegacyLoggingServer } from '../legacy_logging_server';
import { LegacyVars } from '../../types';
diff --git a/src/core/server/legacy/logging/legacy_logging_server.test.ts b/src/core/server/legacy/logging/legacy_logging_server.test.ts
index 6dca3a199728e..2f6c34e0fc5d6 100644
--- a/src/core/server/legacy/logging/legacy_logging_server.test.ts
+++ b/src/core/server/legacy/logging/legacy_logging_server.test.ts
@@ -20,7 +20,7 @@
jest.mock('../../../../legacy/server/config');
jest.mock('../../../../legacy/server/logging');
-import { LogLevel } from '../../logging/log_level';
+import { LogLevel } from '../../logging';
import { LegacyLoggingServer } from './legacy_logging_server';
test('correctly forwards log records.', () => {
diff --git a/src/core/server/legacy/logging/legacy_logging_server.ts b/src/core/server/legacy/logging/legacy_logging_server.ts
index 4a7fea87cf69f..096dbe54565e1 100644
--- a/src/core/server/legacy/logging/legacy_logging_server.ts
+++ b/src/core/server/legacy/logging/legacy_logging_server.ts
@@ -23,8 +23,7 @@ import Podium from 'podium';
import { Config } from '../../../../legacy/server/config';
// @ts-expect-error: implicit any for JS file
import { setupLogging } from '../../../../legacy/server/logging';
-import { LogLevel } from '../../logging/log_level';
-import { LogRecord } from '../../logging/log_record';
+import { LogLevel, LogRecord } from '../../logging';
import { LegacyVars } from '../../types';
export const metadataSymbol = Symbol('log message with metadata');
diff --git a/src/core/server/logging/appenders/appenders.ts b/src/core/server/logging/appenders/appenders.ts
index edfce4988275a..cf9156d066806 100644
--- a/src/core/server/logging/appenders/appenders.ts
+++ b/src/core/server/logging/appenders/appenders.ts
@@ -18,6 +18,7 @@
*/
import { schema } from '@kbn/config-schema';
+import { DisposableAppender } from '@kbn/logging';
import { assertNever } from '../../../utils';
import {
@@ -25,7 +26,6 @@ import {
LegacyAppenderConfig,
} from '../../legacy/logging/appenders/legacy_appender';
import { Layouts } from '../layouts/layouts';
-import { LogRecord } from '../log_record';
import { ConsoleAppender, ConsoleAppenderConfig } from './console/console_appender';
import { FileAppender, FileAppenderConfig } from './file/file_appender';
@@ -44,25 +44,6 @@ export const appendersSchema = schema.oneOf([
/** @public */
export type AppenderConfigType = ConsoleAppenderConfig | FileAppenderConfig | LegacyAppenderConfig;
-/**
- * Entity that can append `LogRecord` instances to file, stdout, memory or whatever
- * is implemented internally. It's supposed to be used by `Logger`.
- * @internal
- */
-export interface Appender {
- append(record: LogRecord): void;
-}
-
-/**
- * This interface should be additionally implemented by the `Appender`'s if they are supposed
- * to be properly disposed. It's intentionally separated from `Appender` interface so that `Logger`
- * that interacts with `Appender` doesn't have control over appender lifetime.
- * @internal
- */
-export interface DisposableAppender extends Appender {
- dispose: () => void;
-}
-
/** @internal */
export class Appenders {
public static configSchema = appendersSchema;
diff --git a/src/core/server/logging/appenders/buffer/buffer_appender.test.ts b/src/core/server/logging/appenders/buffer/buffer_appender.test.ts
index 49d70db8d5d43..7981aef64e589 100644
--- a/src/core/server/logging/appenders/buffer/buffer_appender.test.ts
+++ b/src/core/server/logging/appenders/buffer/buffer_appender.test.ts
@@ -17,8 +17,7 @@
* under the License.
*/
-import { LogLevel } from '../../log_level';
-import { LogRecord } from '../../log_record';
+import { LogLevel, LogRecord } from '@kbn/logging';
import { BufferAppender } from './buffer_appender';
test('`flush()` does not return any record buffered at the beginning.', () => {
diff --git a/src/core/server/logging/appenders/buffer/buffer_appender.ts b/src/core/server/logging/appenders/buffer/buffer_appender.ts
index 7024d3e5d16df..9e3a9d0f910f8 100644
--- a/src/core/server/logging/appenders/buffer/buffer_appender.ts
+++ b/src/core/server/logging/appenders/buffer/buffer_appender.ts
@@ -17,8 +17,7 @@
* under the License.
*/
-import { LogRecord } from '../../log_record';
-import { DisposableAppender } from '../appenders';
+import { LogRecord, DisposableAppender } from '@kbn/logging';
/**
* Simple appender that just buffers `LogRecord` instances it receives. It is a *reserved* appender
diff --git a/src/core/server/logging/appenders/console/console_appender.test.ts b/src/core/server/logging/appenders/console/console_appender.test.ts
index 6e30df1cfb65c..0601ac10167ac 100644
--- a/src/core/server/logging/appenders/console/console_appender.test.ts
+++ b/src/core/server/logging/appenders/console/console_appender.test.ts
@@ -29,8 +29,7 @@ jest.mock('../../layouts/layouts', () => {
};
});
-import { LogLevel } from '../../log_level';
-import { LogRecord } from '../../log_record';
+import { LogRecord, LogLevel } from '@kbn/logging';
import { ConsoleAppender } from './console_appender';
test('`configSchema` creates correct schema.', () => {
diff --git a/src/core/server/logging/appenders/console/console_appender.ts b/src/core/server/logging/appenders/console/console_appender.ts
index a54674b1d347c..dc491fcff664c 100644
--- a/src/core/server/logging/appenders/console/console_appender.ts
+++ b/src/core/server/logging/appenders/console/console_appender.ts
@@ -18,10 +18,8 @@
*/
import { schema } from '@kbn/config-schema';
-
-import { Layout, Layouts, LayoutConfigType } from '../../layouts/layouts';
-import { LogRecord } from '../../log_record';
-import { DisposableAppender } from '../appenders';
+import { Layout, LogRecord, DisposableAppender } from '@kbn/logging';
+import { Layouts, LayoutConfigType } from '../../layouts/layouts';
const { literal, object } = schema;
diff --git a/src/core/server/logging/appenders/file/file_appender.test.ts b/src/core/server/logging/appenders/file/file_appender.test.ts
index bff60029faf11..645455c5ae04c 100644
--- a/src/core/server/logging/appenders/file/file_appender.test.ts
+++ b/src/core/server/logging/appenders/file/file_appender.test.ts
@@ -19,8 +19,7 @@
import { mockCreateWriteStream } from './file_appender.test.mocks';
-import { LogLevel } from '../../log_level';
-import { LogRecord } from '../../log_record';
+import { LogRecord, LogLevel } from '@kbn/logging';
import { FileAppender } from './file_appender';
const tickMs = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
diff --git a/src/core/server/logging/appenders/file/file_appender.ts b/src/core/server/logging/appenders/file/file_appender.ts
index a0e484cd87c8f..b1712bd4e9412 100644
--- a/src/core/server/logging/appenders/file/file_appender.ts
+++ b/src/core/server/logging/appenders/file/file_appender.ts
@@ -18,11 +18,10 @@
*/
import { schema } from '@kbn/config-schema';
+import { LogRecord, Layout, DisposableAppender } from '@kbn/logging';
import { createWriteStream, WriteStream } from 'fs';
-import { Layout, Layouts, LayoutConfigType } from '../../layouts/layouts';
-import { LogRecord } from '../../log_record';
-import { DisposableAppender } from '../appenders';
+import { Layouts, LayoutConfigType } from '../../layouts/layouts';
export interface FileAppenderConfig {
kind: 'file';
diff --git a/src/core/server/logging/index.ts b/src/core/server/logging/index.ts
index 9471972030281..01f153cae9e2d 100644
--- a/src/core/server/logging/index.ts
+++ b/src/core/server/logging/index.ts
@@ -17,10 +17,17 @@
* under the License.
*/
-export { Logger, LogMeta } from './logger';
-export { LoggerFactory } from './logger_factory';
-export { LogRecord } from './log_record';
-export { LogLevel } from './log_level';
+export {
+ DisposableAppender,
+ Appender,
+ LogRecord,
+ Layout,
+ LoggerFactory,
+ LogMeta,
+ Logger,
+ LogLevelId,
+ LogLevel,
+} from '@kbn/logging';
export {
config,
LoggingConfigType,
diff --git a/src/core/server/logging/layouts/conversions/date.ts b/src/core/server/logging/layouts/conversions/date.ts
index d3ed54fb98240..3a43c0ffcd389 100644
--- a/src/core/server/logging/layouts/conversions/date.ts
+++ b/src/core/server/logging/layouts/conversions/date.ts
@@ -18,9 +18,9 @@
*/
import moment from 'moment-timezone';
import { last } from 'lodash';
+import { LogRecord } from '@kbn/logging';
import { Conversion } from './type';
-import { LogRecord } from '../../log_record';
const dateRegExp = /%date({(?[^}]+)})?({(?[^}]+)})?/g;
diff --git a/src/core/server/logging/layouts/conversions/level.ts b/src/core/server/logging/layouts/conversions/level.ts
index 58b271140eff5..83208242dc258 100644
--- a/src/core/server/logging/layouts/conversions/level.ts
+++ b/src/core/server/logging/layouts/conversions/level.ts
@@ -18,10 +18,9 @@
*/
import chalk from 'chalk';
+import { LogRecord, LogLevel } from '@kbn/logging';
import { Conversion } from './type';
-import { LogLevel } from '../../log_level';
-import { LogRecord } from '../../log_record';
const LEVEL_COLORS = new Map([
[LogLevel.Fatal, chalk.red],
diff --git a/src/core/server/logging/layouts/conversions/logger.ts b/src/core/server/logging/layouts/conversions/logger.ts
index debb1737ab95a..e63976052443b 100644
--- a/src/core/server/logging/layouts/conversions/logger.ts
+++ b/src/core/server/logging/layouts/conversions/logger.ts
@@ -18,9 +18,9 @@
*/
import chalk from 'chalk';
+import { LogRecord } from '@kbn/logging';
import { Conversion } from './type';
-import { LogRecord } from '../../log_record';
export const LoggerConversion: Conversion = {
pattern: /%logger/g,
diff --git a/src/core/server/logging/layouts/conversions/message.ts b/src/core/server/logging/layouts/conversions/message.ts
index f8c5e68ada4fb..73d85532a5a90 100644
--- a/src/core/server/logging/layouts/conversions/message.ts
+++ b/src/core/server/logging/layouts/conversions/message.ts
@@ -17,8 +17,8 @@
* under the License.
*/
+import { LogRecord } from '@kbn/logging';
import { Conversion } from './type';
-import { LogRecord } from '../../log_record';
export const MessageConversion: Conversion = {
pattern: /%message/g,
diff --git a/src/core/server/logging/layouts/conversions/meta.ts b/src/core/server/logging/layouts/conversions/meta.ts
index ee8c207389fbe..b78db41b7e969 100644
--- a/src/core/server/logging/layouts/conversions/meta.ts
+++ b/src/core/server/logging/layouts/conversions/meta.ts
@@ -16,8 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
+
+import { LogRecord } from '@kbn/logging';
import { Conversion } from './type';
-import { LogRecord } from '../../log_record';
export const MetaConversion: Conversion = {
pattern: /%meta/g,
diff --git a/src/core/server/logging/layouts/conversions/pid.ts b/src/core/server/logging/layouts/conversions/pid.ts
index 37d34a4f1cf8b..f6902005f5668 100644
--- a/src/core/server/logging/layouts/conversions/pid.ts
+++ b/src/core/server/logging/layouts/conversions/pid.ts
@@ -17,8 +17,8 @@
* under the License.
*/
+import { LogRecord } from '@kbn/logging';
import { Conversion } from './type';
-import { LogRecord } from '../../log_record';
export const PidConversion: Conversion = {
pattern: /%pid/g,
diff --git a/src/core/server/logging/layouts/conversions/type.ts b/src/core/server/logging/layouts/conversions/type.ts
index a57a1f954e53a..be172a0a98f7d 100644
--- a/src/core/server/logging/layouts/conversions/type.ts
+++ b/src/core/server/logging/layouts/conversions/type.ts
@@ -16,7 +16,8 @@
* specific language governing permissions and limitations
* under the License.
*/
-import { LogRecord } from 'kibana/server';
+
+import { LogRecord } from '@kbn/logging';
export interface Conversion {
pattern: RegExp;
diff --git a/src/core/server/logging/layouts/json_layout.test.ts b/src/core/server/logging/layouts/json_layout.test.ts
index 6cda1e4806aa8..f476e3f217278 100644
--- a/src/core/server/logging/layouts/json_layout.test.ts
+++ b/src/core/server/logging/layouts/json_layout.test.ts
@@ -17,8 +17,7 @@
* under the License.
*/
-import { LogLevel } from '../log_level';
-import { LogRecord } from '../log_record';
+import { LogLevel, LogRecord } from '@kbn/logging';
import { JsonLayout } from './json_layout';
const timestamp = new Date(Date.UTC(2012, 1, 1, 14, 30, 22, 11));
diff --git a/src/core/server/logging/layouts/json_layout.ts b/src/core/server/logging/layouts/json_layout.ts
index 37eb6b8c4806e..7573d0b837416 100644
--- a/src/core/server/logging/layouts/json_layout.ts
+++ b/src/core/server/logging/layouts/json_layout.ts
@@ -20,9 +20,7 @@
import moment from 'moment-timezone';
import { merge } from 'lodash';
import { schema } from '@kbn/config-schema';
-
-import { LogRecord } from '../log_record';
-import { Layout } from './layouts';
+import { LogRecord, Layout } from '@kbn/logging';
const { literal, object } = schema;
diff --git a/src/core/server/logging/layouts/layouts.ts b/src/core/server/logging/layouts/layouts.ts
index 124c007bae104..266ee56a8d8fa 100644
--- a/src/core/server/logging/layouts/layouts.ts
+++ b/src/core/server/logging/layouts/layouts.ts
@@ -18,9 +18,9 @@
*/
import { schema } from '@kbn/config-schema';
+import { Layout } from '@kbn/logging';
import { assertNever } from '../../../utils';
-import { LogRecord } from '../log_record';
import { JsonLayout, JsonLayoutConfigType } from './json_layout';
import { PatternLayout, PatternLayoutConfigType } from './pattern_layout';
@@ -28,14 +28,6 @@ const { oneOf } = schema;
export type LayoutConfigType = PatternLayoutConfigType | JsonLayoutConfigType;
-/**
- * Entity that can format `LogRecord` instance into a string.
- * @internal
- */
-export interface Layout {
- format(record: LogRecord): string;
-}
-
/** @internal */
export class Layouts {
public static configSchema = oneOf([JsonLayout.configSchema, PatternLayout.configSchema]);
diff --git a/src/core/server/logging/layouts/pattern_layout.test.ts b/src/core/server/logging/layouts/pattern_layout.test.ts
index cce55b147e0ed..d37ee3c87d08f 100644
--- a/src/core/server/logging/layouts/pattern_layout.test.ts
+++ b/src/core/server/logging/layouts/pattern_layout.test.ts
@@ -17,9 +17,8 @@
* under the License.
*/
+import { LogLevel, LogRecord } from '@kbn/logging';
import { stripAnsiSnapshotSerializer } from '../../../test_helpers/strip_ansi_snapshot_serializer';
-import { LogLevel } from '../log_level';
-import { LogRecord } from '../log_record';
import { PatternLayout, patternSchema } from './pattern_layout';
const timestamp = new Date(Date.UTC(2012, 1, 1, 14, 30, 22, 11));
diff --git a/src/core/server/logging/layouts/pattern_layout.ts b/src/core/server/logging/layouts/pattern_layout.ts
index 5dfc8aca77f18..2ca444f54b499 100644
--- a/src/core/server/logging/layouts/pattern_layout.ts
+++ b/src/core/server/logging/layouts/pattern_layout.ts
@@ -18,9 +18,8 @@
*/
import { schema } from '@kbn/config-schema';
+import { LogRecord, Layout } from '@kbn/logging';
-import { LogRecord } from '../log_record';
-import { Layout } from './layouts';
import {
Conversion,
LoggerConversion,
diff --git a/src/core/server/logging/logger.mock.ts b/src/core/server/logging/logger.mock.ts
index a3bb07ea4c095..f4392f11034df 100644
--- a/src/core/server/logging/logger.mock.ts
+++ b/src/core/server/logging/logger.mock.ts
@@ -17,7 +17,7 @@
* under the License.
*/
-import { Logger } from './logger';
+import { Logger } from '@kbn/logging';
export type MockedLogger = jest.Mocked & { context: string[] };
diff --git a/src/core/server/logging/logger.test.ts b/src/core/server/logging/logger.test.ts
index 1cc00a254300b..1796519ff65e5 100644
--- a/src/core/server/logging/logger.test.ts
+++ b/src/core/server/logging/logger.test.ts
@@ -17,9 +17,8 @@
* under the License.
*/
+import { LogLevel, Appender } from '@kbn/logging';
import { LoggingConfig } from './logging_config';
-import { Appender } from './appenders/appenders';
-import { LogLevel } from './log_level';
import { BaseLogger } from './logger';
const context = LoggingConfig.getLoggerContext(['context', 'parent', 'child']);
diff --git a/src/core/server/logging/logger.ts b/src/core/server/logging/logger.ts
index 285998c23832c..6861072ef3b8b 100644
--- a/src/core/server/logging/logger.ts
+++ b/src/core/server/logging/logger.ts
@@ -17,86 +17,7 @@
* under the License.
*/
-import { Appender } from './appenders/appenders';
-import { LogLevel } from './log_level';
-import { LogRecord } from './log_record';
-import { LoggerFactory } from './logger_factory';
-
-/**
- * Contextual metadata
- *
- * @public
- */
-export interface LogMeta {
- [key: string]: any;
-}
-
-/**
- * Logger exposes all the necessary methods to log any type of information and
- * this is the interface used by the logging consumers including plugins.
- *
- * @public
- */
-export interface Logger {
- /**
- * Log messages at the most detailed log level
- *
- * @param message - The log message
- * @param meta -
- */
- trace(message: string, meta?: LogMeta): void;
-
- /**
- * Log messages useful for debugging and interactive investigation
- * @param message - The log message
- * @param meta -
- */
- debug(message: string, meta?: LogMeta): void;
-
- /**
- * Logs messages related to general application flow
- * @param message - The log message
- * @param meta -
- */
- info(message: string, meta?: LogMeta): void;
-
- /**
- * Logs abnormal or unexpected errors or messages
- * @param errorOrMessage - An Error object or message string to log
- * @param meta -
- */
- warn(errorOrMessage: string | Error, meta?: LogMeta): void;
-
- /**
- * Logs abnormal or unexpected errors or messages that caused a failure in the application flow
- *
- * @param errorOrMessage - An Error object or message string to log
- * @param meta -
- */
- error(errorOrMessage: string | Error, meta?: LogMeta): void;
-
- /**
- * Logs abnormal or unexpected errors or messages that caused an unrecoverable failure
- *
- * @param errorOrMessage - An Error object or message string to log
- * @param meta -
- */
- fatal(errorOrMessage: string | Error, meta?: LogMeta): void;
-
- /** @internal */
- log(record: LogRecord): void;
-
- /**
- * Returns a new {@link Logger} instance extending the current logger context.
- *
- * @example
- * ```typescript
- * const logger = loggerFactory.get('plugin', 'service'); // 'plugin.service' context
- * const subLogger = logger.get('feature'); // 'plugin.service.feature' context
- * ```
- */
- get(...childContextPaths: string[]): Logger;
-}
+import { Appender, LogLevel, LogRecord, LoggerFactory, LogMeta, Logger } from '@kbn/logging';
function isError(x: any): x is Error {
return x instanceof Error;
diff --git a/src/core/server/logging/logger_adapter.ts b/src/core/server/logging/logger_adapter.ts
index 14e5712e55c58..4ce65bf3302e7 100644
--- a/src/core/server/logging/logger_adapter.ts
+++ b/src/core/server/logging/logger_adapter.ts
@@ -17,8 +17,7 @@
* under the License.
*/
-import { LogRecord } from './log_record';
-import { Logger, LogMeta } from './logger';
+import { LogRecord, Logger, LogMeta } from '@kbn/logging';
/** @internal */
export class LoggerAdapter implements Logger {
diff --git a/src/core/server/logging/logging_service.ts b/src/core/server/logging/logging_service.ts
index 09051f8f07702..f2b609f2258c7 100644
--- a/src/core/server/logging/logging_service.ts
+++ b/src/core/server/logging/logging_service.ts
@@ -18,10 +18,10 @@
*/
import { Observable, Subscription } from 'rxjs';
+import { Logger } from '@kbn/logging';
import { CoreService } from '../../types';
import { LoggingConfig, LoggerContextConfigInput } from './logging_config';
import { ILoggingSystem } from './logging_system';
-import { Logger } from './logger';
import { CoreContext } from '../core_context';
/**
diff --git a/src/core/server/logging/logging_system.mock.ts b/src/core/server/logging/logging_system.mock.ts
index ac1e9b5196002..bc59554a727f7 100644
--- a/src/core/server/logging/logging_system.mock.ts
+++ b/src/core/server/logging/logging_system.mock.ts
@@ -18,8 +18,8 @@
*/
// Test helpers to simplify mocking logs and collecting all their outputs
+import { LoggerFactory } from '@kbn/logging';
import { ILoggingSystem } from './logging_system';
-import { LoggerFactory } from './logger_factory';
import { loggerMock, MockedLogger } from './logger.mock';
const createLoggingSystemMock = () => {
diff --git a/src/core/server/logging/logging_system.ts b/src/core/server/logging/logging_system.ts
index 8aadab83bf716..b2fd9bdfce2de 100644
--- a/src/core/server/logging/logging_system.ts
+++ b/src/core/server/logging/logging_system.ts
@@ -16,12 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-import { Appenders, DisposableAppender } from './appenders/appenders';
+
+import { DisposableAppender, LogLevel, Logger, LoggerFactory } from '@kbn/logging';
+import { Appenders } from './appenders/appenders';
import { BufferAppender } from './appenders/buffer/buffer_appender';
-import { LogLevel } from './log_level';
-import { BaseLogger, Logger } from './logger';
+import { BaseLogger } from './logger';
import { LoggerAdapter } from './logger_adapter';
-import { LoggerFactory } from './logger_factory';
import {
LoggingConfigType,
LoggerConfigType,
diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md
index aef1bda9ccf4e..bb7a01fb7aa07 100644
--- a/src/core/server/server.api.md
+++ b/src/core/server/server.api.md
@@ -95,6 +95,11 @@ import { IngestPutPipelineParams } from 'elasticsearch';
import { IngestSimulateParams } from 'elasticsearch';
import { KibanaClient } from '@elastic/elasticsearch/api/kibana';
import { KibanaConfigType } from 'src/core/server/kibana_config';
+import { Logger } from '@kbn/logging';
+import { LoggerFactory } from '@kbn/logging';
+import { LogLevel } from '@kbn/logging';
+import { LogMeta } from '@kbn/logging';
+import { LogRecord } from '@kbn/logging';
import { MGetParams } from 'elasticsearch';
import { MGetResponse } from 'elasticsearch';
import { MSearchParams } from 'elasticsearch';
@@ -1441,18 +1446,7 @@ export interface LegacyUiExports {
// @public
export type LifecycleResponseFactory = typeof lifecycleResponseFactory;
-// @public
-export interface Logger {
- debug(message: string, meta?: LogMeta): void;
- error(errorOrMessage: string | Error, meta?: LogMeta): void;
- fatal(errorOrMessage: string | Error, meta?: LogMeta): void;
- get(...childContextPaths: string[]): Logger;
- info(message: string, meta?: LogMeta): void;
- // @internal (undocumented)
- log(record: LogRecord): void;
- trace(message: string, meta?: LogMeta): void;
- warn(errorOrMessage: string | Error, meta?: LogMeta): void;
-}
+export { Logger }
// Warning: (ae-forgotten-export) The symbol "loggerSchema" needs to be exported by the entry point index.d.ts
//
@@ -1467,69 +1461,18 @@ export interface LoggerContextConfigInput {
loggers?: LoggerConfigType[];
}
-// @public
-export interface LoggerFactory {
- get(...contextParts: string[]): Logger;
-}
+export { LoggerFactory }
// @public
export interface LoggingServiceSetup {
configure(config$: Observable): void;
}
-// @internal
-export class LogLevel {
- // (undocumented)
- static readonly All: LogLevel;
- // (undocumented)
- static readonly Debug: LogLevel;
- // (undocumented)
- static readonly Error: LogLevel;
- // (undocumented)
- static readonly Fatal: LogLevel;
- static fromId(level: LogLevelId): LogLevel;
- // Warning: (ae-forgotten-export) The symbol "LogLevelId" needs to be exported by the entry point index.d.ts
- //
- // (undocumented)
- readonly id: LogLevelId;
- // (undocumented)
- static readonly Info: LogLevel;
- // (undocumented)
- static readonly Off: LogLevel;
- supports(level: LogLevel): boolean;
- // (undocumented)
- static readonly Trace: LogLevel;
- // (undocumented)
- readonly value: number;
- // (undocumented)
- static readonly Warn: LogLevel;
-}
+export { LogLevel }
-// @public
-export interface LogMeta {
- // (undocumented)
- [key: string]: any;
-}
+export { LogMeta }
-// @internal
-export interface LogRecord {
- // (undocumented)
- context: string;
- // (undocumented)
- error?: Error;
- // (undocumented)
- level: LogLevel;
- // (undocumented)
- message: string;
- // (undocumented)
- meta?: {
- [name: string]: any;
- };
- // (undocumented)
- pid: number;
- // (undocumented)
- timestamp: Date;
-}
+export { LogRecord }
// @public
export interface MetricsServiceSetup {
diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md
index 27d4ea49f9eb1..f5f3d3baf68b4 100644
--- a/src/plugins/data/public/public.api.md
+++ b/src/plugins/data/public/public.api.md
@@ -39,6 +39,8 @@ import { KibanaClient } from '@elastic/elasticsearch/api/kibana';
import { KibanaConfigType } from 'src/core/server/kibana_config';
import { Location } from 'history';
import { LocationDescriptorObject } from 'history';
+import { Logger } from '@kbn/logging';
+import { LogMeta } from '@kbn/logging';
import { MaybePromise } from '@kbn/utility-types';
import { METRIC_TYPE } from '@kbn/analytics';
import { Moment } from 'moment';
diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md
index cd0369a5c4551..bfa9cad6e5d24 100644
--- a/src/plugins/data/server/server.api.md
+++ b/src/plugins/data/server/server.api.md
@@ -104,7 +104,10 @@ import { KibanaClient } from '@elastic/elasticsearch/api/kibana';
import { KibanaConfigType as KibanaConfigType_2 } from 'src/core/server/kibana_config';
import { KibanaRequest } from 'kibana/server';
import { LegacyAPICaller as LegacyAPICaller_2 } from 'kibana/server';
+import { Logger } from '@kbn/logging';
import { Logger as Logger_2 } from 'kibana/server';
+import { LoggerFactory } from '@kbn/logging';
+import { LogMeta } from '@kbn/logging';
import { MGetParams } from 'elasticsearch';
import { MGetResponse } from 'elasticsearch';
import { Moment } from 'moment';