From f334c568a5039f88f72fb99ee25410a19ffbe501 Mon Sep 17 00:00:00 2001
From: Jamie Magee <JamieMagee@users.noreply.github.com>
Date: Mon, 15 Jul 2019 11:04:05 +0200
Subject: [PATCH] feat(typescript): convert logger to typescript (#3671)

---
 .eslintrc.js                                  |  1 +
 lib/config/decrypt.js                         |  1 +
 lib/config/file.js                            |  1 +
 lib/config/index.js                           |  3 +-
 lib/config/migrate-validate.js                |  1 +
 lib/config/migration.js                       |  1 +
 lib/config/presets.js                         |  1 +
 lib/datasource/cargo/index.js                 |  1 +
 lib/datasource/dart/index.js                  |  1 +
 lib/datasource/docker/index.js                |  1 +
 lib/datasource/git-tags/index.js              |  1 +
 lib/datasource/github/index.js                |  1 +
 lib/datasource/gitlab/index.js                |  1 +
 lib/datasource/go/index.js                    |  1 +
 lib/datasource/gradle-version/index.js        |  1 +
 lib/datasource/hex/index.js                   |  1 +
 lib/datasource/index.js                       |  1 +
 lib/datasource/maven/index.js                 |  1 +
 lib/datasource/maven/util.js                  |  1 +
 lib/datasource/npm/get.js                     |  1 +
 lib/datasource/npm/npmrc.js                   |  1 +
 lib/datasource/npm/presets.js                 |  2 +
 lib/datasource/nuget/index.js                 |  1 +
 lib/datasource/nuget/v2.js                    |  1 +
 lib/datasource/nuget/v3.js                    |  1 +
 lib/datasource/orb/index.js                   |  1 +
 lib/datasource/packagist/index.js             |  1 +
 lib/datasource/pypi/index.js                  |  1 +
 lib/datasource/ruby-version/index.js          |  1 +
 lib/datasource/rubygems/get-rubygems-org.js   |  1 +
 lib/datasource/rubygems/get.js                |  1 +
 lib/datasource/rubygems/retriable.js          |  1 +
 lib/datasource/sbt/index.js                   |  1 +
 lib/datasource/terraform/index.js             |  1 +
 lib/logger/__mocks__/index.ts                 | 19 ++++
 lib/logger/cmd-serializer.js                  |  2 +-
 lib/logger/index.js                           | 82 ----------------
 lib/logger/index.ts                           | 93 +++++++++++++++++++
 .../{pretty-stdout.js => pretty-stdout.ts}    | 57 ++++++------
 lib/manager/ansible/extract.js                |  1 +
 lib/manager/ansible/update.js                 |  1 +
 lib/manager/bazel/extract.js                  |  1 +
 lib/manager/bazel/update.js                   |  1 +
 lib/manager/buildkite/extract.js              |  1 +
 lib/manager/buildkite/update.js               |  2 +
 lib/manager/bundler/artifacts.js              |  1 +
 lib/manager/bundler/extract.js                |  1 +
 lib/manager/bundler/update.js                 |  2 +
 lib/manager/cargo/artifacts.js                |  1 +
 lib/manager/cargo/extract.js                  |  1 +
 lib/manager/cargo/update.js                   |  1 +
 lib/manager/circleci/extract.js               |  1 +
 lib/manager/circleci/update.js                |  1 +
 lib/manager/composer/artifacts.js             |  1 +
 lib/manager/composer/extract.js               |  1 +
 lib/manager/composer/range.js                 |  2 +
 lib/manager/docker-compose/extract.js         |  1 +
 lib/manager/docker-compose/update.js          |  1 +
 lib/manager/dockerfile/extract.js             |  2 +
 lib/manager/dockerfile/update.js              |  2 +
 lib/manager/github-actions/extract.js         |  1 +
 lib/manager/github-actions/update.js          |  1 +
 lib/manager/gitlabci-include/update.js        |  1 +
 lib/manager/gitlabci/extract.js               |  1 +
 lib/manager/gitlabci/update.js                |  1 +
 lib/manager/gomod/artifacts.js                |  1 +
 lib/manager/gomod/extract.js                  |  1 +
 lib/manager/gomod/update.js                   |  1 +
 lib/manager/gradle-wrapper/extract.js         |  1 +
 lib/manager/gradle-wrapper/update.js          |  1 +
 lib/manager/gradle/gradle-updates-report.js   |  1 +
 lib/manager/gradle/index.js                   |  1 +
 lib/manager/homebrew/extract.js               |  2 +
 lib/manager/homebrew/update.js                |  1 +
 lib/manager/kubernetes/extract.js             |  1 +
 lib/manager/kubernetes/update.js              |  1 +
 lib/manager/maven/extract.js                  |  1 +
 lib/manager/meteor/extract.js                 |  2 +
 lib/manager/meteor/update.js                  |  2 +
 lib/manager/npm/extract/index.js              |  1 +
 lib/manager/npm/extract/locked-versions.js    |  1 +
 lib/manager/npm/extract/monorepo.js           |  1 +
 lib/manager/npm/extract/npm.js                |  2 +
 lib/manager/npm/extract/yarn.js               |  1 +
 lib/manager/npm/post-update/index.js          |  2 +-
 lib/manager/npm/post-update/lerna.js          |  1 +
 lib/manager/npm/post-update/npm.js            |  1 +
 lib/manager/npm/post-update/pnpm.js           |  1 +
 lib/manager/npm/post-update/yarn.js           |  1 +
 lib/manager/npm/range.js                      |  1 +
 lib/manager/npm/update.js                     |  1 +
 lib/manager/nuget/extract.js                  |  1 +
 lib/manager/nuget/update.js                   |  2 +
 lib/manager/nvm/update.js                     |  2 +
 lib/manager/pip_requirements/extract.js       |  1 +
 lib/manager/pip_requirements/update.js        |  1 +
 lib/manager/pip_setup/extract.js              |  1 +
 lib/manager/pipenv/artifacts.js               |  1 +
 lib/manager/pipenv/extract.js                 |  1 +
 lib/manager/pipenv/update.js                  |  1 +
 lib/manager/poetry/artifacts.js               |  2 +
 lib/manager/poetry/extract.js                 |  1 +
 lib/manager/poetry/update.js                  |  2 +
 lib/manager/pub/extract.js                    |  1 +
 lib/manager/ruby-version/extract.js           |  1 +
 lib/manager/ruby-version/update.js            |  2 +
 lib/manager/terraform/extract.js              |  1 +
 lib/manager/terraform/update.js               |  2 +
 lib/manager/travis/package.js                 |  1 +
 lib/manager/travis/update.js                  |  1 +
 lib/platform/azure/azure-helper.ts            |  1 +
 lib/platform/azure/index.ts                   |  1 +
 lib/platform/bitbucket-server/index.ts        |  1 +
 lib/platform/bitbucket/index.ts               |  1 +
 lib/platform/git/storage.ts                   |  1 +
 lib/platform/github/gh-got-wrapper.ts         |  1 +
 lib/platform/github/index.ts                  |  1 +
 lib/platform/gitlab/gl-got-wrapper.ts         |  1 +
 lib/platform/gitlab/index.ts                  |  1 +
 lib/platform/index.ts                         |  1 +
 lib/types.d.ts                                | 21 +----
 lib/util/got/auth.js                          |  1 +
 lib/util/got/host-rules.js                    |  1 +
 lib/util/got/stats.js                         |  1 +
 lib/util/host-rules.ts                        |  1 +
 lib/util/ignore.js                            |  2 +
 lib/util/package-rules.js                     |  1 +
 lib/versioning/composer/index.js              |  1 +
 lib/versioning/index.js                       |  1 +
 lib/versioning/npm/range.js                   |  1 +
 lib/versioning/pep440/range.js                |  1 +
 lib/versioning/ruby/index.js                  |  1 +
 lib/versioning/ruby/range.js                  |  1 +
 lib/versioning/ruby/strategies/bump.js        |  1 +
 lib/workers/branch/automerge.js               |  2 +
 lib/workers/branch/check-existing.js          |  2 +
 lib/workers/branch/commit.js                  |  1 +
 lib/workers/branch/get-updated.js             |  1 +
 lib/workers/branch/index.js                   |  3 +-
 lib/workers/branch/parent.js                  |  1 +
 lib/workers/branch/schedule.js                |  1 +
 lib/workers/branch/status-checks.js           |  1 +
 lib/workers/global/autodiscover.js            |  1 +
 lib/workers/global/cache.js                   |  1 +
 lib/workers/global/index.js                   |  5 +-
 lib/workers/pr/changelog/index.js             |  1 +
 lib/workers/pr/changelog/release-notes.js     |  1 +
 lib/workers/pr/changelog/source-github.js     |  1 +
 lib/workers/pr/index.js                       |  1 +
 lib/workers/pr/pr-body.js                     |  1 +
 lib/workers/repository/error-config.js        |  1 +
 lib/workers/repository/error.js               | 12 +--
 lib/workers/repository/extract/file-match.js  |  1 +
 lib/workers/repository/extract/index.js       |  1 +
 .../repository/extract/manager-files.js       |  2 +
 lib/workers/repository/finalise/prune.js      |  2 +
 lib/workers/repository/finalise/validate.js   |  3 +-
 lib/workers/repository/index.js               |  6 +-
 lib/workers/repository/init/base.js           |  2 +
 lib/workers/repository/init/config.js         |  1 +
 lib/workers/repository/init/flatten.js        |  1 +
 lib/workers/repository/init/index.js          |  1 +
 lib/workers/repository/init/semantic.js       |  1 +
 lib/workers/repository/init/vulnerability.js  |  1 +
 lib/workers/repository/master-issue.js        |  1 +
 .../repository/onboarding/branch/check.js     |  1 +
 .../repository/onboarding/branch/config.js    |  1 +
 .../repository/onboarding/branch/create.js    |  1 +
 .../repository/onboarding/branch/index.js     |  1 +
 .../repository/onboarding/branch/rebase.js    |  1 +
 .../onboarding/pr/config-description.js       |  1 +
 .../onboarding/pr/errors-warnings.js          |  1 +
 lib/workers/repository/onboarding/pr/index.js |  1 +
 .../repository/onboarding/pr/pr-list.js       |  1 +
 lib/workers/repository/process/deprecated.js  |  2 +
 .../repository/process/extract-update.js      |  1 +
 lib/workers/repository/process/fetch.js       |  1 +
 lib/workers/repository/process/index.js       |  1 +
 lib/workers/repository/process/limits.js      |  1 +
 .../repository/process/lookup/filter.js       |  1 +
 .../repository/process/lookup/index.js        |  1 +
 .../repository/process/lookup/rollback.js     |  1 +
 lib/workers/repository/process/sort.js        |  2 +
 lib/workers/repository/process/write.js       |  1 +
 lib/workers/repository/updates/branchify.js   |  5 +-
 lib/workers/repository/updates/generate.js    |  1 +
 test/datasource/maven.spec.js                 |  3 -
 test/datasource/sbt/index.spec.js             |  3 -
 test/globals.js                               |  2 +-
 ...pec.js.snap => pretty-stdout.spec.ts.snap} |  6 ++
 test/logger/_fixtures/index.js                | 11 ---
 test/logger/index.spec.js                     | 32 -------
 test/logger/index.spec.ts                     | 26 ++++++
 ...y-stdout.spec.js => pretty-stdout.spec.ts} | 39 +++++---
 test/manager/gradle/index.spec.js             |  3 -
 test/workers/repository/error.spec.js         |  2 +-
 tsconfig.json                                 |  2 +-
 197 files changed, 423 insertions(+), 215 deletions(-)
 create mode 100644 lib/logger/__mocks__/index.ts
 delete mode 100644 lib/logger/index.js
 create mode 100644 lib/logger/index.ts
 rename lib/logger/{pretty-stdout.js => pretty-stdout.ts} (68%)
 rename test/logger/__snapshots__/{pretty-stdout.spec.js.snap => pretty-stdout.spec.ts.snap} (51%)
 delete mode 100644 test/logger/_fixtures/index.js
 delete mode 100644 test/logger/index.spec.js
 create mode 100644 test/logger/index.spec.ts
 rename test/logger/{pretty-stdout.spec.js => pretty-stdout.spec.ts} (50%)

