diff --git a/lib/config-validator.ts b/lib/config-validator.ts
index 00d3176fc5917ee084b03b3ebe8dd4618dbabceb..07bf4bbe4cda03999a72e8b2d550e834607c8f0e 100644
--- a/lib/config-validator.ts
+++ b/lib/config-validator.ts
@@ -34,11 +34,17 @@ async function validate(
   const massagedConfig = massageConfig(migratedConfig);
   const res = await validateConfig(massagedConfig, isPreset);
   if (res.errors.length) {
-    logger.error({ errors: res.errors }, `${desc} contains errors`);
+    logger.error(
+      { file: desc, errors: res.errors },
+      'Found errors in configuration'
+    );
     returnVal = 1;
   }
   if (res.warnings.length) {
-    logger.warn({ warnings: res.warnings }, `${desc} contains warnings`);
+    logger.warn(
+      { file: desc, warnings: res.warnings },
+      'Found errors in configuration'
+    );
     returnVal = 1;
   }
 }
@@ -54,7 +60,7 @@ type PackageJson = {
       try {
         if (!(await pathExists(file))) {
           returnVal = 1;
-          logger.error(`${file} does not exist`);
+          logger.error({ file }, 'File does not exist');
           break;
         }
         const parsedContent = await getParsedContent(file);
@@ -62,11 +68,11 @@ type PackageJson = {
           logger.info(`Validating ${file}`);
           await validate(file, parsedContent);
         } catch (err) {
-          logger.warn({ err }, `${file} is not valid Renovate config`);
+          logger.warn({ file, err }, 'File is not valid Renovate config');
           returnVal = 1;
         }
       } catch (err) {
-        logger.warn({ err }, `${file} could not be parsed`);
+        logger.warn({ file, err }, 'File could not be parsed');
         returnVal = 1;
       }
     }
@@ -83,11 +89,11 @@ type PackageJson = {
           logger.info(`Validating ${file}`);
           await validate(file, parsedContent);
         } catch (err) {
-          logger.warn({ err }, `${file} is not valid Renovate config`);
+          logger.warn({ file, err }, 'File is not valid Renovate config');
           returnVal = 1;
         }
       } catch (err) {
-        logger.warn({ err }, `${file} could not be parsed`);
+        logger.warn({ file, err }, 'File could not be parsed');
         returnVal = 1;
       }
     }
@@ -116,7 +122,7 @@ type PackageJson = {
         try {
           await validate(file, fileConfig);
         } catch (err) {
-          logger.error({ err }, `${file} is not valid Renovate config`);
+          logger.error({ file, err }, 'File is not valid Renovate config');
           returnVal = 1;
         }
       }
diff --git a/lib/modules/manager/gomod/artifacts.ts b/lib/modules/manager/gomod/artifacts.ts
index a5606467dba9bf24715a67a7e0428744f9bce232..72ecb0f15828810ae658fac06a96a50d0d47be87 100644
--- a/lib/modules/manager/gomod/artifacts.ts
+++ b/lib/modules/manager/gomod/artifacts.ts
@@ -36,7 +36,10 @@ function getUpdateImportPathCmds(
   );
   if (invalidMajorDeps.length > 0) {
     invalidMajorDeps.forEach(({ depName }) =>
-      logger.warn(`Could not get major version of ${depName!}. Ignoring`)
+      logger.warn(
+        { depName },
+        'Ignoring dependency: Could not get major version'
+      )
     );
   }
 
