{
 "number": 30342,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/30342",
 "title": "kernel, logging: Pass Logger instances to kernel objects",
 "author": "ryanofsky",
 "author_association": "MEMBER",
 "created_at": "2024-06-26T17:52:24Z",
 "updated_at": "2026-09-16T00:14:51Z",
 "age_days": 812,
 "draft": true,
 "labels": [
  "Needs rebase"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "687074dd2e99b4669efc821f8d8141ba6a708fe0",
 "head_ref": "pr/gklog",
 "head_repo": "ryanofsky/bitcoin",
 "head_history": [
  {
   "t": "2024-06-26T22:34:56Z",
   "sha": "db1b9f7696af80036de739408cd9eae5d06481ec"
  },
  {
   "t": "2024-07-09T22:21:25Z",
   "sha": "42d0e06d1a4343c2bf3257f26cf18b79072c6b0d"
  },
  {
   "t": "2024-07-10T18:04:13Z",
   "sha": "fcaed3faf0f12b3b322e65df1e81d455bbee7db5"
  },
  {
   "t": "2024-07-10T18:22:22Z",
   "sha": "f005677f762754ae09417c2a418e27d28ef3c7e1"
  },
  {
   "t": "2024-07-18T00:15:59Z",
   "sha": "dcd055ecf9c20b84930c2ce45d922427cf0112ea"
  },
  {
   "t": "2024-08-07T02:03:41Z",
   "sha": "53d7933727ebe0670dceb88ec9f1020bd7b0b280"
  },
  {
   "t": "2024-08-07T02:24:05Z",
   "sha": "10c275342dca365a6678da5fc016ca9d46d9dfca"
  },
  {
   "t": "2024-12-09T20:42:17Z",
   "sha": "493dd26b75d0e35422b3230be3c72a0f96eb5e8a"
  },
  {
   "t": "2025-03-12T14:01:46Z",
   "sha": "e971028fa5e570acf585073494acd65f4831ab1c"
  },
  {
   "t": "2025-04-03T17:32:33Z",
   "sha": "282db88a9b1789f0d78928c87c7204402ac11ac3"
  },
  {
   "t": "2025-04-04T03:37:53Z",
   "sha": "ec6d771d3b34ec979e373f025c4f064ae44df860"
  },
  {
   "t": "2025-10-15T00:42:18Z",
   "sha": "b1b72969c9764636721a7518a2f4453d0eb3845d"
  },
  {
   "t": "2025-10-16T14:46:32Z",
   "sha": "d0e2944bb18e44c599312b980900c324ae698464"
  },
  {
   "t": "2025-11-10T23:35:10Z",
   "sha": "8482a49ab89012c3cd99acd43e1f698311426c3a"
  },
  {
   "t": "2025-11-11T14:25:26Z",
   "sha": "baaaa41b93cba064d12d641899968ee897eb0671"
  },
  {
   "t": "2025-12-12T12:19:44Z",
   "sha": "b9dc75a2b5d6bfadce65cd2837a3042c888a8afd"
  },
  {
   "t": "2025-12-16T02:10:54Z",
   "sha": "97be3ef0b6239a9e674be3d8c70f99ec5fe5b8eb"
  },
  {
   "t": "2026-01-18T17:04:23Z",
   "sha": "db29e8fb43fa8011eb5c68f376ea74b4f087deda"
  },
  {
   "t": "2026-01-18T19:52:08Z",
   "sha": "d6c23d4219b30dc8e045f4c6b90a7ad493faf383"
  },
  {
   "t": "2026-01-22T22:38:34Z",
   "sha": "e284a60131f8933beea468f9390f8067c8f24b12"
  },
  {
   "t": "2026-02-03T19:10:09Z",
   "sha": "c6ba50e3e9c148986097792122931431a8d6a00e"
  },
  {
   "t": "2026-02-03T19:52:48Z",
   "sha": "8c54eb8d1c9488a8934d874125148a64a8d10ff6"
  },
  {
   "t": "2026-02-03T20:55:52Z",
   "sha": "c9e6477ea1c20ce7b1f3ec5d252d8a5ac07f51a9"
  },
  {
   "t": "2026-02-09T15:03:26Z",
   "sha": "aa4d26979f0b1c24adeeec489b36180c87ca484c"
  },
  {
   "t": "2026-02-09T16:48:26Z",
   "sha": "82b4b08362dbff4d06d5548ab16ea15671d6554d"
  },
  {
   "t": "2026-02-09T18:15:46Z",
   "sha": "8bafdfed01810a47c5659ae939b94f34f3164bf6"
  },
  {
   "t": "2026-03-02T02:42:00Z",
   "sha": "d137676ffd09da75f0418f7787fab8e249824e6f"
  },
  {
   "t": "2026-03-02T16:18:30Z",
   "sha": "ea7842f5b68c2986982c31f2482d47d2bc89c382"
  },
  {
   "t": "2026-03-03T13:07:23Z",
   "sha": "b6b95a62447c589a0078474fb8f6bc4b2e7e8a51"
  },
  {
   "t": "2026-03-09T15:48:10Z",
   "sha": "f048e807c6b4327474466c749fe48cb43dd651a0"
  },
  {
   "t": "2026-03-09T19:02:17Z",
   "sha": "71e2a726cb812f40869c8e9dd09257ffbdb4ab05"
  },
  {
   "t": "2026-04-01T20:13:06Z",
   "sha": "74c694e7a55ed3d77bd70eef3b66fed7c5edb222"
  },
  {
   "t": "2026-04-01T20:56:43Z",
   "sha": "f3a87a203f8c6916786916200368701132f419d1"
  },
  {
   "t": "2026-05-12T17:21:23Z",
   "sha": "41fb7ccf129bee40b19e5968a7ee8b39c6893544"
  },
  {
   "t": "2026-05-13T13:03:53Z",
   "sha": "6e7439bf9c5d0db4332ad71949ffad5cf0c91329"
  },
  {
   "t": "2026-05-29T14:33:17Z",
   "sha": "eeaa0f75f4fdb23b26cb0218c5b85d0c6203f978"
  },
  {
   "t": "2026-06-01T23:12:59Z",
   "sha": "9837bfbea7a29c5bc8576078613998386193e26e"
  },
  {
   "t": "2026-06-08T13:30:21Z",
   "sha": "800d7ac20797cb5ea1274a06fb4c29595fd1e1ef"
  },
  {
   "t": "2026-06-24T15:07:09Z",
   "sha": "2ade31b4c880806ad67967aa2f72e7ab0493b534"
  },
  {
   "t": "2026-06-24T19:58:22Z",
   "sha": "837d1ec1702abd4539b6b1da6c3edd27d55cf683"
  },
  {
   "t": "2026-07-14T13:42:12Z",
   "sha": "cb27fe01eac1b4fe127070556ae88b9e5b7a01c4"
  },
  {
   "t": "2026-07-14T14:55:59Z",
   "sha": "b6c10b5b3d317a64e6a175e25b3e92e54988ff9b"
  },
  {
   "t": "2026-07-14T15:58:51Z",
   "sha": "3c6f22155bef4311cfbd3a322b2ab8b75eebd271"
  },
  {
   "t": "2026-07-14T17:15:11Z",
   "sha": "6714b346a70d520d66bcecc34647bb8109209069"
  },
  {
   "t": "2026-07-14T17:56:06Z",
   "sha": "62b789b47fbf8176dec04b9d8c365e9a8f6ee587"
  },
  {
   "t": "2026-07-14T18:38:42Z",
   "sha": "188090e766b7c947580eb51fadfb339df070e4e3"
  },
  {
   "t": "2026-07-14T22:19:55Z",
   "sha": "a9236a37f6d6b3654f4e2651d5df05b13708adb1"
  },
  {
   "t": "2026-07-14T22:57:06Z",
   "sha": "6105b072d2689df67d38bb9c80b04c173b05930f"
  },
  {
   "t": "2026-08-15T01:22:42Z",
   "sha": "03e4b6aa42de585f4074ff80c8a5d522d7a4b83a"
  },
  {
   "t": "2026-08-20T00:04:48Z",
   "sha": "687074dd2e99b4669efc821f8d8141ba6a708fe0"
  }
 ],
 "additions": 1099,
 "deletions": 591,
 "changed_files": 69,
 "commit_count": 18,
 "size_bucket": "XL",
 "mergeable_state": "dirty",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "concept_ack": [
     {
      "login": "sedited",
      "url": "https://github.com/bitcoin/bitcoin/pull/30342#issuecomment-2192559502"
     }
    ],
    "approach_nack": [
     {
      "login": "stickies-v",
      "url": "https://github.com/bitcoin/bitcoin/pull/30342#pullrequestreview-3900550949"
     }
    ]
   },
   "conflicts": [
    {
     "number": 36207,
     "title": "kernel: add wtxid accessor",
     "author": "KY-U"
    },
    {
     "number": 36197,
     "title": "kernel: Replace application log callbacks with file logging",
     "author": "w0xlt"
    },
    {
     "number": 36171,
     "title": "blockstorage: Defer error notifications to callers",
     "author": "w0xlt"
    },
    {
     "number": 36167,
     "title": "[RFC] Enable `-Wunused`",
     "author": "fanquake"
    },
    {
     "number": 36000,
     "title": "validation: prefetch blocks while connecting",
     "author": "l0rinc"
    },
    {
     "number": 35938,
     "title": "blockstorage: fail instead of storing a null XOR key over a lost one",
     "author": "kwsantiago"
    },
    {
     "number": 35906,
     "title": "First steps towards a stateless, side-effect free validation library",
     "author": "purpleKarrot"
    },
    {
     "number": 35788,
     "title": "bitcoin-util: Add evalscript subcommand",
     "author": "ajtowns"
    },
    {
     "number": 35744,
     "title": "coins: prevent DB resize from invalidating cursors",
     "author": "l0rinc"
    },
    {
     "number": 35731,
     "title": "Indexes: Harden the flush-error notification invariant",
     "author": "arejula27"
    },
    {
     "number": 35714,
     "title": "validation: stop writes after flush failure",
     "author": "l0rinc"
    },
    {
     "number": 35675,
     "title": "mining: add block template manager",
     "author": "ismaelsadeeq"
    },
    {
     "number": 35646,
     "title": "RFC: Separate out runtime errors from BlockValidationState using `util::Expected`",
     "author": "yuvicc"
    },
    {
     "number": 35641,
     "title": "kernel: Add script evaluation tracer",
     "author": "sedited"
    },
    {
     "number": 35581,
     "title": "node: add block template manager and track waitNext fee inflow",
     "author": "ismaelsadeeq"
    },
    {
     "number": 35570,
     "title": "refactor: Change some validation.cpp methods to return BlockValidationState",
     "author": "optout21"
    },
    {
     "number": 35569,
     "title": "Encapsulation for CTransaction",
     "author": "purpleKarrot"
    },
    {
     "number": 35557,
     "title": "kernel, validation: Add btck_chainstate_manager_set_clock_time",
     "author": "ryanofsky"
    },
    {
     "number": 35511,
     "title": "RFC: consensus: Make `CAmount` a class",
     "author": "hodlinator"
    },
    {
     "number": 35322,
     "title": "logging: streamline Logger state and drop redundant methods",
     "author": "ryanofsky"
    },
    {
     "number": 35307,
     "title": "blockstorage: keep snapshot base in normal blockfile range",
     "author": "shuv-amp"
    },
    {
     "number": 35071,
     "title": "Reindex: save progress to continue after interruption",
     "author": "pinheadmz"
    },
    {
     "number": 34864,
     "title": "coins: tighten cache entry state invariants",
     "author": "l0rinc"
    },
    {
     "number": 34775,
     "title": "kernel: make logging callback global",
     "author": "stickies-v"
    },
    {
     "number": 34729,
     "title": "Reduce log noise",
     "author": "ajtowns"
    },
    {
     "number": 34374,
     "title": "kernel: use struct-based logging and simplify logging interface",
     "author": "stickies-v"
    },
    {
     "number": 34254,
     "title": "validation: Prevent duplicate logging and looping in invalid block handling",
     "author": "mzumsande"
    },
    {
     "number": 34132,
     "title": "coins, dbwrapper: remove error catcher, make point-read failures fatal",
     "author": "l0rinc"
    },
    {
     "number": 33922,
     "title": "mining: add getMemoryLoad() and track template non-mempool memory footprint",
     "author": "Sjors"
    },
    {
     "number": 33847,
     "title": "kernel: Improve logging API",
     "author": "ryanofsky"
    },
    {
     "number": 33646,
     "title": "log: check fclose() results and report safely in logging.cpp",
     "author": "cedwies"
    },
    {
     "number": 33324,
     "title": "blocks: add resumable reobfuscation for existing block files",
     "author": "l0rinc"
    },
    {
     "number": 29843,
     "title": "policy: Allow non-standard scripts with -acceptnonstdtxn=1 (test nets only)",
     "author": "ajtowns"
    },
    {
     "number": 29700,
     "title": "kernel, refactor: return error status on all fatal errors",
     "author": "ryanofsky"
    },
    {
     "number": 29491,
     "title": "[EXPERIMENTAL] Schnorr batch verification for blocks",
     "author": "fjahr"
    },
    {
     "number": 26022,
     "title": "Add util::ResultPtr class",
     "author": "ryanofsky"
    },
    {
     "number": 25665,
     "title": "refactor: Add util::Result failure types and ability to merge result values",
     "author": "ryanofsky"
    },
    {
     "number": 19461,
     "title": "multiprocess: Add bitcoin-gui -ipcconnect option",
     "author": "ryanofsky"
    },
    {
     "number": 19460,
     "title": "multiprocess: Add bitcoin-wallet -ipcconnect option",
     "author": "ryanofsky"
    },
    {
     "number": 10102,
     "title": "Multiprocess bitcoin",
     "author": "ryanofsky"
    }
   ]
  }
 },
 "acks_parsed": {
  "sedited": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2024-06-26T20:21:37Z",
   "stale": false
  }
 },
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 1,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 0,
  "distinct_reviewers": [
   "sedited",
   "stickies-v"
  ]
 },
 "signals": {
  "needs_rebase": true,
  "ci_failed": false,
  "mergeable_state": "dirty",
  "last_author_activity": "2026-08-20T00:04:48Z",
  "last_reviewer_activity": "2026-03-08T06:03:42Z",
  "last_reviewer": "stickies-v",
  "author_silent_days": 28,
  "waiting_on_author_days": 0,
  "days_since_update": 1
 },
 "refs": {
  "mentioned": [
   28052,
   28318,
   29256,
   30141,
   30338,
   30343,
   30407,
   30425,
   30485,
   30965,
   31393,
   31490,
   32950,
   33512,
   33680,
   33847,
   34165,
   34253,
   34562,
   34778,
   34806,
   34865,
   34866,
   34887,
   35295,
   35465,
   35496,
   35521,
   35568,
   35723,
   35965
  ],
  "depends_on": [
   34778
  ],
  "fixes": [],
  "linked_issues": [],
  "references": [
   {
    "number": 34778,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "logging: rewrite macros to enforce restrictions at compile-time, improve efficiency and usability"
   },
   {
    "number": 30338,
    "type": "pull",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "RFC: Instanced logs"
   },
   {
    "number": 28318,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2024-01-10",
    "title": "logging: Simplify API for level based logging"
   },
   {
    "number": 29256,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "log, refactor: Allow log macros to accept context arguments"
   },
   {
    "number": 33847,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "kernel: Improve logging API"
   },
   {
    "number": 30343,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "wallet, logging: Replace WalletLogPrintf() with LogInfo()"
   },
   {
    "number": 28052,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2024-08-05",
    "title": "blockstorage: XOR blocksdir *.dat files"
   },
   {
    "number": 30141,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2024-07-08",
    "title": "kernel: De-globalize validation caches"
   },
   {
    "number": 30407,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2024-07-15",
    "title": "test: [refactor] Pass TestOpts"
   },
   {
    "number": 30425,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2024-07-16",
    "title": "kernel: De-globalize static validation variables"
   },
   {
    "number": 30485,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2024-08-06",
    "title": "log: Remove NOLINT(bitcoin-unterminated-logprintf)"
   },
   {
    "number": 30965,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-01-31",
    "title": "kernel: Move block tree db open to block manager"
   },
   {
    "number": 31393,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2024-12-18",
    "title": "refactor: Move GuessVerificationProgress into ChainstateManager"
   },
   {
    "number": 31490,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-01-22",
    "title": "refactor: inline `UndoWriteToDisk` and `WriteBlockToDisk` to reduce serialization calls"
   },
   {
    "number": 32950,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-02-18",
    "title": "validation: remove BLOCK_FAILED_CHILD"
   },
   {
    "number": 33512,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-02-19",
    "title": "coins: use dirty entry count for flush warnings and disk space checks"
   },
   {
    "number": 33680,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-01-29",
    "title": "validation: do not wipe utxo cache for stats/scans/snapshots"
   },
   {
    "number": 34165,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-02-20",
    "title": "coins: don't mutate main cache when connecting block"
   },
   {
    "number": 34253,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-01-29",
    "title": "validation: cache tip recency for lock-free `IsInitialBlockDownload()`"
   },
   {
    "number": 34562,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-02-26",
    "title": "ThreadPool follow-ups, proactive shutdown and HasReason dependency cleanup"
   },
   {
    "number": 34806,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-05-22",
    "title": "refactor: logging: Various API improvements"
   },
   {
    "number": 34865,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-04-23",
    "title": "logging: better use of log::Entry internally"
   },
   {
    "number": 34866,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-06-03",
    "title": "fuzz: target concurrent leveldb reads"
   },
   {
    "number": 34887,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-05-21",
    "title": "fuzz: target CDBWrapper"
   },
   {
    "number": 35295,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-07-09",
    "title": "validation: fetch block input prevouts in parallel during ConnectBlock"
   },
   {
    "number": 35465,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-06-22",
    "title": "coins: compact chainstate regularly"
   },
   {
    "number": 35496,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-08-11",
    "title": "kernel: add `btck_set_mock_time` for testing time-dependent paths"
   },
   {
    "number": 35521,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-06-22",
    "title": "fuzz: Speed up `dbwrapper_concurrent_reads` harness"
   },
   {
    "number": 35568,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-07-12",
    "title": "txospenderindex: disable bloom filters to optimize disk usage"
   },
   {
    "number": 35723,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-07-14",
    "title": "fuzz: Drop unnecessary mutexes"
   },
   {
    "number": 35965,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-08-19",
    "title": "test: Tighten Coin equality and add debug output"
   }
  ],
  "conflicts": [
   36207,
   36197,
   36171,
   36167,
   36000,
   35938,
   35906,
   35788,
   35744,
   35731,
   35714,
   35675,
   35646,
   35641,
   35581,
   35570,
   35569,
   35557,
   35511,
   35322,
   35307,
   35071,
   34864,
   34775,
   34729,
   34374,
   34254,
   34132,
   33922,
   33847,
   33646,
   33324,
   29843,
   29700,
   29491,
   26022,
   25665,
   19461,
   19460,
   10102
  ]
 },
 "stack": {
  "shares_commits_with": [
   29256,
   30343,
   34778
  ],
  "based_on": [
   29256,
   34778
  ],
  "base_for": []
 },
 "review_paths": [],
 "body": "Pass `Logger` instances to `BlockManager`, `CCoinsViewDB`, `CDBWrapper`, `Chainstate`, `ChainstateManager`, `CoinsViews`, and `CTxMemPool` classes so libbitcoinkernel applications and tests have the option to control where log output goes instead of having all output sent to the global logger.\n\nThis PR is an alternative to #30338. It is more limited because it only changes kernel code while leaving other parts of the codebase alone. It also takes the opportunity to migrate legacy LogPrint / LogPrintf calls to the new log macros introduced in #28318.\n\n---\n\n**This is based on #34778 + #29256 + #33847.** The non-base commits are:\n\n- [`775344b1f0d` refactor: Pass Logger instances to kernel objects](https://github.com/bitcoin/bitcoin/pull/30342/commits/775344b1f0d10912041752c03ef6cb88d4162e26)\n- [`6106a57a2fa` logging: Add LOG_REQUIRE_CONTEXT option](https://github.com/bitcoin/bitcoin/pull/30342/commits/6106a57a2fac578962534ac0d2a7ebd03a3ca44b)\n- [`6c1f3aedd01` refactor: Log kernel output to local log instances](https://github.com/bitcoin/bitcoin/pull/30342/commits/6c1f3aedd014ca480aca0a11b9179429182fe823)\n- [`dbe85f39723` kernel: Drop global Logger instance](https://github.com/bitcoin/bitcoin/pull/30342/commits/dbe85f39723568b54b02ee9fbce8585a865a6e11)",
 "commits": [
  {
   "sha": "963ed23bc8c466188c2be7553ae383cf182c24b4",
   "date": "2026-05-26T12:39:03Z",
   "message": "log test: verify log argument evaluation semantics\n\nTest that LogInfo/LogWarning/LogError always evaluate their arguments\neven when logging is disabled.\n\najtowns pointed out this behavior was important and could affect non-logging\ncode if changed in\nhttps://github.com/bitcoin/bitcoin/pull/34374#discussion_r2734793117\n\nCo-authored-by: l0rinc <pap.lorinc@gmail.com>"
  },
  {
   "sha": "3ea9b7cb10f0667d7fd1d2e8b4e25e8aea9932b3",
   "date": "2026-05-26T12:39:03Z",
   "message": "log test: add some test coverage on LogAcceptCategory\n\nCo-authored-by: Ryan Ofsky <ryan@ofsky.org>"
  },
  {
   "sha": "9c509ca53c0185a8f5b96c2a5aa3a5b7d73045a7",
   "date": "2026-05-26T12:39:03Z",
   "message": "log test: Add test for all accepted logging arguments\n\nAdd new logging test to call macros with all allowed combinations of macro\narguments.\n\nThe new test replaces a less comprehensive test that doesn't cover log\nstatements without format arguments. It's also moved to the top of the test\nsuite because it's a good illustration of what typical log prints look like,\nwhat logging calls are allowed and disallowed, and what the resulting log\noutput looks like."
  },
  {
   "sha": "98f3bd6242d999191f442271a77eb8cac7949ca1",
   "date": "2026-05-26T12:39:03Z",
   "message": "log refactor: Ensure categories are not logged at info and higher levels\n\nPreviously this used to be possible through the LogPrintLevel call but now that\ncall is removed, this change is just an internal refactoring and has no visible\neffect except in tests."
  },
  {
   "sha": "31f9929f3dea586104c0c11d7533385e139bdbdf",
   "date": "2026-05-26T12:39:03Z",
   "message": "log refactor: log macro rewrite\n\nRewrite log macros to fix a number of issues: unnecessary strprintf\ncalls during fuzzing, confusing error messages when macros are called\nwith the wrong arguments, duplicated code with unexplained differences\nand undocumented assumptions.\n\nSince this is a rewrite, reading the new code in log.h first should be clearer\nthan starting from the diff.\n\nSpecific benefits of the new implementation are:\n\n- Functionality is implemented once in a single `LOG_EMIT` macro instead of\n  multiple times in different macros with diverging code paths and unexplained\n  differences.\n\n- Unnecessary `strprintf` calls are now skipped when logging is disabled (in\n  bitcoind when `-noprinttoconsole -nodebuglogfile` options are used, and in\n  tests and kernel applications when DisableLogging is called). This change\n  should not affect bitcoind noticeably, but could speed up fuzz tests calling\n  functions which log.\n\n- Clearer error messages: If you pass a category to a macro which does not\n  accept it, or forget to pass a category to a macro which requires it, you\n  will see a direct message telling you to add or remove the category instead\n  of expanded macro syntax errors.\n\n- Previously it was possible to call `detail_LogWithSrcLoc` with\n  inconsistent or invalid arguments, for example bypassing ratelimiting\n  without it being explicit. New `LOG_EMIT` macro is compile-time safe\n  and enforces the exact same restrictions as other macros.\n\n- Previously \"always evaluate arguments\" behavior at Info and higher levels\n  looked accidental and was undocumented\n  (https://github.com/bitcoin/bitcoin/pull/34374#discussion_r2734793117). Now\n  the behavior is documented and explicit.\n\n- `NO_RATE_LIMIT` special case used to bypass rate limiting is dropped.\n  The `LOG_EMIT` macro can control rate limiting (and other options if\n  they are added in the future) while still using the same ratelimiting\n  defaults as other macros.\n\nCo-Authored-By: Hodlinator <172445034+hodlinator@users.noreply.github.com>\nCo-Authored-By: stickies-v <stickies-v@protonmail.com>"
  },
  {
   "sha": "f0929e1b781af5012d835f78a8b54054fb5cb21e",
   "date": "2026-05-26T12:39:03Z",
   "message": "log refactor: Drop Entry::should_ratelimit field\n\nDrop Entry::should_ratelimit field in favor of Options::ratelimit field.\n\nDropping the Entry::should_ratelimit field makes buffered log messages\nin m_msgs_before_open smaller, and avoids potential confusion because\nthe field is stored after rate limiting has been applied, so just gets\nignored. Conceptually it also makes sense to treat the ratelimit option\nas an input to the logger rather than as an attribute of the message\nbeing logged."
  },
  {
   "sha": "1ac1be8b159198d779bb0a37c4fbbbe5b5070ffb",
   "date": "2026-05-26T12:39:03Z",
   "message": "Merge branch 'pr/relog' into pr/bclog"
  },
  {
   "sha": "aa37de26b0f31d1d731fc3a3fe20ca9d99f69062",
   "date": "2026-05-26T12:39:03Z",
   "message": "log refactor: Allow log macros to accept context arguments\n\nAllow LogDebug(), LogTrace(), LogInfo(), LogWarning(), and LogError() macros to\naccept context arguments to provide more information in log messages and more\ncontrol over logging to callers.\n\nThis functionality is used in followup PRs:\n\n- https://github.com/bitcoin/bitcoin/pull/30342 - To let libbitcoinkernel send\n  output to specfic `BCLog::Logger` instances instead of a global instance, so\n  output can be disambiguated and applications can have more control over\n  logging.\n\n- https://github.com/bitcoin/bitcoin/pull/30343 - To replace custom\n  `WalletLogPrintf` calls with standard logging calls that automatically include\n  wallet names and don't log everything at info level.\n\nThis commit does not change behavior of current log prints or require them to\nbe updated. It includes tests and documentation covering the new functionality.\n\nCo-Authored-By: Hodlinator <172445034+hodlinator@users.noreply.github.com>\nCo-Authored-By: stickies-v <stickies-v@protonmail.com>"
  },
  {
   "sha": "1eedcb9db5156d36916ce4ccac49096a61d9c186",
   "date": "2026-05-26T12:39:03Z",
   "message": "doc: Add documentation about log levels and macros"
  },
  {
   "sha": "b5d3925d27468ff4d5d2e6be7e9ec0c7f8c3a05e",
   "date": "2026-05-26T12:39:03Z",
   "message": "log refactor: Add support for custom log contexts\n\nCustom log contexts allow overridding log formatting and adding metadata, such\nas request ids or wallet names to log messages, while still using standard\nmacros for logging. This is used to replace WalletLogPrintf() functions with\nLogInfo() calls in followup PR #30343."
  },
  {
   "sha": "e06a5c873721fc4c58395dec271c89e4a9add2eb",
   "date": "2026-07-13T20:29:09Z",
   "message": "kernel: Simplify logging API\n\nCurrent kernel logging API is too complicated and too restrictive. This PR\ntries to improves it.\n\nI'd expect an API that supported logging to allow creating log streams with\ndifferent options and providing some way to specify which library operations\nshould be logged to which streams.\n\nBy contrast, the current API allows creating multiple log streams, but all the\nstreams receive the same messages because options can only be set globally and\nthe stream objects can't be passed to any kernel API functions. They are not\neven referenced by the `btck_Context` struct which holds other shared state. If\nno log streams are created, log messages are generated anyway, but they are\nstored in a 1MB buffer and not sent anywhere, unless a log stream is created\nlater, at which point they are sent in bulk to that stream. More log streams\ncan be created after that, but they only receive new messages, not the buffered\nones. If log output is not needed, a btck_logging_disable() call is required to\nprevent log messages from accumulating in the 1MB buffer. Calling this will\nabort the program if any log streams were created before it was called, and\nalso abort the program if any new log streams are created later.\n\nNone of these behaviors seem necessary or ideal, and it would be better to\nprovide a simpler logging API that allows creating a log stream, setting\noptions on it, registering it with the `btck_Context` instance and receiving\nlog messages from it. Another advantage of this approach is that it could allow\n(with #30342) different log streams to be used for different purposes, which\nwould be not be possible with the current interface."
  },
  {
   "sha": "64263dadb637fec000c2626927ca858ce11849dd",
   "date": "2026-08-19T14:02:58Z",
   "message": "Merge branch 'pr/bclog' into pr/gklog"
  },
  {
   "sha": "0fd2affdf148d4755a205bd84f24ff1f99747f4b",
   "date": "2026-08-19T14:02:58Z",
   "message": "Merge branch 'pr/klog' into pr/gklog"
  },
  {
   "sha": "775344b1f0d10912041752c03ef6cb88d4162e26",
   "date": "2026-08-19T14:02:58Z",
   "message": "refactor: Pass Logger instances to kernel objects\n\nPass Logger instances to BlockManager, CCoinsViewDB, CDBWrapper,\nChainstateManager, and CoinsViews instances so libbitcoinkernel applications\nand test code have the option to control where log output goes instead of\nhaving all output sent to the global logger.\n\nThis commit just passes the logger objects without using them. The next commit\nupdates log print statements to use the new objects."
  },
  {
   "sha": "6106a57a2fac578962534ac0d2a7ebd03a3ca44b",
   "date": "2026-08-19T14:02:58Z",
   "message": "logging: Add LOG_REQUIRE_CONTEXT option\n\nAdd option to require context objects to be passed to log macros in a file or\nblock of code, so new logging calls can't forget to specify them and\naccidentally log to the global logging stream."
  },
  {
   "sha": "6c1f3aedd014ca480aca0a11b9179429182fe823",
   "date": "2026-08-19T14:02:58Z",
   "message": "refactor: Log kernel output to local log instances\n\nThis is a mechanical change updating kernel code that currently uses the global\nlog instance to log to local instances instead."
  },
  {
   "sha": "dbe85f39723568b54b02ee9fbce8585a865a6e11",
   "date": "2026-08-19T14:02:58Z",
   "message": "kernel: Drop global Logger instance\n\nChange LogInstance() function to no longer allocate (and leak) a BCLog::Logger\ninstance. Instead allow kernel applications to initialize their own logging\ninstances that can be returned by LogInstance().\n\nThe LogInstance() function is not actually used for the majority of logging in\nkernel code. Most kernel log output goes directly to BCLog::Logger instances\nspecified when kernel objects like ChainstateManager and CTxMemPool are\nconstructed, which allows applications to create multiple Logger instances and\ncontrol which log output is sent to them.\n\nThe only kernel code that does rely on LogInstance() is certain low level code in\nthe util library, like the RNG seeder, that is not passed a specific instance\nand needs to rely on the global LogInstance() function.\n\nOther code outside the kernel library uses LogInstance() heavily, and may\ncontinue to do so. bitcoind and test code now just create a log instance before\nthe first LogInstance() call, which it returns, so all behavior is the same as\nbefore."
  },
  {
   "sha": "687074dd2e99b4669efc821f8d8141ba6a708fe0",
   "date": "2026-08-19T14:02:58Z",
   "message": "test-each-commit: Increase fetch depth\n\nNeeded due to base PR, can be dropped before merge"
  }
 ],
 "timeline": [
  {
   "t": "2024-06-26T20:21:37Z",
   "kind": "comment",
   "who": "sedited",
   "assoc": "MEMBER",
   "text": "Concept ACK."
  },
  {
   "t": "2024-06-26T22:34:56Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "db1b9f7696af80036de739408cd9eae5d06481ec"
  },
  {
   "t": "2024-06-26T22:36:55Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Updated 45423355735770f01d2bac738cc8b0b41415e921 -> db1b9f7696af80036de739408cd9eae5d06481ec ([`pr/gklog.1`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.1) -> [`pr/gklog.2`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.2), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.1..pr/gklog.2)) moving code to an earlier commit to fix a \"test-each-commit\" test failure https://github.com/bitcoin/bitcoin/actions/runs/9684398780/job/26722073921?pr=30342, and cleaning up code to fix a clang-tidy warning https://cirrus-ci.com/task/5893151045451776"
  },
  {
   "t": "2024-07-09T22:21:25Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "42d0e06d1a4343c2bf3257f26cf18b79072c6b0d"
  },
  {
   "t": "2024-07-09T22:23:36Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Rebased db1b9f7696af80036de739408cd9eae5d06481ec -> 42d0e06d1a4343c2bf3257f26cf18b79072c6b0d ([`pr/gklog.2`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.2) -> [`pr/gklog.3`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.3), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.2-rebase..pr/gklog.3)) to fix conflict with #30141. Also added a commit to let kernel applications direct low-level util output to custom log instances.\nUpdated 42d0e06d1a4343c2bf3257f26cf18b79072c6b0d -> fcaed3faf0f12b3b322e65df1e81d455bbee7db5 ([`pr/gklog.3`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.3) -> [`pr/gklog.4`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.4), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.3..pr/gklog.4)) to fix CI errors\nUpdated fcaed3faf0f12b3b322e65df1e81d455bbee7db5 -> f005677f762754ae09417c2a418e27d28ef3c7e1 ([`pr/gklog.4`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.4) -> [`pr/gklog.5`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.5), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.4..pr/gklog.5)) to fix more CI errors\nRebased f005677f762754ae09417c2a418e27d28ef3c7e1 -> dcd055ecf9c20b84930c2ce45d922427cf0112ea ([`pr/gklog.5`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.5) -> [`pr/gklog.6`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.6), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.5-rebase..pr/gklog.6)) due to conflicts with #30425 and #30407\nRebased dcd055ecf9c20b84930c2ce45d922427cf0112ea -> 53d7933727ebe0670dceb88ec9f1020bd7b0b280 ([`pr/gklog.6`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.6) -> [`pr/gklog.7`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.7), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.6-rebase..pr/gklog.7)) due to conflict with #28052\nRebased 53d7933727ebe0670dceb88ec9f1020bd7b0b280 -> 10c275342dca365a6678da5fc016ca9d46d9dfca ([`pr/gklog.7`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.7) -> [`pr/gklog.8`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.8), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.7-rebase..pr/gklog.8)) due to conflict with #30485\nRebased 10c275342dca365a6678da5fc016ca9d46d9dfca -> 493dd26b75d0e35422b3230be3c72a0f96eb5e8a ([`pr/gklog.8`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.8) -> [`pr/gklog.9`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.9), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.8-rebase..pr/gklog.9)) due to various conflicts\nRebased 493dd26b75d0e35422b3230be3c72a0f96eb5e8a -> e971028fa5e570acf585073494acd65f4831ab1c ([`pr/gklog.9`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.9) -> [`pr/gklog.10`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.10), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.9-rebase..pr/gklog.10)) due to conflicts with #31393, #31490, #30965\n\nRebased e971028fa5e570acf585073494acd65f4831ab1c -> 282db88a9b1789f0d78928c87c7204402ac11ac3 ([`pr/gklog.10`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.10) -> [`pr/gklog.11`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.11), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.10-rebase..pr/gklog.11))\n\nRebased 282db88a9b1789f0d78928c87c7204402ac11ac3 -> ec6d771d3b34ec979e373f025c4f064ae44df860 ([`pr/gklog.11`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.11) -> [`pr/gklog.12`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.12), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.11-rebase..pr/gklog.12))\n\nRebased ec6d771d3b34ec979e373f025c4f064ae44df860 -> b1b72969c9764636721a7518a2f4453d0eb3845d ([`pr/gklog.12`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.12) -> [`pr/gklog.13`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.13), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.12-rebase..pr/gklog.13))\n\nRebased b1b72969c9764636721a7518a2f4453d0eb3845d -> d0e2944bb18e44c599312b980900c324ae698464 ([`pr/gklog.13`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.13) -> [`pr/gklog.14`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.14), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.13-rebase..pr/gklog.14)) on updated base PR to fix CI errors (https://github.com/bitcoin/bitcoin/actions/runs/18514131135?pr=30342)\n\nRebased d0e2944bb18e44c599312b980900c324ae698464 -> 8482a49ab89012c3cd99acd43e1f698311426c3a ([`pr/gklog.14`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.14) -> [`pr/gklog.15`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.15), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.14-rebase..pr/gklog.15))\n\nRebased 8482a49ab89012c3cd99acd43e1f698311426c3a -> baaaa41b93cba064d12d641899968ee897eb0671 ([`pr/gklog.15`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.15) -> [`pr/gklog.16`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.16), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.15-rebase..pr/gklog.16)) to fix fuzz test errors https://github.com/bitcoin/bitcoin/actions/runs/19249628369/job/55031630303?pr=30342, also making updates to bitcoinkernel.h documentation\n\nRebased baaaa41b93cba064d12d641899968ee897eb0671 -> b9dc75a2b5d6bfadce65cd2837a3042c888a8afd ([`pr/gklog.16`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.16) -> [`pr/gklog.17`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.17), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.16-rebase..pr/gklog.17))\n\nRebased b9dc75a2b5d6bfadce65cd2837a3042c888a8afd -> 97be3ef0b6239a9e674be3d8c70f99ec5fe5b8eb ([`pr/gklog.17`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.17) -> [`pr/gklog.18`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.18), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.17-rebase..pr/gklog.18))\n\nRebased 97be3ef0b6239a9e674be3d8c70f99ec5fe5b8eb -> db29e8fb43fa8011eb5c68f376ea74b4f087deda ([`pr/gklog.18`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.18) -> [`pr/gklog.19`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.19), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.18-rebase..pr/gklog.19)) on top of #29256 pr/bclog.34 and #33847 pr/klog.4\n\nUpdated db29e8fb43fa8011eb5c68f376ea74b4f087deda -> d6c23d4219b30dc8e045f4c6b90a7ad493faf383 ([`pr/gklog.19`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.19) -> [`pr/gklog.20`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.20), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.19..pr/gklog.20)) to fix kernel test MSAN error https://github.com/bitcoin/bitcoin/actions/runs/21115418786/job/60720235987?pr=30342\n\nRebased d6c23d4219b30dc8e045f4c6b90a7ad493faf383 -> 75e1e958f5e8a27491723aa88c69bf3cd8de7509 ([`pr/gklog.20`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.20) -> [`pr/gklog.21`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.21), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.20-rebase..pr/gklog.21)) on top of #29256 pr/bclog.34 and #33847 pr/klog.5\n\nRebased 75e1e958f5e8a27491723aa88c69bf3cd8de7509 -> cc0cfe20c8ac56ffe3a47d9ee3f109fdf0c09c36 ([`pr/gklog.21`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.21) -> [`pr/gklog.22`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.22), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.21-rebase..pr/gklog.22)) due to conflicts with #34253 and #33680\n\nUpdated cc0cfe20c8ac56ffe3a47d9ee3f109fdf0c09c36 -> c2e3362b0050483e5a95c9aaccb9d3afe6328c1e ([`pr/gklog.22`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.22) -> [`pr/gklog.23`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.23), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.22..pr/gklog.23)) to fix CI errors https://github.com/bitcoin/bitcoin/actions/runs/21643951237\n\nUpdated c2e3362b0050483e5a95c9aaccb9d3afe6328c1e -> 7b78335f66b08d039f20dc31fb326883ab5ad3c8 ([`pr/gklog.23`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.23) -> [`pr/gklog.24`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.24), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.23..pr/gklog.24)) to fix CI errors https://github.com/bitcoin/bitcoin/actions/runs/21645374775\n\nRebased 7b78335f66b08d039f20dc31fb326883ab5ad3c8 -> aa4d26979f0b1c24adeeec489b36180c87ca484c ([`pr/gklog.24`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.24) -> [`pr/gklog.25`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.25), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.24-rebase..pr/gklog.25)) on top of #29256 pr/bclog.36 and #33847 pr/klog.5\n\nUpdated aa4d26979f0b1c24adeeec489b36180c87ca484c -> 5126eaf1e369f1579d2307125aa8383786f9b3f8 ([`pr/gklog.25`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.25) -> [`pr/gklog.26`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.26), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.25..pr/gklog.26)) to fix IWYU and each-commit errors https://github.com/bitcoin/bitcoin/actions/runs/21830259022/job/62995439943?pr=30342\n\nUpdated 5126eaf1e369f1579d2307125aa8383786f9b3f8 -> eeb84002a84226614e5d3acb9013c15ba5ce71ff ([`pr/gklog.26`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.26) -> [`pr/gklog.27`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.27), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.26..pr/gklog.27)) to fix IWYU errors https://github.com/bitcoin/bitcoin/actions/runs/21833389551/job/62998114427?pr=30342\n\nRebased eeb84002a84226614e5d3acb9013c15ba5ce71ff -> d137676ffd09da75f0418f7787fab8e249824e6f ([`pr/gklog.27`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.27) -> [`pr/gklog.28`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.28), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.27-rebase..pr/gklog.28)) to fix conflicts with #32950, #34165, #33512 on top of #29256 pr/bclog.37\n\nUpdated d137676ffd09da75f0418f7787fab8e249824e6f -> ea7842f5b68c2986982c31f2482d47d2bc89c382 ([`pr/gklog.28`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.28) -> [`pr/gklog.29`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.29), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.28..pr/gklog.29)) to fix silent conflicts with threadpool tests #34562 causing windows build errors and fuzz test failures in ci https://github.com/bitcoin/bitcoin/actions/runs/22559603524/job/65396727322?pr=30342\n\nUpdated ea7842f5b68c2986982c31f2482d47d2bc89c382 -> b6b95a62447c589a0078474fb8f6bc4b2e7e8a51 ([`pr/gklog.29`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.29) -> [`pr/gklog.30`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.30), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.29..pr/gklog.30)) to fix threadpool fuzz test cleanup https://github.com/bitcoin/bitcoin/actions/runs/22584916974/job/65427016231?pr=30342\n\nRebased b6b95a62447c589a0078474fb8f6bc4b2e7e8a51 -> f048e807c6b4327474466c749fe48cb43dd651a0 ([`pr/gklog.30`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.30) -> [`pr/gklog.31`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.31), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.30-rebase..pr/gklog.31)) on top of #29256 pr/bclog.39\n\nUpdated f048e807c6b4327474466c749fe48cb43dd651a0 -> 71e2a726cb812f40869c8e9dd09257ffbdb4ab05 ([`pr/gklog.31`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.31) -> [`pr/gklog.32`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.32), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.31..pr/gklog.32)) to fix IWYU error in `index/base.cpp` https://github.com/bitcoin/bitcoin/actions/runs/22861803182/job/66317637780?pr=30342. Not really sure the IWYU error makes sense but implemented the suggestion\n\nRebased 71e2a726cb812f40869c8e9dd09257ffbdb4ab05 -> 74c694e7a55ed3d77bd70eef3b66fed7c5edb222 ([`pr/gklog.32`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.32) -> [`pr/gklog.33`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.33), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.32-rebase..pr/gklog.33)) on top of #29256 pr/bclog.40\n\nSquashed 74c694e7a55ed3d77bd70eef3b66fed7c5edb222 -> f3a87a203f8c6916786916200368701132f419d1 ([`pr/gklog.33`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.33) -> [`pr/gklog.34`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.34), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.33..pr/gklog.34)) to fix compile error in internal commit https://github.com/bitcoin/bitcoin/actions/runs/23868674296/job/69594579042?pr=30342\n\nRebased f3a87a203f8c6916786916200368701132f419d1 -> 41fb7ccf129bee40b19e5968a7ee8b39c6893544 ([`pr/gklog.34`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.34) -> [`pr/gklog.35`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.35), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.34-rebase..pr/gklog.35)) on top of #29256 pr/bclog.41\n\nUpdated 41fb7ccf129bee40b19e5968a7ee8b39c6893544 -> 6e7439bf9c5d0db4332ad71949ffad5cf0c91329 ([`pr/gklog.35`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.35) -> [`pr/gklog.36`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.36), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.35..pr/gklog.36)) to fix ci error https://github.com/bitcoin/bitcoin/actions/runs/25750656813/job/75625762044 to fix test errors in test_kernel from a missing logger in  btck_check_block_context_free in certain test orders\n\nRebased 6e7439bf9c5d0db4332ad71949ffad5cf0c91329 -> eeaa0f75f4fdb23b26cb0218c5b85d0c6203f978 ([`pr/gklog.36`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.36) -> [`pr/gklog.37`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.37), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.36-rebase..pr/gklog.37)) on top of #29256 pr/bclog.42\n\nUpdated eeaa0f75f4fdb23b26cb0218c5b85d0c6203f978 -> 8ae06e76b2daacec338a590c5c9cf5216ca0d7df ([`pr/gklog.37`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.37) -> [`pr/gklog.38`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.38), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.37..pr/gklog.38)) to fix CI: iwyu in sigcache.h, duplicate include in bitcoind.cpp, fuzzer null g_setup in dbwrapper.cpp https://github.com/bitcoin/bitcoin/actions/runs/26643336975/job/78525287457\n\nRebased 8ae06e76b2daacec338a590c5c9cf5216ca0d7df -> d70eae19a8b6024723f33f29907a3afc1a0a9ca1 ([`pr/gklog.38`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.38) -> [`pr/gklog.39`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.39), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.38-rebase..pr/gklog.39)) on top of #29256 pr/bclog.42 and #33847 pr/klog.5 due to conflicts with #34806, #34865, #34866, and #34887\n\nRebased d70eae19a8b6024723f33f29907a3afc1a0a9ca1 -> b3a16a1ce6af8d32f628c9e95d1a2520e6fc34f0 ([`pr/gklog.39`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.39) -> [`pr/gklog.40`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.40), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.39-rebase..pr/gklog.40)) on top of #29256 pr/bclog.42 and #33847 pr/klog.5 due to conflicts with #35465 and #35521\n\nSquashed b3a16a1ce6af8d32f628c9e95d1a2520e6fc34f0 -> 459562de2121f94d55d0a6bfe86ed11a6c2b59af ([`pr/gklog.40`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.40) -> [`pr/gklog.41`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.41), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.40..pr/gklog.41)) to fix test ancestor commits: pass m_logger to CCoinsViewDB in coins_db_leveldb_layout test https://github.com/bitcoin/bitcoin/actions/runs/28108478624/job/83229088477; and to fix fuzzer crash: stop dbwrapper_concurrent_reads thread pool before logger is destroyed https://github.com/bitcoin/bitcoin/actions/runs/28108478624/job/83229088738\n\nRebased 459562de212c27108832bb4d2822d7eda9a8b98e -> 2e611706fce63745a9bf08db4e4ca1631279e00e ([`pr/gklog.41`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.41) -> [`pr/gklog.42`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.42), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.41-rebase..pr/gklog.42)) due to conflicts with #35568 and #35295\n\nUpdated 2e611706fce63745a9bf08db4e4ca1631279e00e -> 372179265729d0b0418bb9ec4dd6b05e812ebc0e ([`pr/gklog.42`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.42) -> [`pr/gklog.43`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.43), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.42..pr/gklog.43)) to fix CI: duplicate BOOST_FIXTURE_TEST_SUITE in coinsviewoverlay_tests.cpp broke cmake configure https://github.com/bitcoin/bitcoin/actions/runs/29337611210/job/87100747364; and missing log context in CoinsViews::InitCache triggered LOG_REQUIRE_CONTEXT assertion in MSVC fuzz build https://github.com/bitcoin/bitcoin/actions/runs/29337611210/job/87100747283\n\nUpdated 372179265729d0b0418bb9ec4dd6b05e812ebc0e -> 532547978dac2d144fb92019b8b2007abb0e95ed ([`pr/gklog.43`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.43) -> [`pr/gklog.44`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.44), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.43..pr/gklog.44)) to fix CI compile errors caused by silent conflicts with #35295 https://github.com/bitcoin/bitcoin/actions/runs/29343064668/job/87119598397\n\nUpdated 532547978dac2d144fb92019b8b2007abb0e95ed -> 9884477bcdc8abce1b640c66615c0ae44e0f9400 ([`pr/gklog.44`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.44) -> [`pr/gklog.45`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.45), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.44..pr/gklog.45)) to fix CI: stop thread pool in coins_view fuzz targets before logger destroyed (https://github.com/bitcoin/bitcoin/actions/runs/29347701435/job/87135632047); store util::log::Context by value in CBitcoinLevelDBLogger to fix dangling ref SIGSEGV in feature_init.py (https://github.com/bitcoin/bitcoin/actions/runs/29347701435/job/87135631969)\n\nUpdated 9884477bcdc8abce1b640c66615c0ae44e0f9400 -> aa9bf0282d833956a41758a474282a1f765530a5 ([`pr/gklog.45`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.45) -> [`pr/gklog.46`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.46), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.45..pr/gklog.46)) to fix CI: thread-safety analysis missing EXCLUSIVE_LOCKS_REQUIRED(!g_thread_pool_mutex) annotation in cleanup_coins_view() https://github.com/bitcoin/bitcoin/actions/runs/29352995762/job/87153614524\n\nUpdated aa9bf0282d833956a41758a474282a1f765530a5 -> d62ba526841ccb30912fe7ca7eac6265fd1cba43 ([`pr/gklog.46`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.46) -> [`pr/gklog.47`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.47), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.46..pr/gklog.47)) to fix fuzzer crash: stop coinscache_sim thread pool before logger is destroyed https://github.com/bitcoin/bitcoin/actions/runs/29355819465/job/87163129249\n\nRebased d62ba526841ccb30912fe7ca7eac6265fd1cba43 -> 9cf188afa4742a181f5ac6a892a47e8be66ddc42 ([`pr/gklog.47`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.47) -> [`pr/gklog.48`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.48), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.47-rebase..pr/gklog.48)) due to conflict with #35723\n\nUpdated 9cf188afa4742a181f5ac6a892a47e8be66ddc42 -> 846df5f6f474f727f13075ede6e4ce385e5e0bea ([`pr/gklog.48`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.48) -> [`pr/gklog.49`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.49), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.48..pr/gklog.49)) to fix CI: undeclared g_thread_pool_mutex in cleanup functions (silent conflict with #35723 in push-48 rebase) https://github.com/bitcoin/bitcoin/actions/runs/29372633900/job/87219192227\n\nRebased 846df5f6f474f727f13075ede6e4ce385e5e0bea -> 84748bd36dff8cb77154623eac4c3f3647720072 ([`pr/gklog.49`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.49) -> [`pr/gklog.50`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.50), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.49-rebase..pr/gklog.50)) due to conflict with #35496\n\nRebased 84748bd36dff8cb77154623eac4c3f3647720072 -> dbe85f39723568b54b02ee9fbce8585a865a6e11 ([`pr/gklog.50`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.50) -> [`pr/gklog.51`](https://github.com/ryanofsky/bitcoin/commits/pr/gklog.51), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/gklog.50-rebase..pr/gklog.51)) due to conflicts with #35965"
  },
  {
   "t": "2024-07-10T18:04:13Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "fcaed3faf0f12b3b322e65df1e81d455bbee7db5"
  },
  {
   "t": "2024-07-10T18:22:22Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f005677f762754ae09417c2a418e27d28ef3c7e1"
  },
  {
   "t": "2024-07-18T00:15:59Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "dcd055ecf9c20b84930c2ce45d922427cf0112ea"
  },
  {
   "t": "2024-08-07T02:03:41Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "53d7933727ebe0670dceb88ec9f1020bd7b0b280"
  },
  {
   "t": "2024-08-07T02:24:05Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "10c275342dca365a6678da5fc016ca9d46d9dfca"
  },
  {
   "t": "2024-12-09T20:42:17Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "493dd26b75d0e35422b3230be3c72a0f96eb5e8a"
  },
  {
   "t": "2025-03-12T14:01:46Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "e971028fa5e570acf585073494acd65f4831ab1c"
  },
  {
   "t": "2025-04-03T17:32:33Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "282db88a9b1789f0d78928c87c7204402ac11ac3"
  },
  {
   "t": "2025-04-04T03:37:53Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "ec6d771d3b34ec979e373f025c4f064ae44df860"
  },
  {
   "t": "2025-10-15T00:42:18Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "b1b72969c9764636721a7518a2f4453d0eb3845d"
  },
  {
   "t": "2025-10-16T14:46:32Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "d0e2944bb18e44c599312b980900c324ae698464"
  },
  {
   "t": "2025-11-10T23:35:10Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "8482a49ab89012c3cd99acd43e1f698311426c3a"
  },
  {
   "t": "2025-11-11T14:25:26Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "baaaa41b93cba064d12d641899968ee897eb0671"
  },
  {
   "t": "2025-12-12T12:19:44Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "b9dc75a2b5d6bfadce65cd2837a3042c888a8afd"
  },
  {
   "t": "2025-12-16T02:10:54Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "97be3ef0b6239a9e674be3d8c70f99ec5fe5b8eb"
  },
  {
   "t": "2026-01-18T17:04:23Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "db29e8fb43fa8011eb5c68f376ea74b4f087deda"
  },
  {
   "t": "2026-01-18T19:52:08Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "d6c23d4219b30dc8e045f4c6b90a7ad493faf383"
  },
  {
   "t": "2026-01-22T22:38:34Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "e284a60131f8933beea468f9390f8067c8f24b12"
  },
  {
   "t": "2026-02-03T19:10:09Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "c6ba50e3e9c148986097792122931431a8d6a00e"
  },
  {
   "t": "2026-02-03T19:52:48Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "8c54eb8d1c9488a8934d874125148a64a8d10ff6"
  },
  {
   "t": "2026-02-03T20:55:52Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "c9e6477ea1c20ce7b1f3ec5d252d8a5ac07f51a9"
  },
  {
   "t": "2026-02-09T15:03:26Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "aa4d26979f0b1c24adeeec489b36180c87ca484c"
  },
  {
   "t": "2026-02-09T16:48:26Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "82b4b08362dbff4d06d5548ab16ea15671d6554d"
  },
  {
   "t": "2026-02-09T18:15:46Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "8bafdfed01810a47c5659ae939b94f34f3164bf6"
  },
  {
   "t": "2026-03-02T02:42:00Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "d137676ffd09da75f0418f7787fab8e249824e6f"
  },
  {
   "t": "2026-03-02T16:18:30Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "ea7842f5b68c2986982c31f2482d47d2bc89c382"
  },
  {
   "t": "2026-03-03T13:07:23Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "b6b95a62447c589a0078474fb8f6bc4b2e7e8a51"
  },
  {
   "t": "2026-03-06T00:58:04Z",
   "kind": "review",
   "who": "stickies-v",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "8aa9b81fa4afb8924ddd9ee55d1909e93e518538",
   "text": "I've finally started reviewing this PR in more detail, after my recent related work on kernel logging. I'm currently leaning Concept ACK, Approach NACK.\n\nConcept ACK because:\n- a large part of the bitcoinkernel interface is contextualized, e.g. `btck_ChainstateManager` is initialized with a `btck_Context`, so having contextualized logging seems like a natural fit\n- bitcoinkernel is a library, we should be minimally opinionated on how it's used, so long as it's safe. If users have good use cases for e.g. multiple `ChainstateManager`'s, being able to separate log streams would be good\n\nApproach NACK because I think the below downsides are bigger than the above upsides:\n- logging interface becomes more cumbersome, i.e. caller has to figure out if a logger is in scope and if it should be used. It is easy to misuse (e.g. forget to log to context when it exists, which seems hard to enforce.)\n- non-trivial code change / review cost, lots of merge conflicts, ...\n\nI think this change might become more desirable if/when we have more demand for this feature (i.e. more actual use cases for contextualized logging) or when it becomes a less invasive code change to do so (e.g. if/when kernel is a separate codebase, or when it becomes feasible to use an interface like `m_log.info(...)`).\n\nI've asked the kernel working group for use cases and motivations for contextualized logging, and so far I've not heard much (but I hope people will chime in here rather than me speaking on their behalf). If you have any, perhaps opening a tracking issue for that might be useful so we can better decide when this feature becomes worth it given the complexity? I'm definitely not against the idea itself, I just pragmatically think it's not worth the current cost."
  },
  {
   "t": "2026-03-06T15:39:12Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Thanks for the review!\n\n[quoted text omitted]\nI think it's straightforward to enforce if there are places where we want to require log contexts. For example if we want to enforce it in kernel files it could look like:\n\ndiff\n\n```diff\n--- a/src/util/log.h\n+++ b/src/util/log.h\n@@ -156,11 +156,19 @@ void Log(Level level, bool should_ratelimit, SourceLocation&& source_loc, Contex\n #define FirstArg_Impl(arg, ...) arg\n #define FirstArg_(args) FirstArg_Impl args\n\n+constexpr bool LOG_REQUIRE_CONTEXT = false;\n+\n+template <typename T>\n+concept LogContext = requires {\n+    requires std::remove_reference_t<T>::log_context;\n+};\n+\n //! Internal helper to conditionally log. Only evaluates arguments when needed.\n // Allow __func__ to be used in any context without warnings:\n // NOLINTBEGIN(bugprone-lambda-function-name)\n #define LogPrint_(level, should_ratelimit, take_category, ...)                                     \\\n     do {                                                                                           \\\n+        static_assert(!LOG_REQUIRE_CONTEXT || LogContext<decltype(FirstArg_((__VA_ARGS__)))>, \"Log call must pass a log context as first argument\"); \\\n         auto&& _context{util::log::detail::GetContext<take_category>(FirstArg_((__VA_ARGS__)))};   \\\n         if (util::log::ShouldLog(_context.logger, _context.category, (level))) {                   \\\n             util::log::detail::Log((level), (should_ratelimit), SourceLocation{__func__},          \\\n--- a/src/validation.cpp\n+++ b/src/validation.cpp\n@@ -76,6 +76,8 @@\n #include <tuple>\n #include <utility>\n\n+#define LOG_REQUIRE_CONTEXT true\n+\n using kernel::CCoinsStats;\n using kernel::ChainstateRole;\n using kernel::CoinStatsHashType;\n```\n\nAlso note that without enforcement, the consequence of a missing context argument is just the log message going to the global logging stream, which already happens now.\n\n[quoted text omitted]\nI'd be interested to know more about what part of the code change seem difficult to review. The main change is adding a new parameter to a bunch of functions, which seems like the archetype of a change that is trivial to verify. I guess there are a lot of test updates too. Anyway, would like to know more about what specific difficulties you see here."
  },
  {
   "t": "2026-03-08T06:03:42Z",
   "kind": "comment",
   "who": "stickies-v",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nNice, I hadn't thought of a per-file approach, that seems elegant.\n\n[quoted text omitted]\nI don't think (and didn't say) that this PR is difficult to review. But I think \"non-trivial code change / review cost, lots of merge conflicts, ...\" is a reasonable statement for a cumulative diff of this size and 26 PR merge conflicts.\n\nNote: I do think this is an elegant implementation, and I am not necessarily opposed to the changes, I think it would be nice if kernel eventually has contextualized logging. I just don't think it's currently important as it seems users (incl myself) don't actually need this. Just making kernel logging explicitly global (~which I planned to open a PR for earlier, but I've been focused on v31 review for the past weeks~ _opened #34775_) seems like the more pragmatic change to me now. It addresses the interface weirdness with a much smaller change, and keeps the logging interface simpler."
  },
  {
   "t": "2026-03-09T15:48:10Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f048e807c6b4327474466c749fe48cb43dd651a0"
  },
  {
   "t": "2026-03-09T19:02:17Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "71e2a726cb812f40869c8e9dd09257ffbdb4ab05"
  },
  {
   "t": "2026-04-01T20:13:06Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "74c694e7a55ed3d77bd70eef3b66fed7c5edb222"
  },
  {
   "t": "2026-04-01T20:56:43Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f3a87a203f8c6916786916200368701132f419d1"
  },
  {
   "t": "2026-05-12T17:21:23Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "41fb7ccf129bee40b19e5968a7ee8b39c6893544"
  },
  {
   "t": "2026-05-13T13:03:53Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6e7439bf9c5d0db4332ad71949ffad5cf0c91329"
  },
  {
   "t": "2026-05-29T14:33:17Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "eeaa0f75f4fdb23b26cb0218c5b85d0c6203f978"
  },
  {
   "t": "2026-06-01T23:12:59Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "9837bfbea7a29c5bc8576078613998386193e26e"
  },
  {
   "t": "2026-06-08T13:30:21Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "800d7ac20797cb5ea1274a06fb4c29595fd1e1ef"
  },
  {
   "t": "2026-06-24T15:07:09Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "2ade31b4c880806ad67967aa2f72e7ab0493b534"
  },
  {
   "t": "2026-06-24T19:58:22Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "837d1ec1702abd4539b6b1da6c3edd27d55cf683"
  },
  {
   "t": "2026-07-14T13:42:12Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "cb27fe01eac1b4fe127070556ae88b9e5b7a01c4"
  },
  {
   "t": "2026-07-14T14:55:59Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "b6c10b5b3d317a64e6a175e25b3e92e54988ff9b"
  },
  {
   "t": "2026-07-14T15:58:51Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "3c6f22155bef4311cfbd3a322b2ab8b75eebd271"
  },
  {
   "t": "2026-07-14T17:15:11Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6714b346a70d520d66bcecc34647bb8109209069"
  },
  {
   "t": "2026-07-14T17:56:06Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "62b789b47fbf8176dec04b9d8c365e9a8f6ee587"
  },
  {
   "t": "2026-07-14T18:38:42Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "188090e766b7c947580eb51fadfb339df070e4e3"
  },
  {
   "t": "2026-07-14T22:19:55Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "a9236a37f6d6b3654f4e2651d5df05b13708adb1"
  },
  {
   "t": "2026-07-14T22:57:06Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6105b072d2689df67d38bb9c80b04c173b05930f"
  },
  {
   "t": "2026-08-15T01:22:42Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "03e4b6aa42de585f4074ff80c8a5d522d7a4b83a"
  },
  {
   "t": "2026-08-20T00:04:48Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "687074dd2e99b4669efc821f8d8141ba6a708fe0"
  }
 ],
 "labels_log": [
  {
   "t": "2024-06-26T22:35:31Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-06-27T02:20:56Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-02T21:50:13Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-10T00:28:58Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-10T18:22:26Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-10T20:09:37Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-16T16:14:18Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-18T02:08:07Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-22T11:07:07Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-22T14:12:23Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-26T06:57:53Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-07T02:33:01Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-13T19:50:17Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-21T04:34:39Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-09T20:48:11Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-09T22:56:59Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-11T11:02:00Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-17T03:43:11Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-18T20:08:52Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-12T14:02:49Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-14T01:29:20Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-04-03T18:17:20Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-04-04T03:37:57Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-04-04T05:36:16Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-04-08T21:57:13Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-10-15T00:56:53Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-10-29T00:03:25Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-11T12:01:19Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-25T12:39:58Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-12T13:17:29Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-12T19:39:40Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-14T14:26:18Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-16T02:45:48Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-16T15:43:43Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-18T18:11:56Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-18T21:15:21Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-19T11:09:26Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-23T00:34:04Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-29T10:59:23Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-03T19:53:43Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-03T19:54:48Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-03T23:21:27Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-08T00:13:31Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-09T15:12:16Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-09T16:48:54Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-09T22:01:13Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-18T17:22:45Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-02T03:02:39Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-02T04:10:37Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-03T14:27:53Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-06T18:12:03Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-09T16:58:41Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-09T17:28:54Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-09T20:23:56Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-11T14:00:32Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-04-01T20:28:24Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-04-01T20:57:24Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-04-01T21:39:46Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-04-07T09:58:59Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-12T18:21:52Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-12T19:18:47Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-13T14:14:31Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-21T14:35:01Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-29T16:33:25Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-29T17:56:34Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-02T00:32:41Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-03T11:22:38Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-08T15:18:28Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-11T08:16:07Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-24T16:05:05Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-24T17:53:22Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-24T21:24:50Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-08T08:55:56Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-14T14:00:23Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-14T14:27:09Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-14T20:00:13Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-14T21:33:07Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-14T22:57:43Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-14T23:59:46Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-15T00:01:02Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-11T21:16:32Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-15T02:51:02Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-19T14:34:57Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-20T01:54:20Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-15T13:42:22Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [],
 "text_chars": 36702,
 "text_tokens_estimate": 9175,
 "changed_paths": [
  ".github/workflows/ci.yml",
  "doc/developer-notes.md",
  "src/bench/bench_bitcoin.cpp",
  "src/bitcoin-chainstate.cpp",
  "src/bitcoin-cli.cpp",
  "src/bitcoin-tx.cpp",
  "src/bitcoin-util.cpp",
  "src/bitcoin-wallet.cpp",
  "src/bitcoind.cpp",
  "src/blockencodings.cpp",
  "src/blockencodings.h",
  "src/dbwrapper.cpp",
  "src/dbwrapper.h",
  "src/index/base.cpp",
  "src/index/base.h",
  "src/init.cpp",
  "src/kernel/bitcoinkernel.cpp",
  "src/kernel/bitcoinkernel.h",
  "src/kernel/bitcoinkernel_wrapper.h",
  "src/kernel/mempool_options.h",
  "src/logging.cpp",
  "src/logging.h",
  "src/net_processing.cpp",
  "src/node/blockstorage.cpp",
  "src/node/blockstorage.h",
  "src/node/chainstate.cpp",
  "src/qt/bitcoin.cpp",
  "src/qt/test/test_main.cpp",
  "src/rpc/blockchain.cpp",
  "src/script/sigcache.cpp",
  "src/script/sigcache.h",
  "src/test/blockfilter_tests.cpp",
  "src/test/blockmanager_tests.cpp",
  "src/test/coins_tests.cpp",
  "src/test/coinsviewoverlay_tests.cpp",
  "src/test/dbwrapper_tests.cpp",
  "src/test/fuzz/block_index.cpp",
  "src/test/fuzz/coins_view.cpp",
  "src/test/fuzz/coinscache_sim.cpp",
  "src/test/fuzz/dbwrapper.cpp",
  "src/test/fuzz/fuzz.cpp",
  "src/test/fuzz/fuzz.h",
  "src/test/fuzz/mini_miner.cpp",
  "src/test/fuzz/partially_downloaded_block.cpp",
  "src/test/fuzz/script_sigcache.cpp",
  "src/test/fuzz/threadpool.cpp",
  "src/test/kernel/test_kernel.cpp",
  "src/test/logging_tests.cpp",
  "src/test/miner_tests.cpp",
  "src/test/reverselock_tests.cpp",
  "src/test/scheduler_tests.cpp",
  "src/test/script_assets_tests.cpp",
  "src/test/script_p2sh_tests.cpp",
  "src/test/sync_tests.cpp",
  "src/test/threadpool_tests.cpp",
  "src/test/transaction_tests.cpp",
  "src/test/txindex_tests.cpp",
  "src/test/util/setup_common.cpp",
  "src/test/util/setup_common.h",
  "src/test/validation_chainstatemanager_tests.cpp",
  "src/test/validation_tests.cpp",
  "src/txdb.cpp",
  "src/txdb.h",
  "src/txmempool.cpp",
  "src/txmempool.h",
  "src/util/log.h",
  "src/validation.cpp",
  "src/validation.h",
  "src/wallet/test/fuzz/fees.cpp"
 ],
 "files": [
  {
   "path": ".github/workflows/ci.yml",
   "add": 1,
   "del": 1
  },
  {
   "path": "doc/developer-notes.md",
   "add": 1,
   "del": 2
  },
  {
   "path": "src/bench/bench_bitcoin.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/bitcoin-chainstate.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/bitcoin-cli.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/bitcoin-tx.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/bitcoin-util.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/bitcoin-wallet.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/bitcoind.cpp",
   "add": 4,
   "del": 1
  },
  {
   "path": "src/blockencodings.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/blockencodings.h",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/dbwrapper.cpp",
   "add": 40,
   "del": 34
  },
  {
   "path": "src/dbwrapper.h",
   "add": 6,
   "del": 1
  },
  {
   "path": "src/index/base.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/index/base.h",
   "add": 5,
   "del": 0
  },
  {
   "path": "src/init.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/kernel/bitcoinkernel.cpp",
   "add": 48,
   "del": 43
  },
  {
   "path": "src/kernel/bitcoinkernel.h",
   "add": 28,
   "del": 38
  },
  {
   "path": "src/kernel/bitcoinkernel_wrapper.h",
   "add": 31,
   "del": 26
  },
  {
   "path": "src/kernel/mempool_options.h",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/logging.cpp",
   "add": 38,
   "del": 31
  },
  {
   "path": "src/logging.h",
   "add": 6,
   "del": 3
  },
  {
   "path": "src/net_processing.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/node/blockstorage.cpp",
   "add": 53,
   "del": 48
  },
  {
   "path": "src/node/blockstorage.h",
   "add": 6,
   "del": 2
  },
  {
   "path": "src/node/chainstate.cpp",
   "add": 14,
   "del": 10
  },
  {
   "path": "src/qt/bitcoin.cpp",
   "add": 4,
   "del": 0
  },
  {
   "path": "src/qt/test/test_main.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/rpc/blockchain.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/script/sigcache.cpp",
   "add": 5,
   "del": 2
  },
  {
   "path": "src/script/sigcache.h",
   "add": 4,
   "del": 2
  },
  {
   "path": "src/test/blockfilter_tests.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/blockmanager_tests.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/test/coins_tests.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/coinsviewoverlay_tests.cpp",
   "add": 12,
   "del": 11
  },
  {
   "path": "src/test/dbwrapper_tests.cpp",
   "add": 13,
   "del": 13
  },
  {
   "path": "src/test/fuzz/block_index.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/fuzz/coins_view.cpp",
   "add": 13,
   "del": 5
  },
  {
   "path": "src/test/fuzz/coinscache_sim.cpp",
   "add": 7,
   "del": 1
  },
  {
   "path": "src/test/fuzz/dbwrapper.cpp",
   "add": 18,
   "del": 5
  },
  {
   "path": "src/test/fuzz/fuzz.cpp",
   "add": 24,
   "del": 1
  },
  {
   "path": "src/test/fuzz/fuzz.h",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/fuzz/mini_miner.cpp",
   "add": 4,
   "del": 2
  },
  {
   "path": "src/test/fuzz/partially_downloaded_block.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/script_sigcache.cpp",
   "add": 7,
   "del": 2
  },
  {
   "path": "src/test/fuzz/threadpool.cpp",
   "add": 7,
   "del": 1
  },
  {
   "path": "src/test/kernel/test_kernel.cpp",
   "add": 16,
   "del": 11
  },
  {
   "path": "src/test/logging_tests.cpp",
   "add": 207,
   "del": 21
  },
  {
   "path": "src/test/miner_tests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/reverselock_tests.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/scheduler_tests.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/script_assets_tests.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/test/script_p2sh_tests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/sync_tests.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/threadpool_tests.cpp",
   "add": 7,
   "del": 1
  },
  {
   "path": "src/test/transaction_tests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/txindex_tests.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/test/util/setup_common.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/test/util/setup_common.h",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/test/validation_chainstatemanager_tests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/validation_tests.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/txdb.cpp",
   "add": 16,
   "del": 13
  },
  {
   "path": "src/txdb.h",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/txmempool.cpp",
   "add": 11,
   "del": 9
  },
  {
   "path": "src/txmempool.h",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/util/log.h",
   "add": 193,
   "del": 62
  },
  {
   "path": "src/validation.cpp",
   "add": 173,
   "del": 150
  },
  {
   "path": "src/validation.h",
   "add": 10,
   "del": 4
  },
  {
   "path": "src/wallet/test/fuzz/fees.cpp",
   "add": 2,
   "del": 1
  }
 ],
 "test_lines": 476,
 "git": {
  "head": "687074dd2e99b4669efc821f8d8141ba6a708fe0",
  "head_matches_backup": true,
  "base": "4d86d9cc7ed0b623170a78986c57aa75ba6a46c0",
  "commits": [
   {
    "sha": "963ed23bc8",
    "subject": "log test: verify log argument evaluation semantics",
    "files": 1,
    "add": 26,
    "del": 0
   },
   {
    "sha": "3ea9b7cb10",
    "subject": "log test: add some test coverage on LogAcceptCategory",
    "files": 1,
    "add": 16,
    "del": 0
   },
   {
    "sha": "9c509ca53c",
    "subject": "log test: Add test for all accepted logging arguments",
    "files": 1,
    "add": 55,
    "del": 18
   },
   {
    "sha": "98f3bd6242",
    "subject": "log refactor: Ensure categories are not logged at info and higher levels",
    "files": 2,
    "add": 4,
    "del": 2
   },
   {
    "sha": "31f9929f3d",
    "subject": "log refactor: log macro rewrite",
    "files": 5,
    "add": 163,
    "del": 78
   },
   {
    "sha": "f0929e1b78",
    "subject": "log refactor: Drop Entry::should_ratelimit field",
    "files": 4,
    "add": 15,
    "del": 19
   },
   {
    "sha": "1ac1be8b15",
    "subject": "Merge branch 'pr/relog' into pr/bclog",
    "files": 6,
    "add": 275,
    "del": 113
   },
   {
    "sha": "aa37de26b0",
    "subject": "log refactor: Allow log macros to accept context arguments",
    "files": 4,
    "add": 86,
    "del": 23
   },
   {
    "sha": "1eedcb9db5",
    "subject": "doc: Add documentation about log levels and macros",
    "files": 1,
    "add": 36,
    "del": 1
   },
   {
    "sha": "b5d3925d27",
    "subject": "log refactor: Add support for custom log contexts",
    "files": 2,
    "add": 44,
    "del": 1
   },
   {
    "sha": "e06a5c8737",
    "subject": "kernel: Simplify logging API",
    "files": 5,
    "add": 118,
    "del": 108
   },
   {
    "sha": "64263dadb6",
    "subject": "Merge branch 'pr/bclog' into pr/gklog",
    "files": 6,
    "add": 417,
    "del": 114
   },
   {
    "sha": "0fd2affdf1",
    "subject": "Merge branch 'pr/klog' into pr/gklog",
    "files": 5,
    "add": 118,
    "del": 108
   },
   {
    "sha": "775344b1f0",
    "subject": "refactor: Pass Logger instances to kernel objects",
    "files": 40,
    "add": 179,
    "del": 117
   },
   {
    "sha": "6106a57a2f",
    "subject": "logging: Add LOG_REQUIRE_CONTEXT option",
    "files": 1,
    "add": 10,
    "del": 2
   },
   {
    "sha": "6c1f3aedd0",
    "subject": "refactor: Log kernel output to local log instances",
    "files": 7,
    "add": 253,
    "del": 223
   },
   {
    "sha": "dbe85f3972",
    "subject": "kernel: Drop global Logger instance",
    "files": 27,
    "add": 156,
    "del": 61
   },
   {
    "sha": "687074dd2e",
    "subject": "test-each-commit: Increase fetch depth",
    "files": 1,
    "add": 1,
    "del": 1
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "4bb669b7c910f864",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}