diff --git a/.eslintrc.js b/.eslintrc.js
index 33397a5140..104c5bed6e 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,6 +1,7 @@
 module.exports = {
   env: {
     node: true,
+    jest: true,
   },
   extends: [
     'plugin:promise/recommended',
diff --git a/lib/config/decrypt.js b/lib/config/decrypt.js
index c3c9f5667e..8003289316 100644
--- a/lib/config/decrypt.js
+++ b/lib/config/decrypt.js
@@ -1,5 +1,6 @@
 const is = require('@sindresorhus/is');
 const crypto = require('crypto');
+const { logger } = require('../logger');
 const { maskToken } = require('../util/mask');
 
 module.exports = {
diff --git a/lib/config/file.js b/lib/config/file.js
index 83c1a70a36..5dbda4be65 100644
--- a/lib/config/file.js
+++ b/lib/config/file.js
@@ -1,4 +1,5 @@
 const path = require('path');
+const { logger } = require('../logger');
 const { migrateConfig } = require('./migration');
 
 module.exports = {
diff --git a/lib/config/index.js b/lib/config/index.js
index 27a05b485c..09f97e7edf 100644
--- a/lib/config/index.js
+++ b/lib/config/index.js
@@ -1,3 +1,4 @@
+const { logger, levels } = require('../logger');
 const definitions = require('./definitions');
 
 const defaultsParser = require('./defaults');
@@ -55,7 +56,7 @@ async function parseConfigs(env, argv) {
   }
 
   // Set log level
-  logger.levels('stdout', config.logLevel);
+  levels('stdout', config.logLevel);
 
   // Add file logger
   // istanbul ignore if
diff --git a/lib/config/migrate-validate.js b/lib/config/migrate-validate.js
index 1e9e7599ff..772d02841c 100644
--- a/lib/config/migrate-validate.js
+++ b/lib/config/migrate-validate.js
@@ -1,4 +1,5 @@
 const is = require('@sindresorhus/is');
+const { logger } = require('../logger');
 const configMigration = require('./migration');
 const configMassage = require('./massage');
 const configValidation = require('./validation');
diff --git a/lib/config/migration.js b/lib/config/migration.js
index 868dd85986..bc4d7175b6 100644
--- a/lib/config/migration.js
+++ b/lib/config/migration.js
@@ -1,5 +1,6 @@
 const is = require('@sindresorhus/is');
 const later = require('later');
+const { logger } = require('../logger');
 const options = require('./definitions').getOptions();
 
 const clone = input => JSON.parse(JSON.stringify(input));
diff --git a/lib/config/presets.js b/lib/config/presets.js
index 6ddb28750b..f8df3b6487 100644
--- a/lib/config/presets.js
+++ b/lib/config/presets.js
@@ -1,4 +1,5 @@
 const is = require('@sindresorhus/is');
+const { logger } = require('../logger');
 const configParser = require('./index');
 const massage = require('./massage');
 const migration = require('./migration');
diff --git a/lib/datasource/cargo/index.js b/lib/datasource/cargo/index.js
index f23a15cc64..ccda70e2e9 100644
--- a/lib/datasource/cargo/index.js
+++ b/lib/datasource/cargo/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const got = require('../../util/got');
 
 module.exports = {
diff --git a/lib/datasource/dart/index.js b/lib/datasource/dart/index.js
index 40e5ce04de..a8b64f54bb 100644
--- a/lib/datasource/dart/index.js
+++ b/lib/datasource/dart/index.js
@@ -1,4 +1,5 @@
 const got = require('../../util/got');
+const { logger } = require('../../logger');
 
 async function getPkgReleases({ lookupName }) {
   let result = null;
diff --git a/lib/datasource/docker/index.js b/lib/datasource/docker/index.js
index b3c181aac2..5685d7e09f 100644
--- a/lib/datasource/docker/index.js
+++ b/lib/datasource/docker/index.js
@@ -3,6 +3,7 @@ const URL = require('url');
 const is = require('@sindresorhus/is');
 const parseLinkHeader = require('parse-link-header');
 const wwwAuthenticate = require('www-authenticate');
+const { logger } = require('../../logger');
 
 const got = require('../../util/got');
 const hostRules = require('../../util/host-rules');
diff --git a/lib/datasource/git-tags/index.js b/lib/datasource/git-tags/index.js
index d6374e1b13..223e356c28 100644
--- a/lib/datasource/git-tags/index.js
+++ b/lib/datasource/git-tags/index.js
@@ -3,6 +3,7 @@ const semver = require('../../versioning/semver');
 
 const cacheNamespace = 'git-tags';
 const cacheMinutes = 10;
+const { logger } = require('../../logger');
 
 // git will prompt for known hosts or passwords, unless we activate BatchMode
 process.env.GIT_SSH_COMMAND = 'ssh -o BatchMode=yes';
diff --git a/lib/datasource/github/index.js b/lib/datasource/github/index.js
index aef7ae9b67..e88e9cfc80 100644
--- a/lib/datasource/github/index.js
+++ b/lib/datasource/github/index.js
@@ -1,5 +1,6 @@
 import ghGot from '../../platform/github/gh-got-wrapper';
 
+const { logger } = require('../../logger');
 const got = require('../../util/got');
 
 module.exports = {
diff --git a/lib/datasource/gitlab/index.js b/lib/datasource/gitlab/index.js
index d037c0eaa6..048071a393 100644
--- a/lib/datasource/gitlab/index.js
+++ b/lib/datasource/gitlab/index.js
@@ -1,6 +1,7 @@
 const is = require('@sindresorhus/is');
 
 const glGot = require('../../platform/gitlab/gl-got-wrapper').api.get;
+const { logger } = require('../../logger');
 
 module.exports = {
   getPreset,
diff --git a/lib/datasource/go/index.js b/lib/datasource/go/index.js
index c1d541a026..1b838a3a42 100644
--- a/lib/datasource/go/index.js
+++ b/lib/datasource/go/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const got = require('../../util/got');
 const github = require('../github');
 
diff --git a/lib/datasource/gradle-version/index.js b/lib/datasource/gradle-version/index.js
index 9143cfd2b6..ae6fc021c1 100644
--- a/lib/datasource/gradle-version/index.js
+++ b/lib/datasource/gradle-version/index.js
@@ -1,4 +1,5 @@
 const { coerce } = require('semver');
+const { logger } = require('../../logger');
 const got = require('../../util/got');
 
 module.exports = {
diff --git a/lib/datasource/hex/index.js b/lib/datasource/hex/index.js
index 96f3d6cd7c..7f5b7ece41 100644
--- a/lib/datasource/hex/index.js
+++ b/lib/datasource/hex/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const got = require('../../util/got');
 
 module.exports = {
diff --git a/lib/datasource/index.js b/lib/datasource/index.js
index d6a0c3060d..6400ed8bae 100644
--- a/lib/datasource/index.js
+++ b/lib/datasource/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../logger');
 const { addMetaData } = require('./metadata');
 const versioning = require('../versioning');
 
diff --git a/lib/datasource/maven/index.js b/lib/datasource/maven/index.js
index bba728d321..6f86f9e0cb 100644
--- a/lib/datasource/maven/index.js
+++ b/lib/datasource/maven/index.js
@@ -2,6 +2,7 @@ const url = require('url');
 const fs = require('fs-extra');
 const { XmlDocument } = require('xmldoc');
 const is = require('@sindresorhus/is');
+const { logger } = require('../../logger');
 
 const { compare } = require('../../versioning/maven/compare');
 const { containsPlaceholder } = require('../../manager/maven/extract');
diff --git a/lib/datasource/maven/util.js b/lib/datasource/maven/util.js
index 5e9ea3204d..171d3576c2 100644
--- a/lib/datasource/maven/util.js
+++ b/lib/datasource/maven/util.js
@@ -1,4 +1,5 @@
 const got = require('../../util/got');
+const { logger } = require('../../logger');
 
 module.exports = {
   downloadHttpProtocol,
diff --git a/lib/datasource/npm/get.js b/lib/datasource/npm/get.js
index 1f2943d7f7..a3c5f77733 100644
--- a/lib/datasource/npm/get.js
+++ b/lib/datasource/npm/get.js
@@ -4,6 +4,7 @@ const getRegistryUrl = require('registry-auth-token/registry-url');
 const registryAuthToken = require('registry-auth-token');
 const parse = require('github-url-from-git');
 const { isBase64 } = require('validator');
+const { logger } = require('../../logger');
 
 const got = require('../../util/got');
 const hostRules = require('../../util/host-rules');
diff --git a/lib/datasource/npm/npmrc.js b/lib/datasource/npm/npmrc.js
index 05f59c1a0f..bd33b9000d 100644
--- a/lib/datasource/npm/npmrc.js
+++ b/lib/datasource/npm/npmrc.js
@@ -1,6 +1,7 @@
 const is = require('@sindresorhus/is');
 const ini = require('ini');
 const { isBase64 } = require('validator');
+const { logger } = require('../../logger');
 
 let npmrc = null;
 let npmrcRaw;
diff --git a/lib/datasource/npm/presets.js b/lib/datasource/npm/presets.js
index 6f1d9121ab..bcab3aa0bb 100644
--- a/lib/datasource/npm/presets.js
+++ b/lib/datasource/npm/presets.js
@@ -1,3 +1,5 @@
+import { logger } from '../../logger';
+
 const { getDependency } = require('./get');
 
 module.exports = {
diff --git a/lib/datasource/nuget/index.js b/lib/datasource/nuget/index.js
index 09ed6a8557..b4399c564c 100644
--- a/lib/datasource/nuget/index.js
+++ b/lib/datasource/nuget/index.js
@@ -1,4 +1,5 @@
 const urlApi = require('url');
+const { logger } = require('../../logger');
 const v2 = require('./v2');
 const v3 = require('./v3');
 
diff --git a/lib/datasource/nuget/v2.js b/lib/datasource/nuget/v2.js
index d959e1a4e3..aed75a5f44 100644
--- a/lib/datasource/nuget/v2.js
+++ b/lib/datasource/nuget/v2.js
@@ -1,5 +1,6 @@
 const parse = require('github-url-from-git');
 const { XmlDocument } = require('xmldoc');
+const { logger } = require('../../logger');
 const got = require('../../util/got');
 
 module.exports = {
diff --git a/lib/datasource/nuget/v3.js b/lib/datasource/nuget/v3.js
index 6068ab2009..18965f52fa 100644
--- a/lib/datasource/nuget/v3.js
+++ b/lib/datasource/nuget/v3.js
@@ -1,6 +1,7 @@
 const parse = require('github-url-from-git');
 const semver = require('semver');
 const { XmlDocument } = require('xmldoc');
+const { logger } = require('../../logger');
 const got = require('../../util/got');
 
 module.exports = {
diff --git a/lib/datasource/orb/index.js b/lib/datasource/orb/index.js
index 33cd69481a..0c912d501f 100644
--- a/lib/datasource/orb/index.js
+++ b/lib/datasource/orb/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const got = require('../../util/got');
 
 module.exports = {
diff --git a/lib/datasource/packagist/index.js b/lib/datasource/packagist/index.js
index a0c1bd5919..42772c6c4e 100644
--- a/lib/datasource/packagist/index.js
+++ b/lib/datasource/packagist/index.js
@@ -3,6 +3,7 @@ const URL = require('url');
 const delay = require('delay');
 const parse = require('github-url-from-git');
 const pAll = require('p-all');
+const { logger } = require('../../logger');
 
 const got = require('../../util/got');
 const hostRules = require('../../util/host-rules');
diff --git a/lib/datasource/pypi/index.js b/lib/datasource/pypi/index.js
index 80932eb665..63cc856223 100644
--- a/lib/datasource/pypi/index.js
+++ b/lib/datasource/pypi/index.js
@@ -1,6 +1,7 @@
 const url = require('url');
 const is = require('@sindresorhus/is');
 const { parse } = require('node-html-parser');
+const { logger } = require('../../logger');
 const { matches } = require('../../versioning/pep440');
 const got = require('../../util/got');
 
diff --git a/lib/datasource/ruby-version/index.js b/lib/datasource/ruby-version/index.js
index a32573611c..03598f3440 100644
--- a/lib/datasource/ruby-version/index.js
+++ b/lib/datasource/ruby-version/index.js
@@ -1,4 +1,5 @@
 const { parse } = require('node-html-parser');
+const { logger } = require('../../logger');
 
 const got = require('../../util/got');
 const { isVersion } = require('../../versioning/ruby');
diff --git a/lib/datasource/rubygems/get-rubygems-org.js b/lib/datasource/rubygems/get-rubygems-org.js
index 032818bdaa..25eea2834d 100644
--- a/lib/datasource/rubygems/get-rubygems-org.js
+++ b/lib/datasource/rubygems/get-rubygems-org.js
@@ -1,4 +1,5 @@
 const got = require('../../util/got');
+const { logger } = require('../../logger');
 
 module.exports = {
   getRubygemsOrgDependency,
diff --git a/lib/datasource/rubygems/get.js b/lib/datasource/rubygems/get.js
index efce817185..0e2c869bc9 100644
--- a/lib/datasource/rubygems/get.js
+++ b/lib/datasource/rubygems/get.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const got = require('../../util/got');
 const { maskToken } = require('../../util/mask');
 const retriable = require('./retriable');
diff --git a/lib/datasource/rubygems/retriable.js b/lib/datasource/rubygems/retriable.js
index 217609f196..dea324b773 100644
--- a/lib/datasource/rubygems/retriable.js
+++ b/lib/datasource/rubygems/retriable.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const {
   UNAUTHORIZED,
   FORBIDDEN,
diff --git a/lib/datasource/sbt/index.js b/lib/datasource/sbt/index.js
index 2bd99e71f5..9f8d442dd6 100644
--- a/lib/datasource/sbt/index.js
+++ b/lib/datasource/sbt/index.js
@@ -1,6 +1,7 @@
 const { compare } = require('../../versioning/maven/compare');
 const { downloadHttpProtocol } = require('../maven/util');
 const { parseIndexDir, SBT_PLUGINS_REPO } = require('./util');
+const { logger } = require('../../logger');
 
 async function getPkgReleases(config) {
   const { lookupName, depType } = config;
diff --git a/lib/datasource/terraform/index.js b/lib/datasource/terraform/index.js
index b9c7b83bc4..0a378b4f02 100644
--- a/lib/datasource/terraform/index.js
+++ b/lib/datasource/terraform/index.js
@@ -1,5 +1,6 @@
 const parse = require('github-url-from-git');
 const is = require('@sindresorhus/is');
+const { logger } = require('../../logger');
 
 const got = require('../../util/got');
 
diff --git a/lib/logger/__mocks__/index.ts b/lib/logger/__mocks__/index.ts
new file mode 100644
index 0000000000..2e09087795
--- /dev/null
+++ b/lib/logger/__mocks__/index.ts
@@ -0,0 +1,19 @@
+const loggerLevels: string[] = [
+  'trace',
+  'debug',
+  'info',
+  'warn',
+  'error',
+  'fatal',
+  'child',
+];
+const logger: any = {};
+
+loggerLevels.forEach(k => {
+  logger[k] = jest.fn();
+});
+
+export const setMeta = jest.fn();
+export const levels = jest.fn();
+
+export { logger };
diff --git a/lib/logger/cmd-serializer.js b/lib/logger/cmd-serializer.js
index f3fd49fb49..02950a6a96 100644
--- a/lib/logger/cmd-serializer.js
+++ b/lib/logger/cmd-serializer.js
@@ -1,4 +1,4 @@
-module.exports = cmdSerializer;
+export default cmdSerializer;
 
 // istanbul ignore next
 function cmdSerializer(cmd) {
diff --git a/lib/logger/index.js b/lib/logger/index.js
deleted file mode 100644
index 2cc943442e..0000000000
--- a/lib/logger/index.js
+++ /dev/null
@@ -1,82 +0,0 @@
-const is = require('@sindresorhus/is');
-const bunyan = require('bunyan');
-const PrettyStdout = require('./pretty-stdout').RenovateStream;
-const configSerializer = require('./config-serializer');
-const errSerializer = require('./err-serializer');
-const cmdSerializer = require('./cmd-serializer');
-
-let bunyanLogger;
-let meta = {};
-
-function initLogger() {
-  const stdout = {
-    name: 'stdout',
-    level: process.env.LOG_LEVEL || 'info',
-    stream: process.stdout,
-  };
-
-  if (process.env.LOG_FORMAT !== 'json') {
-    const prettyStdOut = new PrettyStdout();
-    prettyStdOut.pipe(process.stdout);
-    stdout.type = 'raw';
-    stdout.stream = prettyStdOut;
-  }
-
-  bunyanLogger = bunyan.createLogger({
-    name: 'renovate',
-    serializers: {
-      body: configSerializer,
-      cmd: cmdSerializer,
-      config: configSerializer,
-      migratedConfig: configSerializer,
-      originalConfig: configSerializer,
-      presetConfig: configSerializer,
-      err: errSerializer,
-    },
-    streams: [stdout],
-  });
-
-  global.logger = {};
-
-  const logFunctions = [
-    'trace',
-    'debug',
-    'info',
-    'warn',
-    'error',
-    'fatal',
-    'child',
-  ];
-  logFunctions.forEach(x => {
-    global.logger[x] = (p1, p2) => {
-      global.renovateError =
-        global.renovateError || x === 'error' || x === 'fatal';
-      if (p2) {
-        // meta and msg provided
-        return bunyanLogger[x]({ ...meta, ...p1 }, p2);
-      }
-      if (is.string(p1)) {
-        // only message provided
-        return bunyanLogger[x](meta, p1);
-      }
-      // only meta provided
-      return bunyanLogger[x]({ ...meta, ...p1 });
-    };
-  });
-  global.logger.master = bunyanLogger;
-  global.logger.addStream = stream => {
-    bunyanLogger.addStream(stream);
-  };
-  global.logger.levels = (stream, level) => {
-    bunyanLogger.levels(stream, level);
-  };
-
-  // setMeta overrides existing meta
-  global.logger.setMeta = function setMeta(obj) {
-    meta = { ...obj };
-  };
-}
-
-module.exports = {
-  initLogger,
-};
diff --git a/lib/logger/index.ts b/lib/logger/index.ts
new file mode 100644
index 0000000000..7d44d27b98
--- /dev/null
+++ b/lib/logger/index.ts
@@ -0,0 +1,93 @@
+import * as bunyan from 'bunyan';
+
+import is from '@sindresorhus/is';
+import { RenovateStream } from './pretty-stdout';
+import configSerializer from './config-serializer';
+import errSerializer from './err-serializer';
+import cmdSerializer from './cmd-serializer';
+
+let meta = {};
+
+const stdout: bunyan.Stream = {
+  name: 'stdout',
+  level: (process.env.LOG_LEVEL as bunyan.LogLevel) || 'info',
+  stream: process.stdout,
+};
+
+if (process.env.LOG_FORMAT !== 'json') {
+  // TODO: typings
+  const prettyStdOut = new RenovateStream() as any;
+  prettyStdOut.pipe(process.stdout);
+  stdout.stream = prettyStdOut;
+  stdout.type = 'raw';
+}
+
+const bunyanLogger = bunyan.createLogger({
+  name: 'renovate',
+  serializers: {
+    body: configSerializer,
+    cmd: cmdSerializer,
+    config: configSerializer,
+    migratedConfig: configSerializer,
+    originalConfig: configSerializer,
+    presetConfig: configSerializer,
+    err: errSerializer,
+  },
+  streams: [stdout],
+});
+
+const logFactory = (level: bunyan.LogLevelString): any => {
+  return (p1: any, p2: any): void => {
+    global.renovateError =
+      global.renovateError || level === 'error' || level === 'fatal';
+    if (p2) {
+      // meta and msg provided
+      bunyanLogger[level]({ ...meta, ...p1 }, p2);
+    } else if (is.string(p1)) {
+      // only message provided
+      bunyanLogger[level](meta, p1);
+    } else {
+      // only meta provided
+      bunyanLogger[level](meta, p1);
+    }
+  };
+};
+
+const loggerLevels: bunyan.LogLevelString[] = [
+  'trace',
+  'debug',
+  'info',
+  'warn',
+  'error',
+  'fatal',
+];
+
+interface Logger {
+  trace(msg: string): void;
+  trace(meta: Record<string, any>, msg?: string): void;
+  debug(msg: string): void;
+  debug(meta: Record<string, any>, msg?: string): void;
+  info(msg: string): void;
+  info(meta: Record<string, any>, msg?: string): void;
+  warn(msg: string): void;
+  warn(meta: Record<string, any>, msg?: string): void;
+  error(msg: string): void;
+  error(meta: Record<string, any>, msg?: string): void;
+  fatal(msg: string): void;
+  fatal(meta: Record<string, any>, msg?: string): void;
+}
+
+export const logger: Logger = {} as any;
+
+loggerLevels.forEach(loggerLevel => {
+  logger[loggerLevel] = logFactory(loggerLevel);
+});
+
+// setMeta overrides existing meta
+export function setMeta(obj: any) {
+  meta = { ...obj };
+}
+
+export function levels(name: string, level: bunyan.LogLevel): void {
+  bunyanLogger.levels(name, level);
+}
diff --git a/lib/logger/pretty-stdout.js b/lib/logger/pretty-stdout.ts
similarity index 68%
rename from lib/logger/pretty-stdout.js
rename to lib/logger/pretty-stdout.ts
index a3b5db5639..676c1c345a 100644
--- a/lib/logger/pretty-stdout.js
+++ b/lib/logger/pretty-stdout.ts
@@ -1,10 +1,10 @@
 // Code originally derived from https://github.com/hadfieldn/node-bunyan-prettystream but since heavily edited
 // Neither fork nor original repo appear to be maintained
 
-const { Stream } = require('stream');
-const util = require('util');
-const chalk = require('chalk');
-const stringify = require('json-stringify-pretty-compact');
+import * as util from 'util';
+import { Stream } from 'stream';
+import chalk from 'chalk';
+import stringify from 'json-stringify-pretty-compact';
 
 const bunyanFields = [
   'name',
@@ -25,7 +25,7 @@ const metaFields = [
   'branch',
 ];
 
-const levels = {
+const levels: Record<number, string> = {
   10: chalk.gray('TRACE'),
   20: chalk.blue('DEBUG'),
   30: chalk.green(' INFO'),
@@ -34,12 +34,12 @@ const levels = {
   60: chalk.bgRed('FATAL'),
 };
 
-function indent(str, leading = false) {
+export function indent(str: string, leading = false) {
   const prefix = leading ? '       ' : '';
   return prefix + str.split(/\r?\n/).join('\n       ');
 }
 
-function getMeta(rec) {
+export function getMeta(rec: BunyanRecord) {
   if (!rec) {
     return '';
   }
@@ -55,7 +55,7 @@ function getMeta(rec) {
   return chalk.gray(res);
 }
 
-function getDetails(rec) {
+export function getDetails(rec: BunyanRecord) {
   if (!rec) {
     return '';
   }
@@ -75,8 +75,7 @@ function getDetails(rec) {
     .join(',\n')}\n`;
 }
 
-// istanbul ignore next
-function formatRecord(rec) {
+export function formatRecord(rec: BunyanRecord) {
   const level = levels[rec.level];
   const msg = `${indent(rec.msg)}`;
   const meta = getMeta(rec);
@@ -84,24 +83,26 @@ function formatRecord(rec) {
   return util.format('%s: %s%s\n%s', level, msg, meta, details);
 }
 
-function RenovateStream() {
-  this.readable = true;
-  this.writable = true;
-  Stream.call(this);
-}
+export class RenovateStream extends Stream {
+  readable: boolean;
 
-util.inherits(RenovateStream, Stream);
+  writable: boolean;
 
-// istanbul ignore next
-RenovateStream.prototype.write = function write(data) {
-  this.emit('data', formatRecord(data));
-  return true;
-};
+  constructor() {
+    super();
+    this.readable = true;
+    this.writable = true;
+  }
 
-module.exports = {
-  indent,
-  getMeta,
-  getDetails,
-  formatRecord,
-  RenovateStream,
-};
+  // istanbul ignore next
+  write(data: BunyanRecord) {
+    this.emit('data', formatRecord(data));
+    return true;
+  }
+}
+
+export interface BunyanRecord extends Record<string, any> {
+  level: number;
+  msg: string;
+  module?: string;
+}
diff --git a/lib/manager/ansible/extract.js b/lib/manager/ansible/extract.js
index ea3fb83f33..78e5951231 100644
--- a/lib/manager/ansible/extract.js
+++ b/lib/manager/ansible/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getDep } = require('../dockerfile/extract');
 
 module.exports = {
diff --git a/lib/manager/ansible/update.js b/lib/manager/ansible/update.js
index 3a46d71f52..3f7640961a 100644
--- a/lib/manager/ansible/update.js
+++ b/lib/manager/ansible/update.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getNewFrom } = require('../dockerfile/update');
 
 module.exports = {
diff --git a/lib/manager/bazel/extract.js b/lib/manager/bazel/extract.js
index 37e8c8f95d..28c709ef7b 100644
--- a/lib/manager/bazel/extract.js
+++ b/lib/manager/bazel/extract.js
@@ -1,6 +1,7 @@
 /* eslint no-plusplus: 0 default-case: 0 */
 const parse = require('github-url-from-git');
 const URL = require('url');
+const { logger } = require('../../logger');
 
 module.exports = {
   extractPackageFile,
diff --git a/lib/manager/bazel/update.js b/lib/manager/bazel/update.js
index cb30ad022a..65c7bc31f3 100644
--- a/lib/manager/bazel/update.js
+++ b/lib/manager/bazel/update.js
@@ -1,5 +1,6 @@
 const hasha = require('hasha');
 const got = require('../../util/got');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateDependency,
diff --git a/lib/manager/buildkite/extract.js b/lib/manager/buildkite/extract.js
index 7fd482c027..c31963bdd1 100644
--- a/lib/manager/buildkite/extract.js
+++ b/lib/manager/buildkite/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { isVersion } = require('../../versioning/semver');
 
 module.exports = {
diff --git a/lib/manager/buildkite/update.js b/lib/manager/buildkite/update.js
index 8982473ca7..e5f80fc98d 100644
--- a/lib/manager/buildkite/update.js
+++ b/lib/manager/buildkite/update.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   updateDependency,
 };
diff --git a/lib/manager/bundler/artifacts.js b/lib/manager/bundler/artifacts.js
index 1dda3ad850..8a8574ffe0 100644
--- a/lib/manager/bundler/artifacts.js
+++ b/lib/manager/bundler/artifacts.js
@@ -2,6 +2,7 @@ const { exec } = require('child-process-promise');
 const fs = require('fs-extra');
 const upath = require('upath');
 const { getChildProcessEnv } = require('../../util/env');
+const { logger } = require('../../logger');
 
 const { getPkgReleases } = require('../../datasource/docker');
 const {
diff --git a/lib/manager/bundler/extract.js b/lib/manager/bundler/extract.js
index 2605811c6d..9346a3c13e 100644
--- a/lib/manager/bundler/extract.js
+++ b/lib/manager/bundler/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { isValid } = require('../../versioning/ruby');
 
 module.exports = {
diff --git a/lib/manager/bundler/update.js b/lib/manager/bundler/update.js
index 83a5f292fb..2cc14d7864 100644
--- a/lib/manager/bundler/update.js
+++ b/lib/manager/bundler/update.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   updateDependency,
 };
diff --git a/lib/manager/cargo/artifacts.js b/lib/manager/cargo/artifacts.js
index a05817fd96..66bc5ce483 100644
--- a/lib/manager/cargo/artifacts.js
+++ b/lib/manager/cargo/artifacts.js
@@ -3,6 +3,7 @@ const process = require('process');
 const fs = require('fs-extra');
 const { exec } = require('child-process-promise');
 const { getChildProcessEnv } = require('../../util/env');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateArtifacts,
diff --git a/lib/manager/cargo/extract.js b/lib/manager/cargo/extract.js
index dbff79664b..e5af6d468a 100644
--- a/lib/manager/cargo/extract.js
+++ b/lib/manager/cargo/extract.js
@@ -1,4 +1,5 @@
 const toml = require('toml');
+const { logger } = require('../../logger');
 const semver = require('../../versioning/cargo');
 
 module.exports = {
diff --git a/lib/manager/cargo/update.js b/lib/manager/cargo/update.js
index 49dd099788..0aeaaf3bb7 100644
--- a/lib/manager/cargo/update.js
+++ b/lib/manager/cargo/update.js
@@ -1,5 +1,6 @@
 const _ = require('lodash');
 const toml = require('toml');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateDependency,
diff --git a/lib/manager/circleci/extract.js b/lib/manager/circleci/extract.js
index c731c3d843..461a0fffcc 100644
--- a/lib/manager/circleci/extract.js
+++ b/lib/manager/circleci/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getDep } = require('../dockerfile/extract');
 
 module.exports = {
diff --git a/lib/manager/circleci/update.js b/lib/manager/circleci/update.js
index 11a38d888c..47c523f629 100644
--- a/lib/manager/circleci/update.js
+++ b/lib/manager/circleci/update.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getNewFrom } = require('../dockerfile/update');
 
 module.exports = {
diff --git a/lib/manager/composer/artifacts.js b/lib/manager/composer/artifacts.js
index 7d92fb4d62..9af1093280 100644
--- a/lib/manager/composer/artifacts.js
+++ b/lib/manager/composer/artifacts.js
@@ -3,6 +3,7 @@ const URL = require('url');
 const { exec } = require('child-process-promise');
 const fs = require('fs-extra');
 const upath = require('upath');
+const { logger } = require('../../logger');
 const hostRules = require('../../util/host-rules');
 const { getChildProcessEnv } = require('../../util/env');
 
diff --git a/lib/manager/composer/extract.js b/lib/manager/composer/extract.js
index 50f39c545d..a650d18f03 100644
--- a/lib/manager/composer/extract.js
+++ b/lib/manager/composer/extract.js
@@ -1,4 +1,5 @@
 const is = require('@sindresorhus/is');
+const { logger } = require('../../logger');
 const semverComposer = require('../../versioning/composer');
 
 module.exports = {
diff --git a/lib/manager/composer/range.js b/lib/manager/composer/range.js
index a8e2d2e22a..0d935ecf98 100644
--- a/lib/manager/composer/range.js
+++ b/lib/manager/composer/range.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   getRangeStrategy,
 };
diff --git a/lib/manager/docker-compose/extract.js b/lib/manager/docker-compose/extract.js
index f0422c5698..aceaef115c 100644
--- a/lib/manager/docker-compose/extract.js
+++ b/lib/manager/docker-compose/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getDep } = require('../dockerfile/extract');
 
 module.exports = {
diff --git a/lib/manager/docker-compose/update.js b/lib/manager/docker-compose/update.js
index 8e8779633e..0d1f76ac87 100644
--- a/lib/manager/docker-compose/update.js
+++ b/lib/manager/docker-compose/update.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getNewFrom } = require('../dockerfile/update');
 
 module.exports = {
diff --git a/lib/manager/dockerfile/extract.js b/lib/manager/dockerfile/extract.js
index 4a7dba49f8..afd04dc132 100644
--- a/lib/manager/dockerfile/extract.js
+++ b/lib/manager/dockerfile/extract.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   splitImageParts,
   getDep,
diff --git a/lib/manager/dockerfile/update.js b/lib/manager/dockerfile/update.js
index 23b8b19b13..2b9a55036a 100644
--- a/lib/manager/dockerfile/update.js
+++ b/lib/manager/dockerfile/update.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   getNewFrom,
   updateDependency,
diff --git a/lib/manager/github-actions/extract.js b/lib/manager/github-actions/extract.js
index f4f1f6bc4d..6e04847e07 100644
--- a/lib/manager/github-actions/extract.js
+++ b/lib/manager/github-actions/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getDep } = require('../dockerfile/extract');
 
 module.exports = {
diff --git a/lib/manager/github-actions/update.js b/lib/manager/github-actions/update.js
index 00dcb6b9ca..eab5134103 100644
--- a/lib/manager/github-actions/update.js
+++ b/lib/manager/github-actions/update.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getNewFrom } = require('../dockerfile/update');
 
 module.exports = {
diff --git a/lib/manager/gitlabci-include/update.js b/lib/manager/gitlabci-include/update.js
index e8c4413eec..cce3b683ab 100644
--- a/lib/manager/gitlabci-include/update.js
+++ b/lib/manager/gitlabci-include/update.js
@@ -1,4 +1,5 @@
 const YAWN = require('yawn-yaml/cjs');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateDependency,
diff --git a/lib/manager/gitlabci/extract.js b/lib/manager/gitlabci/extract.js
index 97c06a1b78..66dbe23221 100644
--- a/lib/manager/gitlabci/extract.js
+++ b/lib/manager/gitlabci/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getDep } = require('../dockerfile/extract');
 
 module.exports = {
diff --git a/lib/manager/gitlabci/update.js b/lib/manager/gitlabci/update.js
index 828dc08a67..734ac96838 100644
--- a/lib/manager/gitlabci/update.js
+++ b/lib/manager/gitlabci/update.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getNewFrom } = require('../dockerfile/update');
 
 module.exports = {
diff --git a/lib/manager/gomod/artifacts.js b/lib/manager/gomod/artifacts.js
index 620dc7bc3a..cdae934c3e 100644
--- a/lib/manager/gomod/artifacts.js
+++ b/lib/manager/gomod/artifacts.js
@@ -3,6 +3,7 @@ const fs = require('fs-extra');
 const upath = require('upath');
 const hostRules = require('../../util/host-rules');
 const { getChildProcessEnv } = require('../../util/env');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateArtifacts,
diff --git a/lib/manager/gomod/extract.js b/lib/manager/gomod/extract.js
index f0b5a775b6..c8cd5b1e35 100644
--- a/lib/manager/gomod/extract.js
+++ b/lib/manager/gomod/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { isVersion } = require('../../versioning/semver');
 
 module.exports = {
diff --git a/lib/manager/gomod/update.js b/lib/manager/gomod/update.js
index 24b73fe50b..e6b0ca5230 100644
--- a/lib/manager/gomod/update.js
+++ b/lib/manager/gomod/update.js
@@ -1,4 +1,5 @@
 const { DateTime } = require('luxon');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateDependency,
diff --git a/lib/manager/gradle-wrapper/extract.js b/lib/manager/gradle-wrapper/extract.js
index 3136142a8a..fb068307a0 100644
--- a/lib/manager/gradle-wrapper/extract.js
+++ b/lib/manager/gradle-wrapper/extract.js
@@ -1,4 +1,5 @@
 const { coerce } = require('semver');
+const { logger } = require('../../logger');
 
 module.exports = {
   extractPackageFile,
diff --git a/lib/manager/gradle-wrapper/update.js b/lib/manager/gradle-wrapper/update.js
index 171e604cb3..73427a22ba 100644
--- a/lib/manager/gradle-wrapper/update.js
+++ b/lib/manager/gradle-wrapper/update.js
@@ -1,4 +1,5 @@
 const got = require('../../util/got');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateDependency,
diff --git a/lib/manager/gradle/gradle-updates-report.js b/lib/manager/gradle/gradle-updates-report.js
index 447eab196b..674db29ab8 100644
--- a/lib/manager/gradle/gradle-updates-report.js
+++ b/lib/manager/gradle/gradle-updates-report.js
@@ -1,5 +1,6 @@
 const path = require('path');
 const fs = require('fs-extra');
+const { logger } = require('../../logger');
 
 const GRADLE_DEPENDENCY_REPORT_FILENAME = 'gradle-renovate-report.json';
 
diff --git a/lib/manager/gradle/index.js b/lib/manager/gradle/index.js
index f1edaa0532..bfc1f8c43e 100644
--- a/lib/manager/gradle/index.js
+++ b/lib/manager/gradle/index.js
@@ -1,5 +1,6 @@
 const { exec } = require('child-process-promise');
 const fs = require('fs-extra');
+const { logger } = require('../../logger');
 
 const gradle = require('./build-gradle');
 const updatesReport = require('./gradle-updates-report');
diff --git a/lib/manager/homebrew/extract.js b/lib/manager/homebrew/extract.js
index acd417bcd1..8f14dc12d0 100644
--- a/lib/manager/homebrew/extract.js
+++ b/lib/manager/homebrew/extract.js
@@ -1,6 +1,8 @@
 const semver = require('../../versioning/semver');
 const { skip, isSpace, removeComments } = require('./util');
 
+const { logger } = require('../../logger');
+
 module.exports = {
   extractPackageFile,
   parseUrlPath,
diff --git a/lib/manager/homebrew/update.js b/lib/manager/homebrew/update.js
index 1ce7ed43bc..89b8679674 100644
--- a/lib/manager/homebrew/update.js
+++ b/lib/manager/homebrew/update.js
@@ -3,6 +3,7 @@ const { coerce } = require('semver');
 const { parseUrlPath } = require('./extract');
 const { skip, isSpace, removeComments } = require('./util');
 const got = require('../../util/got');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateDependency,
diff --git a/lib/manager/kubernetes/extract.js b/lib/manager/kubernetes/extract.js
index 0bcf24aeba..36391926d9 100644
--- a/lib/manager/kubernetes/extract.js
+++ b/lib/manager/kubernetes/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getDep } = require('../dockerfile/extract');
 
 module.exports = {
diff --git a/lib/manager/kubernetes/update.js b/lib/manager/kubernetes/update.js
index dc763631a7..e932d380c4 100644
--- a/lib/manager/kubernetes/update.js
+++ b/lib/manager/kubernetes/update.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { getNewFrom } = require('../dockerfile/update');
 
 module.exports = {
diff --git a/lib/manager/maven/extract.js b/lib/manager/maven/extract.js
index ce99fff75b..9d10255eab 100644
--- a/lib/manager/maven/extract.js
+++ b/lib/manager/maven/extract.js
@@ -1,6 +1,7 @@
 const path = require('path');
 const { XmlDocument } = require('xmldoc');
 const { isValid } = require('../../versioning/maven');
+const { logger } = require('../../logger');
 
 const DEFAULT_MAVEN_REPO = 'https://repo.maven.apache.org/maven2';
 
diff --git a/lib/manager/meteor/extract.js b/lib/manager/meteor/extract.js
index 0769c8ed00..e85030876b 100644
--- a/lib/manager/meteor/extract.js
+++ b/lib/manager/meteor/extract.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   extractPackageFile,
 };
diff --git a/lib/manager/meteor/update.js b/lib/manager/meteor/update.js
index 16074f08f3..c23d67eb31 100644
--- a/lib/manager/meteor/update.js
+++ b/lib/manager/meteor/update.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   updateDependency,
 };
diff --git a/lib/manager/npm/extract/index.js b/lib/manager/npm/extract/index.js
index f5c3abe711..abbcb449a1 100644
--- a/lib/manager/npm/extract/index.js
+++ b/lib/manager/npm/extract/index.js
@@ -2,6 +2,7 @@ const fs = require('fs-extra');
 const path = require('path');
 const upath = require('upath');
 const validateNpmPackageName = require('validate-npm-package-name');
+const { logger } = require('../../../logger');
 
 const { getLockedVersions } = require('./locked-versions');
 const { detectMonorepos } = require('./monorepo');
diff --git a/lib/manager/npm/extract/locked-versions.js b/lib/manager/npm/extract/locked-versions.js
index 934f14fdc6..ad2a8a4c6f 100644
--- a/lib/manager/npm/extract/locked-versions.js
+++ b/lib/manager/npm/extract/locked-versions.js
@@ -1,4 +1,5 @@
 const { valid } = require('semver');
+const { logger } = require('../../../logger');
 const { getNpmLock } = require('./npm');
 const { getYarnLock } = require('./yarn');
 
diff --git a/lib/manager/npm/extract/monorepo.js b/lib/manager/npm/extract/monorepo.js
index a978511973..1f9cdbf112 100644
--- a/lib/manager/npm/extract/monorepo.js
+++ b/lib/manager/npm/extract/monorepo.js
@@ -2,6 +2,7 @@ const is = require('@sindresorhus/is');
 const minimatch = require('minimatch');
 const path = require('path');
 const upath = require('upath');
+const { logger } = require('../../../logger');
 
 module.exports = {
   detectMonorepos,
diff --git a/lib/manager/npm/extract/npm.js b/lib/manager/npm/extract/npm.js
index 045a8f5c3b..447683d2a8 100644
--- a/lib/manager/npm/extract/npm.js
+++ b/lib/manager/npm/extract/npm.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../../logger');
+
 module.exports = {
   getNpmLock,
 };
diff --git a/lib/manager/npm/extract/yarn.js b/lib/manager/npm/extract/yarn.js
index e5ae91eb51..b3dceef1f4 100644
--- a/lib/manager/npm/extract/yarn.js
+++ b/lib/manager/npm/extract/yarn.js
@@ -1,4 +1,5 @@
 const yarnLockParser = require('@yarnpkg/lockfile');
+const { logger } = require('../../../logger');
 
 module.exports = {
   getYarnLock,
diff --git a/lib/manager/npm/post-update/index.js b/lib/manager/npm/post-update/index.js
index 32ef316b82..97a62370af 100644
--- a/lib/manager/npm/post-update/index.js
+++ b/lib/manager/npm/post-update/index.js
@@ -2,7 +2,7 @@ const fs = require('fs-extra');
 const path = require('path');
 const upath = require('upath');
 const is = require('@sindresorhus/is');
-
+const { logger } = require('../../../logger');
 const npm = require('./npm');
 const lerna = require('./lerna');
 const yarn = require('./yarn');
diff --git a/lib/manager/npm/post-update/lerna.js b/lib/manager/npm/post-update/lerna.js
index 319f670c84..6794a2a703 100644
--- a/lib/manager/npm/post-update/lerna.js
+++ b/lib/manager/npm/post-update/lerna.js
@@ -1,4 +1,5 @@
 const { exec } = require('child-process-promise');
+const { logger } = require('../../../logger');
 
 module.exports = {
   generateLockFiles,
diff --git a/lib/manager/npm/post-update/npm.js b/lib/manager/npm/post-update/npm.js
index 500dbf34af..c92a99e2e2 100644
--- a/lib/manager/npm/post-update/npm.js
+++ b/lib/manager/npm/post-update/npm.js
@@ -2,6 +2,7 @@ const fs = require('fs-extra');
 const upath = require('upath');
 const { getInstalledPath } = require('get-installed-path');
 const { exec } = require('child-process-promise');
+const { logger } = require('../../../logger');
 
 module.exports = {
   generateLockFile,
diff --git a/lib/manager/npm/post-update/pnpm.js b/lib/manager/npm/post-update/pnpm.js
index 883c36c427..e5815ceba1 100644
--- a/lib/manager/npm/post-update/pnpm.js
+++ b/lib/manager/npm/post-update/pnpm.js
@@ -2,6 +2,7 @@ const fs = require('fs-extra');
 const upath = require('upath');
 const { getInstalledPath } = require('get-installed-path');
 const { exec } = require('child-process-promise');
+const { logger } = require('../../../logger');
 
 module.exports = {
   generateLockFile,
diff --git a/lib/manager/npm/post-update/yarn.js b/lib/manager/npm/post-update/yarn.js
index 6979ea9601..2c58a1711c 100644
--- a/lib/manager/npm/post-update/yarn.js
+++ b/lib/manager/npm/post-update/yarn.js
@@ -2,6 +2,7 @@ const fs = require('fs-extra');
 const upath = require('upath');
 const { getInstalledPath } = require('get-installed-path');
 const { exec } = require('child-process-promise');
+const { logger } = require('../../../logger');
 
 module.exports = {
   generateLockFile,
diff --git a/lib/manager/npm/range.js b/lib/manager/npm/range.js
index b71e73f1c1..89083aa749 100644
--- a/lib/manager/npm/range.js
+++ b/lib/manager/npm/range.js
@@ -1,4 +1,5 @@
 const { parseRange } = require('semver-utils');
+const { logger } = require('../../logger');
 
 module.exports = {
   getRangeStrategy,
diff --git a/lib/manager/npm/update.js b/lib/manager/npm/update.js
index bf81a6914b..8db1ea4f4f 100644
--- a/lib/manager/npm/update.js
+++ b/lib/manager/npm/update.js
@@ -1,5 +1,6 @@
 const _ = require('lodash');
 const semver = require('semver');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateDependency,
diff --git a/lib/manager/nuget/extract.js b/lib/manager/nuget/extract.js
index 47304f072d..0f7010bc38 100644
--- a/lib/manager/nuget/extract.js
+++ b/lib/manager/nuget/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const versioning = require('../../versioning');
 
 module.exports = {
diff --git a/lib/manager/nuget/update.js b/lib/manager/nuget/update.js
index 7def06d743..e0dc2edbc0 100644
--- a/lib/manager/nuget/update.js
+++ b/lib/manager/nuget/update.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   updateDependency,
 };
diff --git a/lib/manager/nvm/update.js b/lib/manager/nvm/update.js
index a9ecea5fe0..5de15329f5 100644
--- a/lib/manager/nvm/update.js
+++ b/lib/manager/nvm/update.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   updateDependency,
 };
diff --git a/lib/manager/pip_requirements/extract.js b/lib/manager/pip_requirements/extract.js
index 99c1274faf..77e480013a 100644
--- a/lib/manager/pip_requirements/extract.js
+++ b/lib/manager/pip_requirements/extract.js
@@ -3,6 +3,7 @@ const packagePattern = '[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]';
 const extrasPattern = '(?:\\s*\\[[^\\]]+\\])?';
 const rangePattern = require('@renovate/pep440/lib/specifier').RANGE_PATTERN;
 
+const { logger } = require('../../logger');
 const { isSkipComment } = require('../../util/ignore');
 
 const specifierPartPattern = `\\s*${rangePattern.replace(/\?<\w+>/g, '?:')}`;
diff --git a/lib/manager/pip_requirements/update.js b/lib/manager/pip_requirements/update.js
index 7abccae162..0c8783352f 100644
--- a/lib/manager/pip_requirements/update.js
+++ b/lib/manager/pip_requirements/update.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { dependencyPattern } = require('./extract');
 
 module.exports = {
diff --git a/lib/manager/pip_setup/extract.js b/lib/manager/pip_setup/extract.js
index 29c6d472f7..b085288e6c 100644
--- a/lib/manager/pip_setup/extract.js
+++ b/lib/manager/pip_setup/extract.js
@@ -1,5 +1,6 @@
 const { exec } = require('child-process-promise');
 const { join } = require('upath');
+const { logger } = require('../../logger');
 const { isSkipComment } = require('../../util/ignore');
 const { dependencyPattern } = require('../pip_requirements/extract');
 
diff --git a/lib/manager/pipenv/artifacts.js b/lib/manager/pipenv/artifacts.js
index b595cf5ee4..e4dd140f21 100644
--- a/lib/manager/pipenv/artifacts.js
+++ b/lib/manager/pipenv/artifacts.js
@@ -2,6 +2,7 @@ const { exec } = require('child-process-promise');
 const fs = require('fs-extra');
 const upath = require('upath');
 const { getChildProcessEnv } = require('../../util/env');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateArtifacts,
diff --git a/lib/manager/pipenv/extract.js b/lib/manager/pipenv/extract.js
index a4ce2a6121..4c81528f15 100644
--- a/lib/manager/pipenv/extract.js
+++ b/lib/manager/pipenv/extract.js
@@ -4,6 +4,7 @@ const is = require('@sindresorhus/is');
 // based on https://www.python.org/dev/peps/pep-0508/#names
 const packageRegex = /^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$/i;
 const rangePattern = require('@renovate/pep440/lib/specifier').RANGE_PATTERN;
+const { logger } = require('../../logger');
 
 const specifierPartPattern = `\\s*${rangePattern.replace(
   /\?<\w+>/g,
diff --git a/lib/manager/pipenv/update.js b/lib/manager/pipenv/update.js
index 995d71e333..8d5829ea01 100644
--- a/lib/manager/pipenv/update.js
+++ b/lib/manager/pipenv/update.js
@@ -1,5 +1,6 @@
 const _ = require('lodash');
 const toml = require('toml');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateDependency,
diff --git a/lib/manager/poetry/artifacts.js b/lib/manager/poetry/artifacts.js
index b2999a1633..47c9c5198d 100644
--- a/lib/manager/poetry/artifacts.js
+++ b/lib/manager/poetry/artifacts.js
@@ -4,6 +4,8 @@ const fs = require('fs-extra');
 const { exec } = require('child-process-promise');
 const { getChildProcessEnv } = require('../../util/env');
 
+const { logger } = require('../../logger');
+
 module.exports = {
   updateArtifacts,
 };
diff --git a/lib/manager/poetry/extract.js b/lib/manager/poetry/extract.js
index 85153ceb2e..3835e71875 100644
--- a/lib/manager/poetry/extract.js
+++ b/lib/manager/poetry/extract.js
@@ -1,5 +1,6 @@
 const toml = require('toml');
 const semver = require('../../versioning/poetry');
+const { logger } = require('../../logger');
 
 module.exports = {
   extractPackageFile,
diff --git a/lib/manager/poetry/update.js b/lib/manager/poetry/update.js
index 1536899a85..0c8b0e6d0f 100644
--- a/lib/manager/poetry/update.js
+++ b/lib/manager/poetry/update.js
@@ -1,6 +1,8 @@
 const _ = require('lodash');
 const toml = require('toml');
 
+const { logger } = require('../../logger');
+
 module.exports = {
   updateDependency,
 };
diff --git a/lib/manager/pub/extract.js b/lib/manager/pub/extract.js
index 8a5e1e335c..5dcac29ade 100644
--- a/lib/manager/pub/extract.js
+++ b/lib/manager/pub/extract.js
@@ -1,5 +1,6 @@
 const yaml = require('js-yaml');
 const npm = require('../../versioning/npm/index');
+const { logger } = require('../../logger');
 
 module.exports = {
   extractPackageFile,
diff --git a/lib/manager/ruby-version/extract.js b/lib/manager/ruby-version/extract.js
index 72f9c5a7ba..f999ecbc59 100644
--- a/lib/manager/ruby-version/extract.js
+++ b/lib/manager/ruby-version/extract.js
@@ -1,4 +1,5 @@
 const ruby = require('../../versioning/ruby');
+const { logger } = require('../../logger');
 
 module.exports = {
   extractPackageFile,
diff --git a/lib/manager/ruby-version/update.js b/lib/manager/ruby-version/update.js
index 0398939e25..d751a8ba34 100644
--- a/lib/manager/ruby-version/update.js
+++ b/lib/manager/ruby-version/update.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   updateDependency,
 };
diff --git a/lib/manager/terraform/extract.js b/lib/manager/terraform/extract.js
index f63c185dcf..b7969ed0a2 100644
--- a/lib/manager/terraform/extract.js
+++ b/lib/manager/terraform/extract.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { isValid, isVersion } = require('../../versioning/hashicorp');
 
 module.exports = {
diff --git a/lib/manager/terraform/update.js b/lib/manager/terraform/update.js
index a6a830251f..c96cd04c46 100644
--- a/lib/manager/terraform/update.js
+++ b/lib/manager/terraform/update.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   updateDependency,
 };
diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.js
index 541266b562..78c00e7cae 100644
--- a/lib/manager/travis/package.js
+++ b/lib/manager/travis/package.js
@@ -2,6 +2,7 @@ const is = require('@sindresorhus/is');
 const { isEqual } = require('lodash');
 const { getPkgReleases } = require('../../datasource');
 const { isVersion, maxSatisfyingVersion } = require('../../versioning/semver');
+const { logger } = require('../../logger');
 const nodeJsSchedule = require('../../../data/node-js-schedule.json');
 
 module.exports = {
diff --git a/lib/manager/travis/update.js b/lib/manager/travis/update.js
index ef86cd7804..f3c94aca9c 100644
--- a/lib/manager/travis/update.js
+++ b/lib/manager/travis/update.js
@@ -1,5 +1,6 @@
 const detectIndent = require('detect-indent');
 const is = require('@sindresorhus/is');
+const { logger } = require('../../logger');
 
 module.exports = {
   updateDependency,
diff --git a/lib/platform/azure/azure-helper.ts b/lib/platform/azure/azure-helper.ts
index 7f65c90b59..4e019b845b 100644
--- a/lib/platform/azure/azure-helper.ts
+++ b/lib/platform/azure/azure-helper.ts
@@ -1,4 +1,5 @@
 import * as azureApi from './azure-got-wrapper';
+import { logger } from '../../logger';
 
 /**
  *
diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts
index 135ba32546..2ec2d577b3 100644
--- a/lib/platform/azure/index.ts
+++ b/lib/platform/azure/index.ts
@@ -3,6 +3,7 @@ import * as azureApi from './azure-got-wrapper';
 import * as hostRules from '../../util/host-rules';
 import { appSlug } from '../../config/app-strings';
 import GitStorage from '../git/storage';
+import { logger } from '../../logger';
 
 interface RepoConfig {
   storage: GitStorage;
diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts
index 650e14b480..85bf5a975e 100644
--- a/lib/platform/bitbucket-server/index.ts
+++ b/lib/platform/bitbucket-server/index.ts
@@ -5,6 +5,7 @@ import { api } from './bb-got-wrapper';
 import * as utils from './utils';
 import * as hostRules from '../../util/host-rules';
 import GitStorage from '../git/storage';
+import { logger } from '../../logger';
 
 interface BbsConfig {
   baseBranch: string;
diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts
index f4bca52cac..4f3a8f8189 100644
--- a/lib/platform/bitbucket/index.ts
+++ b/lib/platform/bitbucket/index.ts
@@ -2,6 +2,7 @@ import parseDiff from 'parse-diff';
 import { api } from './bb-got-wrapper';
 import * as utils from './utils';
 import * as hostRules from '../../util/host-rules';
+import { logger } from '../../logger';
 import GitStorage from '../git/storage';
 import { readOnlyIssueBody } from '../utils/read-only-issue-body';
 import { appSlug } from '../../config/app-strings';
diff --git a/lib/platform/git/storage.ts b/lib/platform/git/storage.ts
index cd53c9d9ab..96bafa256d 100644
--- a/lib/platform/git/storage.ts
+++ b/lib/platform/git/storage.ts
@@ -3,6 +3,7 @@ import fs from 'fs-extra';
 import { join } from 'path';
 import Git from 'simple-git/promise';
 import URL from 'url';
+import { logger } from '../../logger';
 
 declare module 'fs-extra' {
   // eslint-disable-next-line import/prefer-default-export
diff --git a/lib/platform/github/gh-got-wrapper.ts b/lib/platform/github/gh-got-wrapper.ts
index 8b8662a925..c13adbe49b 100644
--- a/lib/platform/github/gh-got-wrapper.ts
+++ b/lib/platform/github/gh-got-wrapper.ts
@@ -5,6 +5,7 @@ import pAll from 'p-all';
 import got from '../../util/got';
 import { maskToken } from '../../util/mask';
 import { GotApi } from '../common';
+import { logger } from '../../logger';
 
 const hostType = 'github';
 let baseUrl = 'https://api.github.com/';
diff --git a/lib/platform/github/index.ts b/lib/platform/github/index.ts
index c90bdde9f9..fe56b4e271 100644
--- a/lib/platform/github/index.ts
+++ b/lib/platform/github/index.ts
@@ -3,6 +3,7 @@ import delay from 'delay';
 import semver from 'semver';
 import URL from 'url';
 
+import { logger } from '../../logger';
 import { api } from './gh-got-wrapper';
 import * as hostRules from '../../util/host-rules';
 import GitStorage from '../git/storage';
diff --git a/lib/platform/gitlab/gl-got-wrapper.ts b/lib/platform/gitlab/gl-got-wrapper.ts
index d256961f12..7303026650 100644
--- a/lib/platform/gitlab/gl-got-wrapper.ts
+++ b/lib/platform/gitlab/gl-got-wrapper.ts
@@ -2,6 +2,7 @@ import parseLinkHeader from 'parse-link-header';
 
 import { GotApi } from '../common';
 import got from '../../util/got';
+import { logger } from '../../logger';
 
 const hostType = 'gitlab';
 let baseUrl = 'https://gitlab.com/api/v4/';
diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts
index 4dd429a43e..12dd166cc4 100644
--- a/lib/platform/gitlab/index.ts
+++ b/lib/platform/gitlab/index.ts
@@ -6,6 +6,7 @@ import * as hostRules from '../../util/host-rules';
 import GitStorage from '../git/storage';
 import { PlatformConfig } from '../common';
 import { configFileNames } from '../../config/app-strings';
+import { logger } from '../../logger';
 
 const defaultConfigFile = configFileNames[0];
 let config: {
diff --git a/lib/platform/index.ts b/lib/platform/index.ts
index 2edaeaa9e1..485b6554be 100644
--- a/lib/platform/index.ts
+++ b/lib/platform/index.ts
@@ -1,6 +1,7 @@
 import URL from 'url';
 import addrs from 'email-addresses';
 import * as hostRules from '../util/host-rules';
+import { logger } from '../logger';
 
 // TODO: move to definitions: platform.allowedValues
 /* eslint-disable global-require */
diff --git a/lib/types.d.ts b/lib/types.d.ts
index f36ce43cf5..3ce19ad72d 100644
--- a/lib/types.d.ts
+++ b/lib/types.d.ts
@@ -1,20 +1,4 @@
-declare namespace Renovate {
-  // TODO: refactor logger
-  interface Logger {
-    trace(...args: any[]): void;
-    debug(...args: any[]): void;
-    info(...args: any[]): void;
-    warn(...args: any[]): void;
-    error(...args: any[]): void;
-    fatal(...args: any[]): void;
-    child(...args: any[]): void;
-
-    setMeta(obj: any): void;
-  }
-}
-
-// eslint-disable-next-line no-var, vars-on-top
-declare var logger: Renovate.Logger;
+declare namespace Renovate {}
 
 declare interface Error {
   validationError?: string;
@@ -25,8 +9,7 @@ declare namespace NodeJS {
   interface Global {
     appMode?: boolean;
     gitAuthor?: { name: string; email: string };
-    logger: Renovate.Logger;
-
+    renovateError?: boolean;
     renovateVersion: string;
     // TODO: declare interface for all platforms
     platform: typeof import('./platform/github');
diff --git a/lib/util/got/auth.js b/lib/util/got/auth.js
index ad2b833a3e..77311e45cc 100644
--- a/lib/util/got/auth.js
+++ b/lib/util/got/auth.js
@@ -1,4 +1,5 @@
 const got = require('got');
+const { logger } = require('../../logger');
 
 // istanbul ignore next
 module.exports = got.create({
diff --git a/lib/util/got/host-rules.js b/lib/util/got/host-rules.js
index e52382c97d..bed682ab0a 100644
--- a/lib/util/got/host-rules.js
+++ b/lib/util/got/host-rules.js
@@ -1,5 +1,6 @@
 /* eslint-disable no-param-reassign */
 const got = require('got');
+const { logger } = require('../../logger');
 const hostRules = require('../host-rules');
 
 // Apply host rules to requests
diff --git a/lib/util/got/stats.js b/lib/util/got/stats.js
index c64b73b7cd..cf723302d7 100644
--- a/lib/util/got/stats.js
+++ b/lib/util/got/stats.js
@@ -1,4 +1,5 @@
 const got = require('got');
+const { logger } = require('../../logger');
 
 let stats = {};
 
diff --git a/lib/util/host-rules.ts b/lib/util/host-rules.ts
index e9352c2dc0..5299e163a3 100644
--- a/lib/util/host-rules.ts
+++ b/lib/util/host-rules.ts
@@ -1,5 +1,6 @@
 import URL from 'url';
 import merge from 'deepmerge';
+import { logger } from '../logger';
 
 export interface HostRule {
   hostType?: string;
diff --git a/lib/util/ignore.js b/lib/util/ignore.js
index dfb2b60a8a..5c7fb557bf 100644
--- a/lib/util/ignore.js
+++ b/lib/util/ignore.js
@@ -1,3 +1,5 @@
+const { logger } = require('../logger');
+
 module.exports = {
   isSkipComment,
 };
diff --git a/lib/util/package-rules.js b/lib/util/package-rules.js
index 56109ccf03..ea8341cef9 100644
--- a/lib/util/package-rules.js
+++ b/lib/util/package-rules.js
@@ -1,5 +1,6 @@
 const minimatch = require('minimatch');
 
+const { logger } = require('../logger');
 const versioning = require('../versioning');
 const { mergeChildConfig } = require('../config');
 
diff --git a/lib/versioning/composer/index.js b/lib/versioning/composer/index.js
index 29d35e6161..2e3c009917 100644
--- a/lib/versioning/composer/index.js
+++ b/lib/versioning/composer/index.js
@@ -1,4 +1,5 @@
 const { coerce } = require('semver');
+const { logger } = require('../../logger');
 const npm = require('../npm');
 
 function padZeroes(input) {
diff --git a/lib/versioning/index.js b/lib/versioning/index.js
index 2d5ca56a29..55ff6ff4a8 100644
--- a/lib/versioning/index.js
+++ b/lib/versioning/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../logger');
 const supportedSchemes = require('../config/definitions')
   .getOptions()
   .find(option => option.name === 'versionScheme').allowedValues;
diff --git a/lib/versioning/npm/range.js b/lib/versioning/npm/range.js
index c2a03dc802..adfd7591c3 100644
--- a/lib/versioning/npm/range.js
+++ b/lib/versioning/npm/range.js
@@ -8,6 +8,7 @@ const {
   valid: isVersion,
 } = require('semver');
 const { parseRange } = require('semver-utils');
+const { logger } = require('../../logger');
 
 module.exports = {
   getNewValue,
diff --git a/lib/versioning/pep440/range.js b/lib/versioning/pep440/range.js
index 063b705b69..6d78fe3920 100644
--- a/lib/versioning/pep440/range.js
+++ b/lib/versioning/pep440/range.js
@@ -2,6 +2,7 @@ const { gte, lte, satisfies } = require('@renovate/pep440');
 
 const { parse: parseVersion } = require('@renovate/pep440/lib/version');
 const { parse: parseRange } = require('@renovate/pep440/lib/specifier');
+const { logger } = require('../../logger');
 
 module.exports = {
   getNewValue,
diff --git a/lib/versioning/ruby/index.js b/lib/versioning/ruby/index.js
index d65d338d3c..36036c9d4d 100644
--- a/lib/versioning/ruby/index.js
+++ b/lib/versioning/ruby/index.js
@@ -6,6 +6,7 @@ const {
   maxSatisfying,
   minSatisfying,
 } = require('@snyk/ruby-semver');
+const { logger } = require('../../logger');
 const { parse: parseVersion } = require('./version');
 const { parse: parseRange, ltr } = require('./range');
 const { isSingleOperator, isValidOperator } = require('./operator');
diff --git a/lib/versioning/ruby/range.js b/lib/versioning/ruby/range.js
index 7aa8b6a6cf..bfcc1fcb2f 100644
--- a/lib/versioning/ruby/range.js
+++ b/lib/versioning/ruby/range.js
@@ -1,5 +1,6 @@
 const GemVersion = require('@snyk/ruby-semver/lib/ruby/gem-version');
 const GemRequirement = require('@snyk/ruby-semver/lib/ruby/gem-requirement');
+const { logger } = require('../../logger');
 const { EQUAL, NOT_EQUAL, GT, LT, GTE, LTE, PGTE } = require('./operator');
 
 const parse = range => {
diff --git a/lib/versioning/ruby/strategies/bump.js b/lib/versioning/ruby/strategies/bump.js
index 28fe77f4c9..39b2549cd0 100644
--- a/lib/versioning/ruby/strategies/bump.js
+++ b/lib/versioning/ruby/strategies/bump.js
@@ -1,4 +1,5 @@
 const { gte, lte } = require('@snyk/ruby-semver');
+const { logger } = require('../../../logger');
 const { EQUAL, NOT_EQUAL, GT, LT, GTE, LTE, PGTE } = require('../operator');
 const { floor, increment, decrement } = require('../version');
 const { parse: parseRange } = require('../range');
diff --git a/lib/workers/branch/automerge.js b/lib/workers/branch/automerge.js
index 2e878306d4..ce0363e742 100644
--- a/lib/workers/branch/automerge.js
+++ b/lib/workers/branch/automerge.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   tryBranchAutomerge,
 };
diff --git a/lib/workers/branch/check-existing.js b/lib/workers/branch/check-existing.js
index 144525d611..5195af21a8 100644
--- a/lib/workers/branch/check-existing.js
+++ b/lib/workers/branch/check-existing.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../logger');
+
 module.exports = {
   prAlreadyExisted,
 };
diff --git a/lib/workers/branch/commit.js b/lib/workers/branch/commit.js
index b8fe8fcb97..85aaffdf79 100644
--- a/lib/workers/branch/commit.js
+++ b/lib/workers/branch/commit.js
@@ -1,5 +1,6 @@
 const is = require('@sindresorhus/is');
 const minimatch = require('minimatch');
+const { logger } = require('../../logger');
 
 module.exports = {
   commitFilesToBranch,
diff --git a/lib/workers/branch/get-updated.js b/lib/workers/branch/get-updated.js
index fe95591229..7265e2aa69 100644
--- a/lib/workers/branch/get-updated.js
+++ b/lib/workers/branch/get-updated.js
@@ -1,4 +1,5 @@
 const is = require('@sindresorhus/is');
+const { logger } = require('../../logger');
 const { get } = require('../../manager');
 
 module.exports = {
diff --git a/lib/workers/branch/index.js b/lib/workers/branch/index.js
index 1c308e430c..af4e26b4ed 100644
--- a/lib/workers/branch/index.js
+++ b/lib/workers/branch/index.js
@@ -1,5 +1,6 @@
 const { DateTime } = require('luxon');
 
+const { logger, setMeta } = require('../../logger');
 const schedule = require('./schedule');
 const { getUpdatedPackageFiles } = require('./get-updated');
 const { getAdditionalFiles } = require('../../manager/npm/post-update');
@@ -23,7 +24,7 @@ async function processBranch(branchConfig, prHourlyLimitReached, packageFiles) {
     .map(upgrade => upgrade.depName)
     .filter(v => v) // remove nulls (happens for lock file maintenance)
     .filter((value, i, list) => list.indexOf(value) === i); // remove duplicates
-  logger.setMeta({
+  setMeta({
     repository: config.repository,
     branch: config.branchName,
     dependencies,
diff --git a/lib/workers/branch/parent.js b/lib/workers/branch/parent.js
index 5f3c0e544f..19e6950477 100644
--- a/lib/workers/branch/parent.js
+++ b/lib/workers/branch/parent.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { appSlug } = require('../../config/app-strings');
 
 module.exports = {
diff --git a/lib/workers/branch/schedule.js b/lib/workers/branch/schedule.js
index a210423a02..5a1d37d67f 100644
--- a/lib/workers/branch/schedule.js
+++ b/lib/workers/branch/schedule.js
@@ -1,6 +1,7 @@
 const is = require('@sindresorhus/is');
 const later = require('later');
 const moment = require('moment-timezone');
+const { logger } = require('../../logger');
 
 module.exports = {
   hasValidTimezone,
diff --git a/lib/workers/branch/status-checks.js b/lib/workers/branch/status-checks.js
index b1280969fe..5afd282904 100644
--- a/lib/workers/branch/status-checks.js
+++ b/lib/workers/branch/status-checks.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { appSlug, urls } = require('../../config/app-strings');
 
 module.exports = {
diff --git a/lib/workers/global/autodiscover.js b/lib/workers/global/autodiscover.js
index a07796dac0..1eeb4d2537 100644
--- a/lib/workers/global/autodiscover.js
+++ b/lib/workers/global/autodiscover.js
@@ -1,5 +1,6 @@
 const is = require('@sindresorhus/is');
 const minimatch = require('minimatch');
+const { logger } = require('../../logger');
 
 module.exports = {
   autodiscoverRepositories,
diff --git a/lib/workers/global/cache.js b/lib/workers/global/cache.js
index 3843682d69..62379c1400 100644
--- a/lib/workers/global/cache.js
+++ b/lib/workers/global/cache.js
@@ -1,6 +1,7 @@
 const cacache = require('cacache/en');
 const path = require('path');
 const { DateTime } = require('luxon');
+const { logger } = require('../../logger');
 
 module.exports = {
   init,
diff --git a/lib/workers/global/index.js b/lib/workers/global/index.js
index b691550d93..8c16d80249 100644
--- a/lib/workers/global/index.js
+++ b/lib/workers/global/index.js
@@ -2,7 +2,7 @@ const fs = require('fs-extra');
 const os = require('os');
 const is = require('@sindresorhus/is');
 const path = require('path');
-const { initLogger } = require('../../logger');
+const { logger, setMeta } = require('../../logger');
 const configParser = require('../../config');
 const repositoryWorker = require('../repository');
 const cache = require('./cache');
@@ -18,7 +18,6 @@ module.exports = {
 };
 
 async function start() {
-  initLogger();
   try {
     cache.init(os.tmpdir());
     let config = await configParser.parseConfigs(process.env, process.argv);
@@ -68,7 +67,7 @@ async function start() {
       }
       await repositoryWorker.renovateRepository(repoConfig);
     }
-    logger.setMeta({});
+    setMeta({});
     printStats();
     logger.info(`${appName} finished`);
   } catch (err) /* istanbul ignore next */ {
diff --git a/lib/workers/pr/changelog/index.js b/lib/workers/pr/changelog/index.js
index 9c62ec936b..2d3d3976df 100644
--- a/lib/workers/pr/changelog/index.js
+++ b/lib/workers/pr/changelog/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../logger');
 const versioning = require('../../../versioning');
 
 const sourceGithub = require('./source-github');
diff --git a/lib/workers/pr/changelog/release-notes.js b/lib/workers/pr/changelog/release-notes.js
index 3e5b935853..2a85c223ba 100644
--- a/lib/workers/pr/changelog/release-notes.js
+++ b/lib/workers/pr/changelog/release-notes.js
@@ -3,6 +3,7 @@ import ghGot from '../../../platform/github/gh-got-wrapper';
 const changelogFilenameRegex = require('changelog-filename-regex');
 const { linkify } = require('linkify-markdown');
 const MarkdownIt = require('markdown-it');
+const { logger } = require('../../../logger');
 
 const markdown = new MarkdownIt('zero');
 markdown.enable(['heading', 'lheading']);
diff --git a/lib/workers/pr/changelog/source-github.js b/lib/workers/pr/changelog/source-github.js
index 0162daacc4..214e478490 100644
--- a/lib/workers/pr/changelog/source-github.js
+++ b/lib/workers/pr/changelog/source-github.js
@@ -1,6 +1,7 @@
 import ghGot from '../../../platform/github/gh-got-wrapper';
 
 const URL = require('url');
+const { logger } = require('../../../logger');
 const hostRules = require('../../../util/host-rules');
 const versioning = require('../../../versioning');
 const { addReleaseNotes } = require('./release-notes');
diff --git a/lib/workers/pr/index.js b/lib/workers/pr/index.js
index 199a99e1cd..bacb09a698 100644
--- a/lib/workers/pr/index.js
+++ b/lib/workers/pr/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const changelogHelper = require('./changelog');
 const { getPrBody } = require('./pr-body');
 
diff --git a/lib/workers/pr/pr-body.js b/lib/workers/pr/pr-body.js
index fdd3b7211c..c03bc44356 100644
--- a/lib/workers/pr/pr-body.js
+++ b/lib/workers/pr/pr-body.js
@@ -1,5 +1,6 @@
 const is = require('@sindresorhus/is');
 const handlebars = require('handlebars');
+const { logger } = require('../../logger');
 const releaseNotesHbs = require('./changelog/hbs-template');
 const { getPrConfigDescription } = require('./pr-body-config');
 
diff --git a/lib/workers/repository/error-config.js b/lib/workers/repository/error-config.js
index 62712a6a52..11ac39443d 100644
--- a/lib/workers/repository/error-config.js
+++ b/lib/workers/repository/error-config.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const {
   appName,
   onboardingBranch,
diff --git a/lib/workers/repository/error.js b/lib/workers/repository/error.js
index a4fabfb956..614fb62e9c 100644
--- a/lib/workers/repository/error.js
+++ b/lib/workers/repository/error.js
@@ -1,13 +1,11 @@
-const { raiseConfigWarningIssue } = require('./error-config');
+import { logger, setMeta } from '../../logger';
+import { raiseConfigWarningIssue } from './error-config';
 
-module.exports = {
-  handleError,
-};
-
-async function handleError(config, err) {
-  logger.setMeta({
+export default async function handleError(config, err) {
+  setMeta({
     repository: config.repository,
   });
+
   if (err.message === 'uninitiated') {
     logger.info('Repository is uninitiated - skipping');
     delete config.branchList; // eslint-disable-line no-param-reassign
diff --git a/lib/workers/repository/extract/file-match.js b/lib/workers/repository/extract/file-match.js
index 3aeaab804e..3939b61f33 100644
--- a/lib/workers/repository/extract/file-match.js
+++ b/lib/workers/repository/extract/file-match.js
@@ -1,4 +1,5 @@
 const minimatch = require('minimatch');
+const { logger } = require('../../../logger');
 
 module.exports = {
   getIncludedFiles,
diff --git a/lib/workers/repository/extract/index.js b/lib/workers/repository/extract/index.js
index 4b5e97aff3..a794b89933 100644
--- a/lib/workers/repository/extract/index.js
+++ b/lib/workers/repository/extract/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../logger');
 const { getManagerList } = require('../../../manager');
 const { getManagerConfig } = require('../../../config');
 const { getManagerPackageFiles } = require('./manager-files');
diff --git a/lib/workers/repository/extract/manager-files.js b/lib/workers/repository/extract/manager-files.js
index 6452ec9e24..433ac3aa5b 100644
--- a/lib/workers/repository/extract/manager-files.js
+++ b/lib/workers/repository/extract/manager-files.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../../logger');
+
 module.exports = {
   getManagerPackageFiles,
 };
diff --git a/lib/workers/repository/finalise/prune.js b/lib/workers/repository/finalise/prune.js
index 9afd19b1ef..bb858fb72e 100644
--- a/lib/workers/repository/finalise/prune.js
+++ b/lib/workers/repository/finalise/prune.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../../logger');
+
 module.exports = {
   pruneStaleBranches,
 };
diff --git a/lib/workers/repository/finalise/validate.js b/lib/workers/repository/finalise/validate.js
index 34e7d323fd..dd26a2e313 100644
--- a/lib/workers/repository/finalise/validate.js
+++ b/lib/workers/repository/finalise/validate.js
@@ -1,4 +1,5 @@
 const JSON5 = require('json5');
+const { logger, setMeta } = require('../../../logger');
 const { migrateAndValidate } = require('../../../config/migrate-validate');
 const { configFileNames } = require('../../../config/app-strings');
 const { appName, appSlug } = require('../../../config/app-strings');
@@ -23,7 +24,7 @@ async function validatePrs(config) {
   ) {
     return;
   }
-  logger.setMeta({ repository: config.repository });
+  setMeta({ repository: config.repository });
   logger.debug('branchPrefix: ' + config.branchPrefix);
   const renovatePrs = await getRenovatePrs(config.branchPrefix);
   logger.debug({ renovatePrs }, `Found ${renovatePrs.length} ${appName} PRs`);
diff --git a/lib/workers/repository/index.js b/lib/workers/repository/index.js
index a5914145bf..c206adc3f1 100644
--- a/lib/workers/repository/index.js
+++ b/lib/workers/repository/index.js
@@ -1,8 +1,10 @@
+import handleError from './error';
+
 const fs = require('fs-extra');
 
+const { logger, setMeta } = require('../../logger');
 const { initRepo } = require('./init');
 const { ensureOnboardingPr } = require('./onboarding/pr');
-const { handleError } = require('./error');
 const { processResult } = require('./result');
 const { processRepo } = require('./process');
 const { finaliseRepo } = require('./finalise');
@@ -15,7 +17,7 @@ module.exports = {
 // istanbul ignore next
 async function renovateRepository(repoConfig) {
   let config = { ...repoConfig };
-  logger.setMeta({ repository: config.repository });
+  setMeta({ repository: config.repository });
   logger.info('Renovating repository');
   logger.trace({ config });
   let repoResult;
diff --git a/lib/workers/repository/init/base.js b/lib/workers/repository/init/base.js
index 16a7c09a72..a2913a3f39 100644
--- a/lib/workers/repository/init/base.js
+++ b/lib/workers/repository/init/base.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../../logger');
+
 async function checkBaseBranch(config) {
   logger.debug('checkBaseBranch()');
   logger.debug(`config.repoIsOnboarded=${config.repoIsOnboarded}`);
diff --git a/lib/workers/repository/init/config.js b/lib/workers/repository/init/config.js
index a5a2488768..07ded19677 100644
--- a/lib/workers/repository/init/config.js
+++ b/lib/workers/repository/init/config.js
@@ -2,6 +2,7 @@ const jsonValidator = require('json-dup-key-validator');
 const JSON5 = require('json5');
 const path = require('path');
 
+const { logger } = require('../../../logger');
 const { mergeChildConfig } = require('../../../config');
 const { migrateAndValidate } = require('../../../config/migrate-validate');
 const { decryptConfig } = require('../../../config/decrypt');
diff --git a/lib/workers/repository/init/flatten.js b/lib/workers/repository/init/flatten.js
index 364a828249..e52af19fef 100644
--- a/lib/workers/repository/init/flatten.js
+++ b/lib/workers/repository/init/flatten.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../logger');
 const { mergeChildConfig } = require('../../../config');
 
 function flattenPackageRules(packageRules) {
diff --git a/lib/workers/repository/init/index.js b/lib/workers/repository/init/index.js
index 18a5a73b75..9870527218 100644
--- a/lib/workers/repository/init/index.js
+++ b/lib/workers/repository/init/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../logger');
 const { checkOnboardingBranch } = require('../onboarding/branch');
 const { checkIfConfigured } = require('../configured');
 const { initApis } = require('../init/apis');
diff --git a/lib/workers/repository/init/semantic.js b/lib/workers/repository/init/semantic.js
index 942f52836c..da3d8c839d 100644
--- a/lib/workers/repository/init/semantic.js
+++ b/lib/workers/repository/init/semantic.js
@@ -1,4 +1,5 @@
 const conventionalCommitsDetector = require('conventional-commits-detector');
+const { logger } = require('../../../logger');
 
 async function detectSemanticCommits(config) {
   logger.debug('detectSemanticCommits()');
diff --git a/lib/workers/repository/init/vulnerability.js b/lib/workers/repository/init/vulnerability.js
index f556c2d86d..0b81bffe1e 100644
--- a/lib/workers/repository/init/vulnerability.js
+++ b/lib/workers/repository/init/vulnerability.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../logger');
 const versioning = require('../../../versioning');
 
 module.exports = {
diff --git a/lib/workers/repository/master-issue.js b/lib/workers/repository/master-issue.js
index 93806459f8..d4af88d261 100644
--- a/lib/workers/repository/master-issue.js
+++ b/lib/workers/repository/master-issue.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../logger');
 const { appName } = require('../../config/app-strings');
 
 module.exports = {
diff --git a/lib/workers/repository/onboarding/branch/check.js b/lib/workers/repository/onboarding/branch/check.js
index ddfa215c4d..cd6e005828 100644
--- a/lib/workers/repository/onboarding/branch/check.js
+++ b/lib/workers/repository/onboarding/branch/check.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../../logger');
 const {
   appName,
   appSlug,
diff --git a/lib/workers/repository/onboarding/branch/config.js b/lib/workers/repository/onboarding/branch/config.js
index eef34e4e37..899d482fcc 100644
--- a/lib/workers/repository/onboarding/branch/config.js
+++ b/lib/workers/repository/onboarding/branch/config.js
@@ -1,4 +1,5 @@
 const is = require('@sindresorhus/is');
+const { logger } = require('../../../../logger');
 
 const { appSlug } = require('../../../../config/app-strings');
 
diff --git a/lib/workers/repository/onboarding/branch/create.js b/lib/workers/repository/onboarding/branch/create.js
index 61d17f36be..02d140526b 100644
--- a/lib/workers/repository/onboarding/branch/create.js
+++ b/lib/workers/repository/onboarding/branch/create.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../../logger');
 const { getOnboardingConfig } = require('./config');
 const {
   configFileNames,
diff --git a/lib/workers/repository/onboarding/branch/index.js b/lib/workers/repository/onboarding/branch/index.js
index 88a9b1db21..1b0707422b 100644
--- a/lib/workers/repository/onboarding/branch/index.js
+++ b/lib/workers/repository/onboarding/branch/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../../logger');
 const { extractAllDependencies } = require('../../extract');
 const { createOnboardingBranch } = require('./create');
 const { rebaseOnboardingBranch } = require('./rebase');
diff --git a/lib/workers/repository/onboarding/branch/rebase.js b/lib/workers/repository/onboarding/branch/rebase.js
index 4e1ed81b52..2eb960cf10 100644
--- a/lib/workers/repository/onboarding/branch/rebase.js
+++ b/lib/workers/repository/onboarding/branch/rebase.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../../logger');
 const { getOnboardingConfig } = require('./config');
 const {
   configFileNames,
diff --git a/lib/workers/repository/onboarding/pr/config-description.js b/lib/workers/repository/onboarding/pr/config-description.js
index dec94f9926..2e8adecb87 100644
--- a/lib/workers/repository/onboarding/pr/config-description.js
+++ b/lib/workers/repository/onboarding/pr/config-description.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../../logger');
 const {
   appName,
   configFileNames,
diff --git a/lib/workers/repository/onboarding/pr/errors-warnings.js b/lib/workers/repository/onboarding/pr/errors-warnings.js
index b1a783fb5c..a351ac060a 100644
--- a/lib/workers/repository/onboarding/pr/errors-warnings.js
+++ b/lib/workers/repository/onboarding/pr/errors-warnings.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../../logger');
 const { appName } = require('../../../../config/app-strings');
 
 function getWarnings(config) {
diff --git a/lib/workers/repository/onboarding/pr/index.js b/lib/workers/repository/onboarding/pr/index.js
index d3f26dd8e1..d8aad93309 100644
--- a/lib/workers/repository/onboarding/pr/index.js
+++ b/lib/workers/repository/onboarding/pr/index.js
@@ -1,4 +1,5 @@
 const is = require('@sindresorhus/is');
+const { logger } = require('../../../../logger');
 const { getConfigDesc } = require('./config-description');
 const { getErrors, getWarnings, getDepWarnings } = require('./errors-warnings');
 const { getBaseBranchDesc } = require('./base-branch');
diff --git a/lib/workers/repository/onboarding/pr/pr-list.js b/lib/workers/repository/onboarding/pr/pr-list.js
index 08d503e8f3..86dc537c3c 100644
--- a/lib/workers/repository/onboarding/pr/pr-list.js
+++ b/lib/workers/repository/onboarding/pr/pr-list.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../../logger');
 const { appName } = require('../../../../config/app-strings');
 
 function getPrList(config, branches) {
diff --git a/lib/workers/repository/process/deprecated.js b/lib/workers/repository/process/deprecated.js
index 585c4f3c26..ee7a829ada 100644
--- a/lib/workers/repository/process/deprecated.js
+++ b/lib/workers/repository/process/deprecated.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../../logger');
+
 module.exports = {
   raiseDeprecationWarnings,
 };
diff --git a/lib/workers/repository/process/extract-update.js b/lib/workers/repository/process/extract-update.js
index edec07af96..0352e1b43c 100644
--- a/lib/workers/repository/process/extract-update.js
+++ b/lib/workers/repository/process/extract-update.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../logger');
 const { writeUpdates } = require('./write');
 const { sortBranches } = require('./sort');
 const { fetchUpdates } = require('./fetch');
diff --git a/lib/workers/repository/process/fetch.js b/lib/workers/repository/process/fetch.js
index 86ef289705..ca48317129 100644
--- a/lib/workers/repository/process/fetch.js
+++ b/lib/workers/repository/process/fetch.js
@@ -1,5 +1,6 @@
 const is = require('@sindresorhus/is');
 const pAll = require('p-all');
+const { logger } = require('../../../logger');
 
 const { getPackageUpdates } = require('../../../manager');
 const { mergeChildConfig } = require('../../../config');
diff --git a/lib/workers/repository/process/index.js b/lib/workers/repository/process/index.js
index 86d49b7c79..dd7a9e28cf 100644
--- a/lib/workers/repository/process/index.js
+++ b/lib/workers/repository/process/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../logger');
 const { mergeChildConfig } = require('../../../config');
 const { extractAndUpdate } = require('./extract-update');
 const { appName } = require('../../../config/app-strings');
diff --git a/lib/workers/repository/process/limits.js b/lib/workers/repository/process/limits.js
index 14b4c205ed..e058fe8e6e 100644
--- a/lib/workers/repository/process/limits.js
+++ b/lib/workers/repository/process/limits.js
@@ -1,4 +1,5 @@
 const moment = require('moment');
+const { logger } = require('../../../logger');
 
 const { onboardingBranch } = require('../../../config/app-strings');
 
diff --git a/lib/workers/repository/process/lookup/filter.js b/lib/workers/repository/process/lookup/filter.js
index c78a68d9ed..6cd3a42d9c 100644
--- a/lib/workers/repository/process/lookup/filter.js
+++ b/lib/workers/repository/process/lookup/filter.js
@@ -1,4 +1,5 @@
 const semver = require('semver');
+const { logger } = require('../../../../logger');
 const versioning = require('../../../../versioning');
 
 module.exports = {
diff --git a/lib/workers/repository/process/lookup/index.js b/lib/workers/repository/process/lookup/index.js
index 2acbaf5c41..64ddd9d669 100644
--- a/lib/workers/repository/process/lookup/index.js
+++ b/lib/workers/repository/process/lookup/index.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../../logger');
 const versioning = require('../../../../versioning');
 const { getRollbackUpdate } = require('./rollback');
 const { getRangeStrategy } = require('../../../../manager');
diff --git a/lib/workers/repository/process/lookup/rollback.js b/lib/workers/repository/process/lookup/rollback.js
index 8755350b2c..83d657e552 100644
--- a/lib/workers/repository/process/lookup/rollback.js
+++ b/lib/workers/repository/process/lookup/rollback.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../../logger');
 const versioning = require('../../../../versioning');
 
 module.exports = {
diff --git a/lib/workers/repository/process/sort.js b/lib/workers/repository/process/sort.js
index 6932c9dad0..807101f240 100644
--- a/lib/workers/repository/process/sort.js
+++ b/lib/workers/repository/process/sort.js
@@ -1,3 +1,5 @@
+const { logger } = require('../../../logger');
+
 module.exports = { sortBranches };
 
 function sortBranches(branches) {
diff --git a/lib/workers/repository/process/write.js b/lib/workers/repository/process/write.js
index 8382ad90c2..f72d032f74 100644
--- a/lib/workers/repository/process/write.js
+++ b/lib/workers/repository/process/write.js
@@ -1,3 +1,4 @@
+const { logger } = require('../../../logger');
 const branchWorker = require('../../branch');
 const { getPrsRemaining } = require('./limits');
 
diff --git a/lib/workers/repository/updates/branchify.js b/lib/workers/repository/updates/branchify.js
index 22355369ae..0f916163ec 100644
--- a/lib/workers/repository/updates/branchify.js
+++ b/lib/workers/repository/updates/branchify.js
@@ -1,6 +1,7 @@
 const handlebars = require('handlebars');
 const slugify = require('slugify');
 const cleanGitRef = require('clean-git-ref').clean;
+const { logger, setMeta } = require('../../../logger');
 
 const { generateBranchConfig } = require('./generate');
 const { flattenUpdates } = require('./flatten');
@@ -81,7 +82,7 @@ function branchifyUpgrades(config, packageFiles) {
   }
   logger.debug(`Returning ${Object.keys(branchUpgrades).length} branch(es)`);
   for (const branchName of Object.keys(branchUpgrades)) {
-    logger.setMeta({
+    setMeta({
       repository: config.repository,
       branch: branchName,
     });
@@ -89,7 +90,7 @@ function branchifyUpgrades(config, packageFiles) {
     branch.branchName = branchName;
     branches.push(branch);
   }
-  logger.setMeta({
+  setMeta({
     repository: config.repository,
   });
   logger.debug(`config.repoIsOnboarded=${config.repoIsOnboarded}`);
diff --git a/lib/workers/repository/updates/generate.js b/lib/workers/repository/updates/generate.js
index d92b4d1caf..2ad6f86dbe 100644
--- a/lib/workers/repository/updates/generate.js
+++ b/lib/workers/repository/updates/generate.js
@@ -2,6 +2,7 @@ const handlebars = require('handlebars');
 const { DateTime } = require('luxon');
 const semver = require('semver');
 const mdTable = require('markdown-table');
+const { logger } = require('../../../logger');
 const { mergeChildConfig } = require('../../../config');
 
 function ifTypesGroup(depNames, hasGroupName, branchUpgrades) {
diff --git a/test/datasource/maven.spec.js b/test/datasource/maven.spec.js
index d366f25fee..5f5792b60d 100644
--- a/test/datasource/maven.spec.js
+++ b/test/datasource/maven.spec.js
@@ -2,9 +2,6 @@ const nock = require('nock');
 const fs = require('fs');
 
 const datasource = require('../../lib/datasource');
-const { initLogger } = require('../../lib/logger');
-
-initLogger();
 
 const MYSQL_VERSIONS = [
   '6.0.5',
diff --git a/test/datasource/sbt/index.spec.js b/test/datasource/sbt/index.spec.js
index b8bc294b74..df354dd29d 100644
--- a/test/datasource/sbt/index.spec.js
+++ b/test/datasource/sbt/index.spec.js
@@ -3,9 +3,6 @@ const fs = require('fs');
 const nock = require('nock');
 
 const { getPkgReleases } = require('../../../lib/datasource/sbt');
-const { initLogger } = require('../../../lib/logger');
-
-initLogger();
 
 const { DEFAULT_MAVEN_REPO } = require('../../../lib/manager/maven/extract');
 const {
diff --git a/test/globals.js b/test/globals.js
index 6fd4ea9d90..d9b8cd0ef9 100644
--- a/test/globals.js
+++ b/test/globals.js
@@ -4,7 +4,7 @@ const os = require('os');
 const cache = require('../lib/workers/global/cache');
 
 global.platform = jest.genMockFromModule('../lib/platform/github');
-global.logger = require('./logger/_fixtures');
+jest.mock('../lib/logger');
 
 global.repoCache = {};
 
diff --git a/test/logger/__snapshots__/pretty-stdout.spec.js.snap b/test/logger/__snapshots__/pretty-stdout.spec.ts.snap
similarity index 51%
rename from test/logger/__snapshots__/pretty-stdout.spec.js.snap
rename to test/logger/__snapshots__/pretty-stdout.spec.ts.snap
index f00fbfb156..1a944e5b5f 100644
--- a/test/logger/__snapshots__/pretty-stdout.spec.js.snap
+++ b/test/logger/__snapshots__/pretty-stdout.spec.ts.snap
@@ -1,5 +1,11 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
+exports[`logger/pretty-stdout formatRecord(rec) formats record 1`] = `
+"TRACE: test message
+       \\"config\\": {\\"a\\": \\"b\\", \\"d\\": [\\"e\\", \\"f\\"]}
+"
+`;
+
 exports[`logger/pretty-stdout getDetails(rec) supports a config 1`] = `
 "       \\"config\\": {\\"a\\": \\"b\\", \\"d\\": [\\"e\\", \\"f\\"]}
 "
diff --git a/test/logger/_fixtures/index.js b/test/logger/_fixtures/index.js
deleted file mode 100644
index 9a77f8e0be..0000000000
--- a/test/logger/_fixtures/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-module.exports = {
-  fatal: jest.fn(),
-  error: jest.fn(),
-  warn: jest.fn(),
-  info: jest.fn(),
-  debug: jest.fn(),
-  trace: jest.fn(),
-  setMeta: jest.fn(),
-  levels: jest.fn(),
-  addStream: jest.fn(),
-};
diff --git a/test/logger/index.spec.js b/test/logger/index.spec.js
deleted file mode 100644
index 38e3d9584e..0000000000
--- a/test/logger/index.spec.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const { initLogger } = require('../../lib/logger');
-
-describe('logger', () => {
-  it('inits', () => {
-    delete global.logger;
-    delete process.env.LOG_LEVEL;
-    initLogger();
-    expect(global.logger).toBeDefined();
-  });
-  it('supports logging with metadata', () => {
-    global.logger.debug({ some: 'meta' }, 'some meta');
-  });
-  it('supports logging with only metadata', () => {
-    global.logger.debug({ some: 'meta' });
-  });
-  it('supports logging without metadata', () => {
-    global.logger.debug('some meta');
-  });
-  it('sets levels', () => {
-    global.logger.levels('stdout', 'DEBUG');
-  });
-  it('sets meta', () => {
-    global.logger.setMeta({ some: 'meta', and: 'more' });
-  });
-  it('adds stream', () => {
-    global.logger.addStream({
-      name: 'logfile',
-      path: 'fatal.log',
-      level: 'fatal',
-    });
-  });
-});
diff --git a/test/logger/index.spec.ts b/test/logger/index.spec.ts
new file mode 100644
index 0000000000..2521befed3
--- /dev/null
+++ b/test/logger/index.spec.ts
@@ -0,0 +1,26 @@
+import { logger, setMeta, levels } from '../../lib/logger';
+
+jest.unmock('../../lib/logger');
+
+describe('logger', () => {
+  it('inits', () => {
+    expect(logger).toBeDefined();
+  });
+  it('supports logging with metadata', () => {
+    logger.debug({ some: 'meta' }, 'some meta');
+  });
+  it('supports logging with only metadata', () => {
+    logger.debug({ some: 'meta' });
+  });
+  it('supports logging without metadata', () => {
+    logger.debug('some meta');
+  });
+
+  it('sets meta', () => {
+    setMeta({ any: 'test' });
+  });
+
+  it('sets level', () => {
+    levels('stdout', 'debug');
+  });
+});
diff --git a/test/logger/pretty-stdout.spec.js b/test/logger/pretty-stdout.spec.ts
similarity index 50%
rename from test/logger/pretty-stdout.spec.js
rename to test/logger/pretty-stdout.spec.ts
index 41f350b5b3..f38dd60019 100644
--- a/test/logger/pretty-stdout.spec.js
+++ b/test/logger/pretty-stdout.spec.ts
@@ -1,26 +1,26 @@
-const chalk = require('chalk');
-const prettyStdout = require('../../lib/logger/pretty-stdout');
+import chalk from 'chalk';
+import * as prettyStdout from '../../lib/logger/pretty-stdout';
 
 describe('logger/pretty-stdout', () => {
   describe('getMeta(rec)', () => {
     it('returns empty string if null rec', () => {
-      expect(prettyStdout.getMeta(null)).toEqual('');
+      expect(prettyStdout.getMeta(null as any)).toEqual('');
     });
     it('returns empty string if empty rec', () => {
-      expect(prettyStdout.getMeta({})).toEqual('');
+      expect(prettyStdout.getMeta({} as any)).toEqual('');
     });
     it('returns empty string if no meta fields', () => {
       const rec = {
         foo: 'bar',
       };
-      expect(prettyStdout.getMeta(rec)).toEqual('');
+      expect(prettyStdout.getMeta(rec as any)).toEqual('');
     });
     it('supports single meta', () => {
       const rec = {
         foo: 'bar',
         repository: 'a/b',
       };
-      expect(prettyStdout.getMeta(rec)).toEqual(
+      expect(prettyStdout.getMeta(rec as any)).toEqual(
         chalk.gray(' (repository=a/b)')
       );
     });
@@ -29,25 +29,26 @@ describe('logger/pretty-stdout', () => {
         foo: 'bar',
         branch: 'c',
         repository: 'a/b',
+        module: 'test',
       };
-      expect(prettyStdout.getMeta(rec)).toEqual(
-        chalk.gray(' (repository=a/b, branch=c)')
+      expect(prettyStdout.getMeta(rec as any)).toEqual(
+        chalk.gray(' (repository=a/b, branch=c) [test]')
       );
     });
   });
   describe('getDetails(rec)', () => {
     it('returns empty string if null rec', () => {
-      expect(prettyStdout.getDetails(null)).toEqual('');
+      expect(prettyStdout.getDetails(null as any)).toEqual('');
     });
     it('returns empty string if empty rec', () => {
-      expect(prettyStdout.getDetails({})).toEqual('');
+      expect(prettyStdout.getDetails({} as any)).toEqual('');
     });
     it('returns empty string if all are meta fields', () => {
       const rec = {
         branch: 'bar',
         v: 0,
       };
-      expect(prettyStdout.getDetails(rec)).toEqual('');
+      expect(prettyStdout.getDetails(rec as any)).toEqual('');
     });
     it('supports a config', () => {
       const rec = {
@@ -57,7 +58,21 @@ describe('logger/pretty-stdout', () => {
           d: ['e', 'f'],
         },
       };
-      expect(prettyStdout.getDetails(rec)).toMatchSnapshot();
+      expect(prettyStdout.getDetails(rec as any)).toMatchSnapshot();
+    });
+  });
+  describe('formatRecord(rec)', () => {
+    it('formats record', () => {
+      const rec: prettyStdout.BunyanRecord = {
+        level: 10,
+        msg: 'test message',
+        v: 0,
+        config: {
+          a: 'b',
+          d: ['e', 'f'],
+        },
+      };
+      expect(prettyStdout.formatRecord(rec)).toMatchSnapshot();
     });
   });
 });
diff --git a/test/manager/gradle/index.spec.js b/test/manager/gradle/index.spec.js
index 51af463737..6575cb2e48 100644
--- a/test/manager/gradle/index.spec.js
+++ b/test/manager/gradle/index.spec.js
@@ -5,9 +5,6 @@ const { toUnix } = require('upath');
 const fs = require('fs-extra');
 const fsReal = require('fs');
 const { exec } = require('child-process-promise');
-const { initLogger } = require('../../../lib/logger');
-
-initLogger();
 
 const manager = require('../../../lib/manager/gradle/index');
 
diff --git a/test/workers/repository/error.spec.js b/test/workers/repository/error.spec.js
index 9615dc505d..504c41b26d 100644
--- a/test/workers/repository/error.spec.js
+++ b/test/workers/repository/error.spec.js
@@ -1,4 +1,4 @@
-const { handleError } = require('../../../lib/workers/repository/error');
+import handleError from '../../../lib/workers/repository/error';
 
 jest.mock('../../../lib/workers/repository/error-config');
 
diff --git a/tsconfig.json b/tsconfig.json
index 75953254b3..814df428d8 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -15,5 +15,5 @@
     "types": ["node", "jest"]
   },
   "include": ["lib/**/*", "test/**/*"],
-  "exclude": ["node_modules", "./.cache", "./dist"]
+  "exclude": ["node_modules", "./.cache", "./dist", "**/__mocks__/*"]
 }
-- 
GitLab