diff --git a/lib/modules/manager/pub/artifacts.ts b/lib/modules/manager/pub/artifacts.ts
index 16cdae0a8f72ffd974bacea8b122dae3f71dacb0..16b4de4b22fb8b288d7b8daf20d3f98d2370e9d9 100644
--- a/lib/modules/manager/pub/artifacts.ts
+++ b/lib/modules/manager/pub/artifacts.ts
@@ -96,7 +96,7 @@ export async function updateArtifacts({
     if (err.message === TEMPORARY_ERROR) {
       throw err;
     }
-    logger.warn({ err }, `Failed to update ${lockFileName} file`);
+    logger.warn({ lockfile: lockFileName, err }, `Failed to update lock file`);
     return [
       {
         artifactError: {
diff --git a/lib/modules/platform/gitea/index.ts b/lib/modules/platform/gitea/index.ts
index ecc8e64bfa5c3cb5b38340c67e6839aa8cc2a01d..cc1fdfda04a18893f2811cdd2f56b0f25c4566ba 100644
--- a/lib/modules/platform/gitea/index.ts
+++ b/lib/modules/platform/gitea/index.ts
@@ -737,7 +737,7 @@ const platform: Platform = {
         for (const issue of issues) {
           if (issue.state === 'open' && issue.number !== activeIssue.number) {
             // TODO: types (#7154)
-            logger.warn(`Closing duplicate Issue #${issue.number!}`);
+            logger.warn({ issueNo: issue.number! }, 'Closing duplicate issue');
             // TODO #7154
             await helper.closeIssue(config.repository, issue.number!);
           }
diff --git a/lib/modules/platform/github/index.ts b/lib/modules/platform/github/index.ts
index 5370c458a743c1a3c1a1d6b2d35feef93f77e077..1b935ecbb03fcd114de7285c06a529ddbdab45aa 100644
--- a/lib/modules/platform/github/index.ts
+++ b/lib/modules/platform/github/index.ts
@@ -1192,7 +1192,7 @@ export async function ensureIssue({
       }
       for (const i of issues) {
         if (i.state === 'open' && i.number !== issue.number) {
-          logger.warn(`Closing duplicate issue ${i.number}`);
+          logger.warn({ issueNo: i.number }, 'Closing duplicate issue');
           // TODO #7154
           await closeIssue(i.number!);
         }
@@ -1693,7 +1693,10 @@ export async function mergePr({
           'GitHub blocking PR merge -- will keep trying'
         );
       } else {
-        logger.warn({ err }, `Failed to ${config.mergeMethod} merge PR`);
+        logger.warn(
+          { mergeMethod: config.mergeMethod, err },
+          'Failed to merge PR'
+        );
         return false;
       }
     }
diff --git a/lib/modules/versioning/ruby/index.ts b/lib/modules/versioning/ruby/index.ts
index 8c95cdf876d19291e6d6dec16b7d1789534fb8e7..b2cee80b2e2e5f5f32f5274a17902af54307a37e 100644
--- a/lib/modules/versioning/ruby/index.ts
+++ b/lib/modules/versioning/ruby/index.ts
@@ -141,7 +141,7 @@ const getNewValue = ({
         break;
       // istanbul ignore next
       default:
-        logger.warn(`Unsupported strategy ${rangeStrategy}`);
+        logger.warn({ rangeStrategy }, 'Unsupported range strategy');
     }
   }
   if (newValue && regEx(/^('|")/).exec(currentValue)) {
diff --git a/lib/modules/versioning/ruby/range.ts b/lib/modules/versioning/ruby/range.ts
index 02f8a0a1b778830b945094db2754ee5eda56990e..a490d9c94c14dc1fd3c3d3a05603408827036b9b 100644
--- a/lib/modules/versioning/ruby/range.ts
+++ b/lib/modules/versioning/ruby/range.ts
@@ -98,7 +98,7 @@ type GemRequirement = [string, Version];
 const ltr = (version: string, range: string): boolean => {
   const gemVersion = create(version);
   if (!gemVersion) {
-    logger.warn(`Invalid ruby version '${version}'`);
+    logger.warn({ version }, `Invalid ruby version`);
     return false;
   }
   const requirements: GemRequirement[] = range.split(',').map(_parse);
@@ -120,7 +120,7 @@ const ltr = (version: string, range: string): boolean => {
         );
       // istanbul ignore next
       default:
-        logger.warn(`Unsupported operator '${operator}'`);
+        logger.warn({ operator }, `Unsupported operator`);
         return false;
     }
   });
diff --git a/lib/modules/versioning/ruby/strategies/replace.ts b/lib/modules/versioning/ruby/strategies/replace.ts
index 713e1d71db20c6038d4f183a146f57b3972dccea..29d32d859df61c5c6561b9b526b82aa84a9a234d 100644
--- a/lib/modules/versioning/ruby/strategies/replace.ts
+++ b/lib/modules/versioning/ruby/strategies/replace.ts
@@ -31,7 +31,7 @@ export function replacePart(part: Range, to: string): Range {
       return part;
     // istanbul ignore next
     default:
-      logger.warn(`Unsupported operator '${operator}'`);
+      logger.warn({ operator }, `Unsupported ruby versioning operator`);
       return { operator: '', delimiter: ' ', version: '' };
   }
 }
diff --git a/lib/util/exec/docker/index.ts b/lib/util/exec/docker/index.ts
index bab2610a56053c41af53c91caf845fa092375090..d20ccb9d0239f255377ec8c23c7b9ccc98ddf5cd 100644
--- a/lib/util/exec/docker/index.ts
+++ b/lib/util/exec/docker/index.ts
@@ -123,7 +123,7 @@ export async function getDockerTag(
       return version;
     }
   } else {
-    logger.error(`No ${packageName} releases found`);
+    logger.error({ packageName }, `Docker exec: no releases found`);
     return 'latest';
   }
   logger.warn(
diff --git a/lib/util/http/bitbucket.ts b/lib/util/http/bitbucket.ts
index 34c5166ca8cb7a4bb5d5b8c064417edd1c1f783b..e99d855012e67b9d28573f4ad60622dd9c2d5293 100644
--- a/lib/util/http/bitbucket.ts
+++ b/lib/util/http/bitbucket.ts
@@ -34,7 +34,7 @@ export class BitbucketHttp extends Http<BitbucketHttpOptions> {
 
     // istanbul ignore if: this should never happen
     if (is.nullOrUndefined(resolvedURL)) {
-      logger.error(`Bitbucket: cannot parse path ${path}`);
+      logger.error({ path }, 'Bitbucket: cannot parse path');
       throw new Error(`Bitbucket: cannot parse path ${path}`);
     }
 
diff --git a/lib/workers/global/config/parse/host-rules-from-env.ts b/lib/workers/global/config/parse/host-rules-from-env.ts
index f4b85dab3fa0e776d2d227e2902b35ccb1bdcfb2..2db3e81a71c742c39b9af7fc8dcf4fe4b32697b7 100644
--- a/lib/workers/global/config/parse/host-rules-from-env.ts
+++ b/lib/workers/global/config/parse/host-rules-from-env.ts
@@ -32,7 +32,7 @@ export function hostRulesFromEnv(env: NodeJS.ProcessEnv): HostRule[] {
         if (splitEnv.length === 0) {
           // host-less rule
         } else if (splitEnv.length === 1) {
-          logger.warn(`Cannot parse ${envName} env`);
+          logger.warn({ env: envName }, 'Cannot parse env');
           continue;
         } else {
           matchHost = splitEnv.join('.');
diff --git a/lib/workers/repository/update/branch/index.ts b/lib/workers/repository/update/branch/index.ts
index b66fd7850efbe15a4d036be9b08a4e5e2249553c..a7dafcec36b93098337d01a27f18866eff6fdfa5 100644
--- a/lib/workers/repository/update/branch/index.ts
+++ b/lib/workers/repository/update/branch/index.ts
@@ -873,7 +873,7 @@ export async function processBranch(
       throw err;
     }
     // Otherwise don't throw here - we don't want to stop the other renovations
-    logger.error({ err }, `Error ensuring PR: ${String(err.message)}`);
+    logger.error({ err }, `Error ensuring PR`);
   }
   if (!branchExists) {
     return {
diff --git a/lib/workers/repository/update/pr/changelog/release-notes.ts b/lib/workers/repository/update/pr/changelog/release-notes.ts
index cae6f67d65655f92bb0162d8ee9d8d523ddec4c5..fa9b565d035ab759b9ba8925bb422f9448a5ca3a 100644
--- a/lib/workers/repository/update/pr/changelog/release-notes.ts
+++ b/lib/workers/repository/update/pr/changelog/release-notes.ts
@@ -364,7 +364,10 @@ export async function getReleaseNotesMd(
             }
           }
         } catch (err) /* istanbul ignore next */ {
-          logger.warn({ err }, `Error parsing ${changelogFile}`);
+          logger.warn(
+            { file: changelogFile, err },
+            `Error parsing changelog file`
+          );
         }
       }
     }