)]}'
{
  "log": [
    {
      "commit": "86c64ae53c0dde7650f461466cf41296c7b60217",
      "tree": "8b2e0b7e79f6740e251f4d2f92d2a57021ac99d2",
      "parents": [
        "4320894300f8b0947ffac39b19d030c1ca392898",
        "cc1c318733b2ac10111046ec20bd16e89d24c446"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Wed Oct 28 07:30:01 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 07:30:01 2026 +0100"
      },
      "message": "Merge pull request #341 from apache/Feature/340-appender-name-not-unique\n\nIAppender.Name does not uniquely identify an appender #340"
    },
    {
      "commit": "cc1c318733b2ac10111046ec20bd16e89d24c446",
      "tree": "8b2e0b7e79f6740e251f4d2f92d2a57021ac99d2",
      "parents": [
        "4320894300f8b0947ffac39b19d030c1ca392898"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Tue Oct 27 23:31:25 2026 +0100"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Tue Oct 27 23:31:25 2026 +0100"
      },
      "message": "IAppender.Name does not uniquely identify an appender #340\n\n- uniqueness was never enforced, so drop the claim from IAppender.Name and AppenderSkeleton.Name\n- GetAppender(string) and RemoveAppender(string) document first-match behaviour\n- implementers use inheritdoc instead of copies of the interface docs\n"
    },
    {
      "commit": "4320894300f8b0947ffac39b19d030c1ca392898",
      "tree": "cca4393a12f071df064467c7688c1a1a49e05443",
      "parents": [
        "14f9247174e7b98b9786d812cdead30287768fbd"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 25 20:24:28 2026 +0100"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 25 20:24:28 2026 +0100"
      },
      "message": "name the security contact in SECURITY.md\n\n- security@logging.apache.org, as on the Logging Services security page\n- lets the OSS Scanner triage match primary_contact\n"
    },
    {
      "commit": "14f9247174e7b98b9786d812cdead30287768fbd",
      "tree": "ec806c1511e3bb33cbff539a20dbf697319c31c8",
      "parents": [
        "8962c55de7b226ef506b212b3102db516cdfb847"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Oct 23 19:15:03 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Oct 23 19:15:03 2026 +0200"
      },
      "message": "a stack overflow from an application ToString() is out of scope\n"
    },
    {
      "commit": "8962c55de7b226ef506b212b3102db516cdfb847",
      "tree": "f49d2a8769adbe38031899bd5015a86863f6cc07",
      "parents": [
        "36bf522c74c94b43bc835cdaa51b5bca9391b513"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Oct 23 19:12:18 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Oct 23 19:12:18 2026 +0200"
      },
      "message": "added ToString() exclusion\n"
    },
    {
      "commit": "36bf522c74c94b43bc835cdaa51b5bca9391b513",
      "tree": "8d372c8bc5f620db904eb82eac4a9a723a2063f3",
      "parents": [
        "92cedbfd65d13682e534169cb6b9fa1ff8d48590"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Oct 23 18:43:28 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Oct 23 18:43:28 2026 +0200"
      },
      "message": "move the OSS Scanner build and threat model into .oss-scanner\n- https://github.com/anthropics/oss-scanner/pull/1060\n- Dockerfile from anthropics/oss-scanner#1060, with ASF header\n- fetches threat model, FAQ and VDR at build time (audit is offline)\n- threat_model.md points to SECURITY.md and AGENTS.md\n- keeps components, how to exercise it, and the severity scale\n"
    },
    {
      "commit": "92cedbfd65d13682e534169cb6b9fa1ff8d48590",
      "tree": "6c99213cc7ee061469d3f98df6c8193a7a939520",
      "parents": [
        "353443f85956c3b7fd8b31841d0377cd2a538169",
        "a5cc53c20a7fef2743798a04e31cbc9305eba1e0"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Mon Oct 12 18:10:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 18:10:05 2026 +0200"
      },
      "message": "Merge pull request #337 from apache/Feature/337-api-reference\n\ngenerated API reference with DocFX #337"
    },
    {
      "commit": "a5cc53c20a7fef2743798a04e31cbc9305eba1e0",
      "tree": "6c99213cc7ee061469d3f98df6c8193a7a939520",
      "parents": [
        "a2af1afa97805b5030768d13f7b6e67e48ecf33e"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Oct 12 00:30:17 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Oct 12 00:30:17 2026 +0200"
      },
      "message": "fix doc comment examples for docfx #337\n\n- example text on its own line, not on the \u003cexample\u003e tag (9 pages rendered the pre tag as text)\n- raw XML examples in CDATA instead of escaped\u003d\"true\" (12 blocks rendered empty)\n- language\u003d\"csharp|xml|sql|vbnet\" instead of lang, which docfx ignores\n- context stack examples reindented\n"
    },
    {
      "commit": "a2af1afa97805b5030768d13f7b6e67e48ecf33e",
      "tree": "1fbe8c08628c2dbe09aff3dae6a5860ff655818a",
      "parents": [
        "353443f85956c3b7fd8b31841d0377cd2a538169"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 11 23:56:01 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Oct 12 00:29:28 2026 +0200"
      },
      "message": "generated API reference with DocFX #337\n- docfx config in src/site/docfx, output target/site/api\n- build-api-docs.ps1, warnings as errors, in build-release.ps1 and CI\n- header link in antora playbook\n- old versions regenerated by scripts/archived/build-old-api-docs.ps1\n- shared helpers in scripts/Common.psm1\n"
    },
    {
      "commit": "353443f85956c3b7fd8b31841d0377cd2a538169",
      "tree": "d73e8bb115789aee296399c05420ea8ef2457158",
      "parents": [
        "d0efa655520773f96e80a7e7786de35ee76f2e45",
        "8590be000714c050493b44d7c944aed44c6784cb"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Sun Oct 11 20:37:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 20:37:33 2026 +0200"
      },
      "message": "use a dated file name when the date pattern names files like backups - #336\n\nFixes #335. With `StaticLogFileName`, a `DatePattern` such as `.dd` names the file of the 10th `log.txt.10`, which is also backup 10, and a roll overwrote one with the other.\n\n* warns at activation and sets `StaticLogFileName` to false, so the live file is the dated one and its backups are numbered after the date\n* no report for a count-down limit below the smallest dated name (`.dd` with 5 backups)\n* existing static file and its backups left untouched\n* startup scan of a dated name requires a dot after the name, so with `.d` the files of the 11th no longer count as backups of the 1st"
    },
    {
      "commit": "8590be000714c050493b44d7c944aed44c6784cb",
      "tree": "d73e8bb115789aee296399c05420ea8ef2457158",
      "parents": [
        "34c9e7f339a528d218c8cd4bfe25fd3ac89ad43d"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 11 20:32:02 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 11 20:32:02 2026 +0200"
      },
      "message": "recommend a separator in the date pattern, not more digits #336\n\nCount-up backup indices are unbounded, so a numeric .yyyyM meets backup\n20261 one day.\n\n* warning, changelog and manual name the default .yyyy-MM-dd\n"
    },
    {
      "commit": "34c9e7f339a528d218c8cd4bfe25fd3ac89ad43d",
      "tree": "327b6cc4b2238f80af5e4e4487977c46ef3e9627",
      "parents": [
        "9fdfb8c90ad54826d6a6e947f268af5cfe9ac590"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Oct 10 23:53:18 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Oct 10 23:53:18 2026 +0200"
      },
      "message": "name the parts of hard conditions with local functions\n\n* AGENTS.md: rule and example\n* InitializeFromOneFile: IsLogFile, IsBaseFile, IsBackupOfDatedFile\n"
    },
    {
      "commit": "9fdfb8c90ad54826d6a6e947f268af5cfe9ac590",
      "tree": "8922338398ede60c93d92406abbf731dbe913bf6",
      "parents": [
        "d0efa655520773f96e80a7e7786de35ee76f2e45"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Oct 10 23:48:51 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Oct 10 23:52:26 2026 +0200"
      },
      "message": "use a dated file name when the date pattern names files like backups #335\n\nWith StaticLogFileName, .dd names the file of the 10th like backup 10,\nand a roll overwrote one with the other.\n\n* warn at activation and set StaticLogFileName to false\n* no report for a count-down limit below the smallest dated name\n* existing static file and its backups left untouched\n* startup scan of a dated name requires a dot after the name (.d)\n"
    },
    {
      "commit": "d0efa655520773f96e80a7e7786de35ee76f2e45",
      "tree": "0dd0bb85696892914702f5d7a6f0ecd57278bddc",
      "parents": [
        "ddb2fdc9f010e845d5c5fd7c6885b2cbc411a770"
      ],
      "author": {
        "name": "Snotface",
        "email": "github@snware.com",
        "time": "Sat Oct 10 12:18:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 12:18:40 2026 +0200"
      },
      "message": "count only the current date\u0027s backups when RollingFileAppender starts (#334)\n\nInitializeRollBackups took dated files and other dates\u0027 backups for\nbackups of the current roll point:\n\n* A date without separators (.yyyyMMdd) parsed as a backup index, with a\n  static or a non-static name, so the count jumped to 20261004.\n* With a static name, log.txt.20261003.1 counted as backup 1.\n* A date pattern supplying the extension (.yyyy-MM-dd\u0027.log\u0027 with\n  PreserveLogFileNameExtension) hid the current date\u0027s backups.\n\nDates of up to four characters (.dd) still count as indexes, they cannot\nbe told apart. Reported and tested by @Snotface.\n\n---------\n\nCo-authored-by: Snotface \u003catlassian@snware.com\u003e\nCo-authored-by: Jan Friedrich \u003cfreeandnil@apache.org\u003e"
    },
    {
      "commit": "ddb2fdc9f010e845d5c5fd7c6885b2cbc411a770",
      "tree": "6a5ee178564a020f6c88dd0cdf74066904c7adad",
      "parents": [
        "fe455c609e3f1a10dd5ecdec861ffa26c19b500e"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 04 23:15:08 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 04 23:15:08 2026 +0200"
      },
      "message": "new, short CLAUDE.md\n"
    },
    {
      "commit": "fe455c609e3f1a10dd5ecdec861ffa26c19b500e",
      "tree": "4b98dc94f5260c672a6008c2c1340fc2a5160443",
      "parents": [
        "9aef1c0841d5e8ec9e681b90c32030c7fe119b63"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 04 23:08:45 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 04 23:08:45 2026 +0200"
      },
      "message": "rename CLAUDE.md to AGENTS.md\n"
    },
    {
      "commit": "9aef1c0841d5e8ec9e681b90c32030c7fe119b63",
      "tree": "d243377d6f86f013413007ffcc868424671ee29b",
      "parents": [
        "975d0538361a58099f7765389381693cebac885a"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 04 23:07:30 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Oct 04 23:07:30 2026 +0200"
      },
      "message": "rename AGENTS.md to SECURITY.md\n"
    },
    {
      "commit": "975d0538361a58099f7765389381693cebac885a",
      "tree": "024f38715c8893552469f2050a7d9ba9290e8bf0",
      "parents": [
        "fa84749276aef4452c340040d1d05c6a9ba8832b"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Oct 01 22:12:52 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Oct 01 22:12:52 2026 +0200"
      },
      "message": "bump version 3.5.1\n"
    },
    {
      "commit": "fa84749276aef4452c340040d1d05c6a9ba8832b",
      "tree": "f017cab60fbaf12a467876b108bd56e5a819e8cd",
      "parents": [
        "37ab5b4b619a164314f7edcf0eaec56b51d09457"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Wed Sep 30 20:16:04 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Wed Sep 30 20:16:04 2026 +0200"
      },
      "message": "release date 3.5.0\n"
    },
    {
      "commit": "37ab5b4b619a164314f7edcf0eaec56b51d09457",
      "tree": "b0454e169250780a8ef767257ce90933e67adba4",
      "parents": [
        "f7794ae187ab2e228e1754cb478568dd305d1b32"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Wed Sep 30 20:14:54 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Wed Sep 30 20:14:54 2026 +0200"
      },
      "message": "document the default repository overloads in the FAQ #333\n\nXmlConfigurator.Configure(FileInfo) and LogManager.GetRepository()\nresolve the repository themselves, so no assembly has to be passed.\nShow them, plus typeof(Program).Assembly for a specific repository.\n"
    },
    {
      "commit": "f7794ae187ab2e228e1754cb478568dd305d1b32",
      "tree": "2cc1a3c36e5d036c58b5a31c162e71cd4ac9d00e",
      "parents": [
        "3690764926d046a2b47929750523cda30f70f4d6",
        "a6afc70a030524a944f8dff4ceb310389fcd539c"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Mon Sep 28 10:12:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 10:12:13 2026 +0200"
      },
      "message": "Merge pull request #328 - report who accepted the connection in ListenAddressBindsOnlyThatAddress\n\n`ListenAddressBindsOnlyThatAddress` asserted `Throws.TypeOf\u003cSocketException\u003e()`, so a failure said\nonly that no exception was thrown. Not enough on a CI agent to tell whether the appender bound\nwrongly or something else on the machine listens on that port.\n\nThe assertion now carries a message, built only when it fails:\n\n* the endpoints of the socket that got through,\n* host name resolution and every interface with its unicast addresses,\n* every listener on that port,\n* what the peer sends first, which names it, since the appender greets every client.\n\nTest-only, one file, no changelog entry."
    },
    {
      "commit": "a6afc70a030524a944f8dff4ceb310389fcd539c",
      "tree": "2cc1a3c36e5d036c58b5a31c162e71cd4ac9d00e",
      "parents": [
        "e7d7eb20ce46dd2e566ca98008e0a8901dffec08"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 28 08:56:52 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 28 09:58:56 2026 +0200"
      },
      "message": "fail ListenAddressBindsOnlyThatAddress only on an appender reply #328\n\n- A filtering proxy (ESET on Linux) accepts the connection and closes\n  it, so a successful connect does not mean the appender is reachable\n- The test now fails only on the greeting or the too-many-connections\n  reply, which only a wrongly bound appender sends\n"
    },
    {
      "commit": "e7d7eb20ce46dd2e566ca98008e0a8901dffec08",
      "tree": "9bf5728d983e07cc1edbfc34577c159c471b2bdf",
      "parents": [
        "3690764926d046a2b47929750523cda30f70f4d6"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 25 21:32:02 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 28 09:58:56 2026 +0200"
      },
      "message": "report who accepted the connection in ListenAddressBindsOnlyThatAddress #328\n"
    },
    {
      "commit": "3690764926d046a2b47929750523cda30f70f4d6",
      "tree": "66e6d3ab54c3742a0b51481892a9d6aa835fbd3a",
      "parents": [
        "a457590f8b765da47b5c7581d94c88e6aff3cf2c"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 28 09:58:15 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 28 09:58:15 2026 +0200"
      },
      "message": "assert the exact retry count per newline in AFailedRollKeepsTheEventsItCouldNotMove #319\n"
    },
    {
      "commit": "a457590f8b765da47b5c7581d94c88e6aff3cf2c",
      "tree": "b18dfc3fa86ee08627d92e019a85a084515b6fd1",
      "parents": [
        "408bbdd828cc84cbc5dc951f0756d77e2be79a24",
        "1ed2acba1a951b276dabfd283277afc6e8310866"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Mon Sep 28 08:40:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 08:40:47 2026 +0200"
      },
      "message": "Merge pull request #330 - bind a release to the commit it was built from\n\nbuild-release.ps1 built the binaries from the working tree but archived the\nlocal master ref, so the signed source zip need not match the signed binaries.\n\n* Refuse a dirty tree, archive HEAD, and ship a signed .manifest recording the\n  commit and the artifact set. No origin/master check: that needs the network\n  and forbids cutting a release from a tag or a release branch.\n* Both verifiers check the commit against the zip archive comment and the\n  listed set against the files present. The hash and signature loops only see\n  the files that are there, so an artifact deleted with its .sha512 and .asc\n  passed before.\n* Everything the release writes gets LF, asserted in the tests. Set-Content\n  writes CRLF on Windows, where a trailing CR breaks sha512sum on macOS and\n  makes every manifest name compare unequal. Includes the .sha512 fix.\n* sign-log4net-libraries.sh gains set -euo pipefail and shopt -s nullglob. An\n  empty directory iterated the glob patterns and still exited 0.\n\naudit da18b6fd-f025"
    },
    {
      "commit": "408bbdd828cc84cbc5dc951f0756d77e2be79a24",
      "tree": "cb31a6a0b469a2b4d489987e2ae28a9cbb66f149",
      "parents": [
        "8e881c60f076fc55f082fa3c95fc86ef1575ff73",
        "977832e45ebb00b54b0b358d93e1d69ab016699e"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Mon Sep 28 08:40:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 08:40:11 2026 +0200"
      },
      "message": "Merge pull request #331 - report an unexpected Telnet send failure instead of dropping the client\n\nEvery throw from a Telnet write was read as a dead client, so a bug in what we write dropped every\nclient, one per event. That was f013.\n\nOnly `SocketException`, `IOException` and `ObjectDisposedException` disconnect now. The rest is\nrethrown after the loop and reported by `BackgroundSender`.\n\nCommit 2, test-only:\n\n* `AdoNetAppenderTest` twice, `XmlConfiguratorTest`, `LogLogTest`, `StringFormatTest` once each\n* ten provoked `log4net:ERROR` off stderr, two left, asserted by `LogLogTest`\n* `CLAUDE.md` gets the `ReflectionExtensions` convention from #326"
    },
    {
      "commit": "977832e45ebb00b54b0b358d93e1d69ab016699e",
      "tree": "cb31a6a0b469a2b4d489987e2ae28a9cbb66f149",
      "parents": [
        "2d40819c6b24f65cbb47fb649ce6210c05b0f62e"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 27 23:20:55 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 27 23:20:55 2026 +0200"
      },
      "message": "keep the provoked internal logging out of the test output #331\n\nFive tests provoked log4net:ERROR or WARN on purpose and let it reach stderr.\n\n* AdoNetAppenderTest twice, XmlConfiguratorTest, LogLogTest and\n  StringFormatTest once each.\n* Ten messages down to two. The two left are LogLogTest.EmitInternalMessages,\n  which asserts the console output itself.\n"
    },
    {
      "commit": "2d40819c6b24f65cbb47fb649ce6210c05b0f62e",
      "tree": "bee2ae5eee318a2b95ddb88627d8945add7d63f0",
      "parents": [
        "8e881c60f076fc55f082fa3c95fc86ef1575ff73"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 27 23:18:17 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 27 23:18:17 2026 +0200"
      },
      "message": "report an unexpected Telnet send failure instead of dropping the client #331\n\nSocketHandler.Send read every non-fatal exception as a hung up connection, so a\ndefect in what we write cost every client in turn. That is how f013 became a\nmass disconnect.\n\n* Only SocketException, IOException and ObjectDisposedException disconnect.\n  Anything else is raised after the loop and reported by BackgroundSender.\n* SocketHandler is protected, so a subclass calling Send sees exceptions it\n  did not before.\n"
    },
    {
      "commit": "1ed2acba1a951b276dabfd283277afc6e8310866",
      "tree": "85eec30270b35b6ceac283fa260bc807be72aa7b",
      "parents": [
        "dd2f909e0cf503537b617991e93b49f2ef5eca24"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 27 21:16:37 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 27 22:14:00 2026 +0200"
      },
      "message": "bind a release to the commit it was built from #330\n\nbuild-release.ps1 built the binaries from the working tree but archived the\nlocal master ref, so the signed source zip need not match the signed binaries.\n\n* Refuse a dirty tree, archive HEAD, and ship a signed .manifest recording the\n  commit and the artifact set. No origin/master check: that needs the network\n  and forbids cutting a release from a tag or a release branch.\n* Both verifiers check the commit against the zip archive comment and the\n  listed set against the files present. The hash and signature loops only see\n  the files that are there, so an artifact deleted with its .sha512 and .asc\n  passed before.\n* Everything the release writes gets LF, asserted in the tests. Set-Content\n  writes CRLF on Windows, where a trailing CR breaks sha512sum on macOS and\n  makes every manifest name compare unequal. Includes the .sha512 fix from\n  #328; #328 gets rebased onto this.\n* sign-log4net-libraries.sh gains set -euo pipefail and shopt -s nullglob. An\n  empty directory iterated the glob patterns and still exited 0.\n\naudit da18b6fd-f025\n"
    },
    {
      "commit": "8e881c60f076fc55f082fa3c95fc86ef1575ff73",
      "tree": "167d25fd48fb2142df0e5f8bb24ded675ff141cf",
      "parents": [
        "0abeed4e4616ed70bf8671e2bc33f5cf2a47d6e7"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 27 21:43:43 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 27 21:43:43 2026 +0200"
      },
      "message": "#314 - implemented by -\u003e fixed by\n"
    },
    {
      "commit": "0abeed4e4616ed70bf8671e2bc33f5cf2a47d6e7",
      "tree": "98cf3be726ebfaff1ae71634bd2d8f095c9db3a8",
      "parents": [
        "dd2f909e0cf503537b617991e93b49f2ef5eca24",
        "cec5722f43d88c7a5ab0a8bced4de2cea9f53cf5"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Sun Sep 27 20:58:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 27 20:58:49 2026 +0200"
      },
      "message": "Merge pull request #329 - require transport security by default in the Ext.Mail SmtpAppender\n\nTransportSecurity defaulted to None, so body and credentials crossed the network in cleartext unless the operator found the knob. It now defaults to Required.\n\n* EnableSsl is the same setting, so its default flips to true with it.\n* Breaks a relay without STARTTLS; opt out with transportSecurity\u003dNone or enableSsl\u003dfalse.\n* Also fixes the stale TLS docs in the README and the Antora page (f027).\n\naudit da18b6fd-f026"
    },
    {
      "commit": "cec5722f43d88c7a5ab0a8bced4de2cea9f53cf5",
      "tree": "98cf3be726ebfaff1ae71634bd2d8f095c9db3a8",
      "parents": [
        "dd2f909e0cf503537b617991e93b49f2ef5eca24"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 27 20:03:47 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 27 20:03:47 2026 +0200"
      },
      "message": "require transport security by default in the Ext.Mail SmtpAppender #329\n\nTransportSecurity defaulted to None, so body and credentials crossed the\nnetwork in cleartext unless the operator found the knob. It now defaults to\nRequired.\n\n* EnableSsl is the same setting, so its default flips to true with it.\n* Breaks a relay without STARTTLS; opt out with transportSecurity\u003dNone or\n  enableSsl\u003dfalse.\n* Also fixes the stale TLS docs in the README and the Antora page (f027).\n\naudit da18b6fd-f026\n"
    },
    {
      "commit": "dd2f909e0cf503537b617991e93b49f2ef5eca24",
      "tree": "e8ab1231582ebeba7c8d05ba778086e8c2440f48",
      "parents": [
        "beeab9f3e8d100c1d58f0a737fdc79603fdd3ac3",
        "54435a7159653279ce2af0308f7962df7c89be1e"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Fri Sep 25 14:40:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 14:40:18 2026 +0200"
      },
      "message": "Merge pull request #327 - Pester tests for build-release and build-preview\n\n- a failing native command stops both scripts before signing or tagging, and nothing is tagged without confirmation\n- build-release shipped verify-release.Tests.ps1 without hash or signature\n- CI runs mvnw from pwsh, where mvnw.cmd 3.2.0 failed its checksum"
    },
    {
      "commit": "54435a7159653279ce2af0308f7962df7c89be1e",
      "tree": "e8ab1231582ebeba7c8d05ba778086e8c2440f48",
      "parents": [
        "beeab9f3e8d100c1d58f0a737fdc79603fdd3ac3"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 25 13:40:52 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 25 13:40:52 2026 +0200"
      },
      "message": "Pester tests for build-release and build-preview #327\n\n- a failing native command stops both scripts before signing or\n  tagging, and nothing is tagged without confirmation\n- build-release shipped verify-release.Tests.ps1 without hash or\n  signature\n- CI runs mvnw from pwsh, where mvnw.cmd 3.2.0 failed its checksum\n"
    },
    {
      "commit": "beeab9f3e8d100c1d58f0a737fdc79603fdd3ac3",
      "tree": "5ad1b7f9ff96fdc6af963c88942777ed1893d0e2",
      "parents": [
        "f45b53bdd311cf8b84cc7f1cc5bed0b901dd761b"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 25 12:38:27 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 25 12:38:27 2026 +0200"
      },
      "message": "update Maven wrapper to 3.3.4 only-script\n\n- mvnw.cmd 3.2.0 failed its jar checksum when run from pwsh 7: Windows\n  PowerShell inherited pwsh\u0027s PSModulePath and lost Get-FileHash\n- only-script needs no maven-wrapper.jar, the Maven download stays\n  pinned by distributionSha256Sum\n"
    },
    {
      "commit": "f45b53bdd311cf8b84cc7f1cc5bed0b901dd761b",
      "tree": "5840af16161475b0f6f8ec6d2038ac1d9faff8bf",
      "parents": [
        "2cb51faa836504e571b4852917fb19450821cac7"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 25 12:24:16 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 25 12:24:16 2026 +0200"
      },
      "message": "added scripts\\build-release.ps1 to sln\n"
    },
    {
      "commit": "2cb51faa836504e571b4852917fb19450821cac7",
      "tree": "d0fb51f46d704df5ea02b204692098a5dc6b750a",
      "parents": [
        "fa011bc4f13e1fcc62b87d68c3b30b431a89d877",
        "34fca46496b5e6fa3be501ec9bd9ea345b934a48"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Fri Sep 25 09:56:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 09:56:57 2026 +0200"
      },
      "message": "one home for the reflection in the tests - #326\n\nOne `ReflectionExtensions` in the test assembly replaces 27 hand written lookups over 13 files.\nTest only, no production change, no changelog entry.\n\n```csharp\n// before\n\u003d\u003e (string)typeof(LocalSyslogAppender)\n  .GetMethod(\"EscapePercent\", BindingFlags.Static | BindingFlags.NonPublic)!\n  .Invoke(null, [message])!;\n\n// after\n\u003d\u003e typeof(LocalSyslogAppender).Invoke\u003cstring\u003e(nameof(EscapePercent), [message]);\n```\n\nA renamed member now fails with its own name instead of a `NullReferenceException`."
    },
    {
      "commit": "34fca46496b5e6fa3be501ec9bd9ea345b934a48",
      "tree": "d0fb51f46d704df5ea02b204692098a5dc6b750a",
      "parents": [
        "fa011bc4f13e1fcc62b87d68c3b30b431a89d877"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 23:07:49 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 25 07:58:54 2026 +0200"
      },
      "message": "one home for the reflection in the tests #326\n\nReflectionExtensions replaces 27 hand written lookups in 13 files.\nA renamed member now fails with its own name instead of a NullReferenceException.\n"
    },
    {
      "commit": "fa011bc4f13e1fcc62b87d68c3b30b431a89d877",
      "tree": "e7cbd65c0f8a9cdc1748b1484d70c8f03f6a84ce",
      "parents": [
        "3e6bf8d0d55853b471a5c912457f1dae55e1934c",
        "7202528a35c3a417f2e8c538851bdfc826c83feb"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Fri Sep 25 07:56:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 07:56:57 2026 +0200"
      },
      "message": "Merge pull request #325 from apache/Feature/325-native-interop\n\nnative interop: fix syslog on Apple arm64, stop starting getprop"
    },
    {
      "commit": "7202528a35c3a417f2e8c538851bdfc826c83feb",
      "tree": "e7cbd65c0f8a9cdc1748b1484d70c8f03f6a84ce",
      "parents": [
        "e48a2b5d5e112a39a02a82e770d2b62791ee3a9a"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 22:30:50 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 24 11:12:28 2026 +0200"
      },
      "message": "pass no variadic argument to syslog #325\n\n- a variadic argument goes on the stack on Apple arm64, a fixed one in a\n  register, so the callee read the wrong slot\n- declaring it variadic is out: CoreCLR refuses a __arglist P/Invoke\n- only the two fixed parameters now, record as the format string with\n  every percent sign doubled\n- logged text, length and platforms that worked stay as they were\n- VariadicAbiProbeTest replaced by the escaping and signature tests\n\naudit da18b6fd-f046\n"
    },
    {
      "commit": "e48a2b5d5e112a39a02a82e770d2b62791ee3a9a",
      "tree": "e17f1c7c4c3d3e91d0bdccfa9ddafbba9bb992d8",
      "parents": [
        "40621f4b35a6609634f2087189dc47ac741fe3de"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 22:24:04 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 24 11:12:28 2026 +0200"
      },
      "message": "release the FormatMessage buffer with LocalFree #325\n\n- FormatMessage allocates with LocalAlloc, the ref string marshalling\n  freed it as COM task memory\n- now out IntPtr, PtrToStringUni over the returned length, LocalFree in\n  a finally\n- hygiene, not a fix: the probe found the block inside the process heap\n- WindowsAllocatorProbeTest replaced by NativeErrorTest\n\naudit da18b6fd-f045\n"
    },
    {
      "commit": "40621f4b35a6609634f2087189dc47ac741fe3de",
      "tree": "7039260807e442d92342588aa69ff53d1b059f12",
      "parents": [
        "9df80b120983c35715275b96b7b2e57f9cf551dc"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 22:17:44 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 24 11:12:28 2026 +0200"
      },
      "message": "use AutoTempEnvironmentVariable in the env var tests #325\n\n- process level env var tests restore through a using, not by hand\n- ProcessLevelEnvironmentVariable leaked the variable on a failed assert\n- Machine and User targets keep cleaning up themselves, not covered\n"
    },
    {
      "commit": "9df80b120983c35715275b96b7b2e57f9cf551dc",
      "tree": "f2a211af6d89d6652a51dfe147f5a723756a6a7f",
      "parents": [
        "4485723d30540acebebbac01a30c872d2195a5ef"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 22:09:31 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 24 11:12:27 2026 +0200"
      },
      "message": "detect Android without starting getprop #325\n\n- SystemInfo ran \"getprop ro.build.user\" on every Unix host, via PATH\n- first PATH match decided the answer\n- now /system/bin/getprop, plus the platform itself off net462\n- System.Diagnostics.Process out of the startup path\n\naudit da18b6fd-f048\n"
    },
    {
      "commit": "4485723d30540acebebbac01a30c872d2195a5ef",
      "tree": "f44cbb958ff2faa1ad0b6700afc7966fa5ecc2f5",
      "parents": [
        "3e6bf8d0d55853b471a5c912457f1dae55e1934c"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 21:40:38 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 24 11:12:04 2026 +0200"
      },
      "message": "Probes for f045 \u0026 f046\n"
    },
    {
      "commit": "3e6bf8d0d55853b471a5c912457f1dae55e1934c",
      "tree": "e0b912b83c64c797c4210bea2060c80cbc0d9fc3",
      "parents": [
        "fcdfc78dea342edc5e2ea93953104a738d3a11c5",
        "5049c46f347da18f9fa181bac80fa037dd839d54"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Thu Sep 24 10:37:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 10:37:01 2026 +0200"
      },
      "message": "stop appenders losing or leaking what they write - #324\n\n## Fixed\n\n- **An oversize event was dropped by the UDP appenders**, audit da18b6fd-f015\n  - the socket rejects a payload over 65507 bytes, measured here: 65507 is sent, 65508 fails\n  - new `MaxDatagramSize`, default 65507, configurable from 512\n  - the event is cut on a character boundary, marked `...[truncated]` and reported\n  - not raisable: IPv6 would carry 20 bytes more, not worth a second limit\n- **The configurator echoed secret values**, audit da18b6fd-f042\n  - a parameter named like a secret is now logged as `*****`\n  - a connection string keeps only the keywords that name the server\n  - covers internal debugging and the four setter failures, which are written without it\n  - `AdoNetAppender`\u0027s allowlist moved to `log4net.Util.Redact` and is now shared\n- **The pickup mail carried an SMTP DATA terminator**, audit da18b6fd-f037\n  - the file is read to its end, so the lone dot was delivered as a literal line\n  - it is gone; body lines stay verbatim and are not dot stuffed\n  - an agent that expects DATA framing is documented as not a supported consumer"
    },
    {
      "commit": "5049c46f347da18f9fa181bac80fa037dd839d54",
      "tree": "e0b912b83c64c797c4210bea2060c80cbc0d9fc3",
      "parents": [
        "2daf1229091eb4e60614ff6dcbe3a7bd56fa6094"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 21:24:40 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Wed Sep 23 20:19:58 2026 +0200"
      },
      "message": "drop the lone dot terminator from the pickup mail #324\n\n- the file is an RFC 822 message, not an SMTP DATA stream, so the terminator\n  bought nothing\n- a logged line that was only a dot was indistinguishable from it and ended the\n  mail early for any agent honouring it\n\naudit da18b6fd-f037\n"
    },
    {
      "commit": "2daf1229091eb4e60614ff6dcbe3a7bd56fa6094",
      "tree": "45fae5dea52e125a4809b7e2206a8d79f87e8627",
      "parents": [
        "afbebfbd65e153c91291f955400025162065f543"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 21:15:41 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Wed Sep 23 20:19:57 2026 +0200"
      },
      "message": "keep secrets out of the configuration messages #324\n\n- a parameter named like a secret is logged as *****, connection strings keep only the keywords that name the server\n- covers internal debugging and the four setter failures, which are written without it\n- the AdoNet connection string redaction moves to log4net.Util.Redact and is now shared\n"
    },
    {
      "commit": "afbebfbd65e153c91291f955400025162065f543",
      "tree": "82d7788565cbb9dbd5c45e7b79da4d7aaeda6c0f",
      "parents": [
        "fcdfc78dea342edc5e2ea93953104a738d3a11c5"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 21:03:24 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Wed Sep 23 20:19:57 2026 +0200"
      },
      "message": "truncate an oversize UDP datagram instead of losing the event #324\n\n- the socket rejects a payload over 65507 bytes, so the event was lost\n- new MaxDatagramSize, default 65507, configurable from 512\n- cut on a character boundary, marked with ...[truncated]\n- RemoteSyslogAppender uses the same encoder\n\naudit da18b6fd-f015\n"
    },
    {
      "commit": "fcdfc78dea342edc5e2ea93953104a738d3a11c5",
      "tree": "0796dfc05b836ad6582967088fb06ca029c89f1f",
      "parents": [
        "781b4a865b2ca0956422bc4f76f6344dff32a62f",
        "e72596613f4c2081d278749b02780c9ec0c33ebc"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Wed Sep 23 20:19:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 20:19:12 2026 +0200"
      },
      "message": "stop stale context reaching logical stacks and fixed events #323\n\n## Fixed\n\n- **Logical stack brought back old frames**, audit da18b6fd-f044\n  - `Dispose` used the copy of the stack made at `Push` time\n  - after `Clear`, or after two `Pop` calls, the old frames came back\n  - it now cuts the stack that is in use and never adds to it\n  - known limit: disposing a frame of another flow cuts this flow, so frames can be lost, but\n    nothing is added\n- **A second `Fix` opened the event cache again**, audit da18b6fd-f039\n  - the cache was opened before we knew if there was anything to fix\n  - another thread could then write its own identity, thread name or location into the event\n  - before the fix: one hit after 56000 to 63000 calls, five runs of five. After: none in 2000000\n\n## Deprecated\n\n- `log4net.Util.TwoArgAction`, the old callback of the stack, now unused, to be removed in v4\n\n## Documented, not changed\n\n- **`%property` in a `PatternString`-typed setting**, audit da18b6fd-f021\n  - a path built from such a value is the operator\u0027s choice, see the model and the FAQ on path\n    traversal\n  - cleaning the value in the converter would change it everywhere, and in the wrong place\n- **`AspNetTraceAppender` belongs to one request**, audit da18b6fd-f006\n  - behind a buffering appender, a flush writes into the request that caused it\n  - dropping older events instead would lose them, which is worse\n\n## Speed of the stack change\n\n1M calls, best of 5, Release on net10.0:\n\n| case | before | after |\n|---|---|---|\n| push and dispose, depth 1 | 405 to 438 ns, 1272 B | 412 to 458 ns, 1272 B |\n| push and dispose, depth 3 | 1386 to 1433 ns, 3976 B | 1414 to 1440 ns, 3976 B |\n| dispose after Clear | 548 ns, 1656 B | 361 ns, 1016 B |\n\nThe normal cases are the same within noise and use the same memory. The fixed case is 34 percent\nfaster."
    },
    {
      "commit": "e72596613f4c2081d278749b02780c9ec0c33ebc",
      "tree": "0796dfc05b836ad6582967088fb06ca029c89f1f",
      "parents": [
        "872ca0002e918a11fa66ea0c9a344b6da7eb86c7"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 20 21:15:35 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Tue Sep 22 21:05:36 2026 +0200"
      },
      "message": "unlock the event cache only while fixing #323\n\n- the cache was unlocked before the fields to fix were determined\n- a redundant Fix reopened it with nothing to do\n- a reader then cached its own identity, thread name or location\n- measured: a hit after 56000 to 63000 calls, five runs of five\n\naudit da18b6fd-f039.\n"
    },
    {
      "commit": "872ca0002e918a11fa66ea0c9a344b6da7eb86c7",
      "tree": "eb7c906a7de2305336ff6a6190e17c36f210d525",
      "parents": [
        "21c144ada616ed262aba97c1c6c5c56cad43a30b"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 20 21:31:08 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Tue Sep 22 21:05:36 2026 +0200"
      },
      "message": "deprecate TwoArgAction #323\n\n- existed for the logical stack\u0027s register callback, now an owner reference\n- unused in the tree, public so it stays for now\n- marked obsolete, removal in version 4\n"
    },
    {
      "commit": "21c144ada616ed262aba97c1c6c5c56cad43a30b",
      "tree": "dba4713a49e6ef7c647c38c2fc1ea395b1f2073d",
      "parents": [
        "a2f7c25c026ff1f261a0b2a5d2046259f5394a13"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 20 21:15:35 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Tue Sep 22 21:05:36 2026 +0200"
      },
      "message": "stop a disposed logical stack frame restoring removed frames #323\n\n- Dispose rebuilt the stack from the copy taken at Push time\n- after Clear, or after a Pop below its depth, the earlier frames came back\n- now trims the stack registered in the flow, never grows it\n- the stack holds its owning stacks instead of a register callback\n- residual: a foreign frame trims the current flow, loss not injection\n\n1M ops, best of 5, Release on net10.0:\n\n| case                 | before                  | after                   |\n|----------------------|-------------------------|-------------------------|\n| push/dispose depth 1 | 405 to 438 ns, 1272 B   | 412 to 458 ns, 1272 B   |\n| push/dispose depth 3 | 1386 to 1433 ns, 3976 B | 1414 to 1440 ns, 3976 B |\n| dispose after Clear  | 548 ns, 1656 B          | 361 ns, 1016 B          |\n\naudit da18b6fd-f044.\n"
    },
    {
      "commit": "a2f7c25c026ff1f261a0b2a5d2046259f5394a13",
      "tree": "ebcd841c6bf39afb1c58e9d6085e9a0cdd7e76e3",
      "parents": [
        "2aa6361101845a16dcb904c23aae019dfa77ff7b"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 20 21:15:35 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Tue Sep 22 21:05:35 2026 +0200"
      },
      "message": "say that the ASP.NET trace appender is request scoped #323\n\n- writes to HttpContext.Current of the appending thread\n- behind a buffering appender a flush hits the triggering request\n- a timestamp filter would drop foreign events, so documented not enforced\n\naudit da18b6fd-f006, no code change.\n"
    },
    {
      "commit": "2aa6361101845a16dcb904c23aae019dfa77ff7b",
      "tree": "5658d6c02956905d0c3c71f4f1860bed1bde669f",
      "parents": [
        "781b4a865b2ca0956422bc4f76f6344dff32a62f"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sun Sep 20 21:15:35 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Tue Sep 22 21:05:35 2026 +0200"
      },
      "message": "point %property at the path traversal FAQ #323\n\n- context value into a PatternString-typed config value: the operator\u0027s choice\n- trustworthiness of that value: the deployer\u0027s responsibility\n- comment at the converter, note in our FAQ, where the next reader looks\n\naudit da18b6fd-f021, no code change.\n"
    },
    {
      "commit": "781b4a865b2ca0956422bc4f76f6344dff32a62f",
      "tree": "54ec5453c09d2193bc94f649ef7646ba9d95a40c",
      "parents": [
        "c9edbc976d061917402e0ee16814c3422ca7288a",
        "93ed24f3e4e0d1a251ca520b6e2a89f8535149de"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Tue Sep 22 21:04:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 21:04:21 2026 +0200"
      },
      "message": "close the outgoing appenders before activating the new ones #321 - #322\n\nFixes #321\n\n- since #287 (3.3.1) the new appenders were activated, and so opened their file, before the old ones were closed\n- `ParseAppender` now collects into `_pendingActivations`, drained once every logger has swapped; the atomic swap from #287 stays\n- verified on Windows, `net462`: one `Unable to acquire lock` per run before, none after\n- Linux cannot show the symptom, so the test asserts the open/close order instead"
    },
    {
      "commit": "93ed24f3e4e0d1a251ca520b6e2a89f8535149de",
      "tree": "54ec5453c09d2193bc94f649ef7646ba9d95a40c",
      "parents": [
        "d512f94832c7e70c79f66a8cbb4ebaf41dabe9cb"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Tue Sep 22 16:31:38 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Tue Sep 22 16:31:38 2026 +0200"
      },
      "message": "discard an appender that fails to activate #321\n\n- deferring ActivateOptions moved it out of the ParseAppender catch\n- the failure is logged and the appender detached and closed\n- children are unwired first, so a container does not take them down\n"
    },
    {
      "commit": "c9edbc976d061917402e0ee16814c3422ca7288a",
      "tree": "b663663b198fc6fea504dd98bc8ec9930be44537",
      "parents": [
        "969903dcde8e208a1d15ce36d1d35a4f1393a347",
        "2c7cd96f46e79987907a0ad820c9016f0e22db36"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Tue Sep 22 12:24:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 12:24:52 2026 +0200"
      },
      "message": "Merge pull request #319 from apache/Feature/319-file-locking\n\nfile locking: keep the log on a failed roll, fix the mutex name"
    },
    {
      "commit": "d512f94832c7e70c79f66a8cbb4ebaf41dabe9cb",
      "tree": "196c6535a88b99700a3367cb059e8366267956a7",
      "parents": [
        "642bdd2d2cf1f9c1fa50fafd0caf88260cfb94fb"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 22:41:29 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 20:20:27 2026 +0200"
      },
      "message": "point the npm changelog entry at its own pull request\n\n- the entry claimed #321, which is the FileAppender reconfiguration issue,\n  filed a day after this landed\n- the Antora dependency work came through #320, so the id, the link and\n  the file name follow that\n"
    },
    {
      "commit": "642bdd2d2cf1f9c1fa50fafd0caf88260cfb94fb",
      "tree": "9d159672149cb7005fd3991db33e5856899fbb86",
      "parents": [
        "2c7cd96f46e79987907a0ad820c9016f0e22db36"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:53:01 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 20:20:26 2026 +0200"
      },
      "message": "close the outgoing appenders before activating the new ones #321\n\n- XmlHierarchyConfigurator activated a new appender while the outgoing\n  one still held its file, so ConfigureAndWatch failed with \"Unable to\n  acquire lock on file\"\n- regression from 592d18de (#287)\n- ParseAppender collects into _pendingActivations, which Configure\n  drains once every logger has swapped\n- the symptom is Windows only: .NET on Linux does not enforce FileShare\n  within a process, so the test asserts the open/close order instead\n"
    },
    {
      "commit": "2c7cd96f46e79987907a0ad820c9016f0e22db36",
      "tree": "b663663b198fc6fea504dd98bc8ec9930be44537",
      "parents": [
        "51a751edf65c5b8fbe2c7be1b5b1453feb5373e4"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 20:18:15 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 20:18:15 2026 +0200"
      },
      "message": "assert the deadline, not the wall clock #319\n\n- TheDeadlineCoversTheWholeSendAndNotOneOperation timed the whole send against a\n  5 s bound, and failed on a slow Windows runner at 6289 ms\n- the fake transport now records which call found the token cancelled\n"
    },
    {
      "commit": "51a751edf65c5b8fbe2c7be1b5b1453feb5373e4",
      "tree": "57a99a659d2b30a1c261302c166c32ccae1aaa87",
      "parents": [
        "c907f7fe7a638e122e80b437f14482095bbece20"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 20:04:56 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 21 20:04:56 2026 +0200"
      },
      "message": "keep the startup roll from rolling twice #319\n\n- ExistingInit rolled again for AppendToFile\u003dfalse, moving the file out from\n  under the pending rename, so the first retry archived the new file under the\n  previous date.\n- The forced append reached AppendToFile through base.OpenFile and replaced the\n  configured value. Every successful roll did this, not just a failed one, so\n  RollingCombinedWithPreserveExtension now asserts it too.\n- The changelog entries now describe what a user sees.\n"
    },
    {
      "commit": "c907f7fe7a638e122e80b437f14482095bbece20",
      "tree": "175157a179f78bba3aee382aebd20334fd940480",
      "parents": [
        "ef16930b8cc3c1827b5785972a6aee9d220561ba"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 23:07:03 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 23:07:03 2026 +0200"
      },
      "message": "compute the retry threshold once #319\n\n- the message printed 0 bytes of growth where the threshold was really 1\n- the retry-count assertion allowed 2 to 19, so a wrong threshold passed it.\n  Two attempts on Unix, three on Windows, and the range says which is which\n- record what the mutex suffix collision costs\n- drop the empty else, rewrap a long changelog line\n"
    },
    {
      "commit": "ef16930b8cc3c1827b5785972a6aee9d220561ba",
      "tree": "5a23f02c8e8b333a32628bfd2edb888b2e98fe6f",
      "parents": [
        "5b594a8b667960eceec3576ce6824d00759df489"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:40 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:40 2026 +0200"
      },
      "message": "the changelog attribution does not repeat the pull request link\n"
    },
    {
      "commit": "5b594a8b667960eceec3576ce6824d00759df489",
      "tree": "1be336bdf9ba5d189c53a58666e7e55047c8c3c9",
      "parents": [
        "1865b503351371f4177e63665aec7091b7d1c8a5"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:40 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:40 2026 +0200"
      },
      "message": "retry a pending rename every tenth of MaxFileSize #319\n\nCLAUDE.md: a logged raw string keeps its newlines, and only the first\nline carries the prefix.\n"
    },
    {
      "commit": "1865b503351371f4177e63665aec7091b7d1c8a5",
      "tree": "252645c8aea97c2aacc5b99446289dad03567540",
      "parents": [
        "1b7a8ae1917ceaf567ff598203d35031ec95716d"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:40 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:40 2026 +0200"
      },
      "message": "retry a pending rename outside the size roll path #319\n\n- Date mode never retried: the check sat inside the size-rolling guard.\n- The startup roll fell through to AppendToFile and truncated the file.\n"
    },
    {
      "commit": "1b7a8ae1917ceaf567ff598203d35031ec95716d",
      "tree": "63b01acf39a12d59b637b25614f14b90ec4704ab",
      "parents": [
        "0e1e7cffd3fbc4502f5de0288056599d88f02e8f"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:39 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:39 2026 +0200"
      },
      "message": "cap the mutex name by UTF-8 bytes, not characters #319\n\n104 characters can be 304 bytes, and Unix rejects by bytes.\n"
    },
    {
      "commit": "0e1e7cffd3fbc4502f5de0288056599d88f02e8f",
      "tree": "84206cf641384ca330a12bfba69173c3ff91ea28",
      "parents": [
        "dc354f9cf8dd3a62a98c2e358965afa86dace150"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:39 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:39 2026 +0200"
      },
      "message": "document the overrides in the two locking fakes\n"
    },
    {
      "commit": "dc354f9cf8dd3a62a98c2e358965afa86dace150",
      "tree": "9ad7e4af2ca866a7ce1ba077dcd3bea17f9d599e",
      "parents": [
        "03af5dcd1026274dea28a0c9d27926db0867d656"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:38 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 19 21:20:38 2026 +0200"
      },
      "message": "bump PeanutButter.Utils to 3.0.437\n"
    },
    {
      "commit": "03af5dcd1026274dea28a0c9d27926db0867d656",
      "tree": "154f398bdfefe3b314d1b7c61f1b9514b33c537e",
      "parents": [
        "6dc58e5e58b6386843a0b889aa0336ff56558b54"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 17 22:28:04 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 17 22:28:04 2026 +0200"
      },
      "message": "give the temp folder tests their own folder #319\n\n- SmtpPickupDirAppenderTest kept its pickup directory in a fixture field, shared\n  by every test, and created it inside the build output.\n- FileAppenderTest leaked two files per run: Path.GetTempFileName creates them\n  and nothing deleted them.\n- PatternStringTest tracked its config file by hand to delete it in a finally.\n\nAll three use AutoTempFolder now, which disposes what it made.\n"
    },
    {
      "commit": "6dc58e5e58b6386843a0b889aa0336ff56558b54",
      "tree": "40cb6b452e8426cbef5ad4f91ec14cdc3350ebf7",
      "parents": [
        "a9525256b0c52a22b7b7656e763cd7995db61a78",
        "969903dcde8e208a1d15ce36d1d35a4f1393a347"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 17 22:19:31 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 17 22:19:31 2026 +0200"
      },
      "message": "Merge remote-tracking branch \u0027origin/master\u0027 into Feature/319-file-locking\n"
    },
    {
      "commit": "a9525256b0c52a22b7b7656e763cd7995db61a78",
      "tree": "54ef7b29a97a08112e42ee2be8fcd9fcca720114",
      "parents": [
        "2f3d444e2ff87dbc255db8688086161e9c880f12"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 17 22:19:22 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 17 22:19:22 2026 +0200"
      },
      "message": "answer the review on the file locking work #319\n\n- Release the file lock with _stream?.ReleaseLock() wherever the acquire was\n  already null-conditional.\n- One CountingWriter property instead of five QuietWriter casts, through\n  EnsureIs\u003c\u003e so a wrong writer names itself. The two sites after a reopen keep\n  their null check: a refused lock leaves no writer there.\n- The new fixtures keep no state between tests: AutoTempFolder from\n  PeanutButter.Utils and a per-test error handler. Its namespace collides with\n  our test helper Utils, which is internal TestUtils now.\n"
    },
    {
      "commit": "969903dcde8e208a1d15ce36d1d35a4f1393a347",
      "tree": "8162ecae1062910e7b265f66fd31aa2c8a7ff7c1",
      "parents": [
        "4622b38accb64ad066a5491f7871284192a5a5ef"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 17 21:42:36 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 17 21:42:36 2026 +0200"
      },
      "message": "take npm dependencies from logging-parent gha/v0 #321\n\n- drops the local Antora deps, the js-yaml override and the committed package-lock.json\n- verified with ./mvnw site\n"
    },
    {
      "commit": "2f3d444e2ff87dbc255db8688086161e9c880f12",
      "tree": "07f4a9e647b72fa8df7d29c67138223b6dd830e6",
      "parents": [
        "18bc141dc498d3e33bb620db012c9e250fec1866"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 14 22:10:46 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 14 22:10:46 2026 +0200"
      },
      "message": "drop the pre-Vista event log size branch\n\nWindows 7 SP1 is the floor for the net462 build this file compiles into, so the\nversion test could not fail and the 32766 constant behind it was dead. The\nsurviving constant keeps its measured value and loses the superseded lore.\n"
    },
    {
      "commit": "18bc141dc498d3e33bb620db012c9e250fec1866",
      "tree": "0d63be4c0e4dfeba0e50964d012968f05e104bc7",
      "parents": [
        "73b9a17e110bcb6a04c3257d68e6aec9a4710165"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 14 22:10:32 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Mon Sep 14 22:10:32 2026 +0200"
      },
      "message": "name the file lock mutex after the resolved path #319\n\n- InterProcessLock named its mutex before the path was resolved, so a relative\n  and an absolute spelling of one file took two mutexes and excluded nothing.\n- A name over 255 characters throws on Unix, out of ActivateOptions, so a deep\n  log path took the appender down. Those are hashed now. Windows has no limit,\n  measured, so its names are left alone and keep excluding older versions.\n- Both mutexes take their name from one helper, which carries why there is no\n  ACL, no Global\\ prefix and no user component.\n\naudit da18b6fd-f031, da18b6fd-f010\n"
    },
    {
      "commit": "4622b38accb64ad066a5491f7871284192a5a5ef",
      "tree": "d2542759dc6485bf7cf5bd4c03ee39a2e7c4c34d",
      "parents": [
        "daa467d7d193379fcb5829e2830202dac87c5b0e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Sep 13 21:26:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 13 21:26:44 2026 +0200"
      },
      "message": "Bump js-yaml, @antora/cli and @antora/site-generator-default (#320)\n\nBumps [js-yaml](https://github.com/nodeca/js-yaml) to 4.3.2 and updates ancestor dependencies [js-yaml](https://github.com/nodeca/js-yaml), [@antora/cli](https://gitlab.com/antora/antora/tree/HEAD/packages/cli) and [@antora/site-generator-default](https://gitlab.com/antora/antora/tree/HEAD/packages/site-generator-default). These dependencies need to be updated together.\n\n\nUpdates `js-yaml` from 4.3.1 to 4.3.2\n- [Changelog](https://github.com/nodeca/js-yaml/blob/4.3.2/CHANGELOG.md)\n- [Commits](https://github.com/nodeca/js-yaml/compare/4.3.1...4.3.2)\n\nUpdates `@antora/cli` from 3.2.0-rc.2 to 3.2.0\n- [Changelog](https://gitlab.com/antora/antora/blob/main/CHANGELOG.adoc)\n- [Commits](https://gitlab.com/antora/antora/compare/v3.2.0-rc.2...v3.2.0)\n\nUpdates `@antora/site-generator-default` from 3.2.0-rc.2 to 3.2.0\n- [Changelog](https://gitlab.com/antora/antora/blob/main/CHANGELOG.adoc)\n- [Commits](https://gitlab.com/antora/antora/compare/v3.2.0-rc.2...v3.2.0)\n\n---\nupdated-dependencies:\n- dependency-name: js-yaml\n  dependency-version: 4.3.2\n  dependency-type: indirect\n- dependency-name: \"@antora/cli\"\n  dependency-version: 3.2.0\n  dependency-type: direct:development\n- dependency-name: \"@antora/site-generator-default\"\n  dependency-version: 3.2.0\n  dependency-type: direct:development\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "73b9a17e110bcb6a04c3257d68e6aec9a4710165",
      "tree": "f361622a9861fe24664f918b98e9bbf96c24eeaf",
      "parents": [
        "daa467d7d193379fcb5829e2830202dac87c5b0e"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 12 00:55:18 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Sat Sep 12 00:56:10 2026 +0200"
      },
      "message": "keep the log when a roll cannot rename it #319\n\n- A failed rename was reported, then the file reopened without appending, which\n  destroyed it. A backup agent holding a read handle is enough. It appends now,\n  and only that rename is retried, once per MaxFileSize of growth, so the\n  backups are never rotated twice and a retry that succeeds keeps the generation\n  it recovers.\n- The footer, close and open paths released the file lock even when acquiring it\n  had failed. Only what was taken is released now.\n\naudit da18b6fd-f036, da18b6fd-f032\n"
    },
    {
      "commit": "daa467d7d193379fcb5829e2830202dac87c5b0e",
      "tree": "6b1bb0253647ba109aae1b5b8287dab6e85d868a",
      "parents": [
        "9c93a34497c7f5cb41d05f8ec0c7cc13612d59df",
        "4f0e906e9460b0fb02b375e6921ec518da9fbd8f"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Mon Sep 07 10:06:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 10:06:06 2026 +0200"
      },
      "message": "Merge pull request #318 from apache/Feature/318-telnet-default\n\nPrevent Telnet clients reaching or stalling the application"
    },
    {
      "commit": "9c93a34497c7f5cb41d05f8ec0c7cc13612d59df",
      "tree": "5165a9940dc856f83967d3be586a259212626c7e",
      "parents": [
        "a208c539e5ce8d328c5f1f24eaceb194c60f782b",
        "4286db7407efffc69745fb85cf22800b376b42b4"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Fri Sep 04 22:46:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 22:46:54 2026 +0200"
      },
      "message": "Merge pull request #317 from apache/Feature/317-filters\n\nPrevent content from steering the string match filters"
    },
    {
      "commit": "a208c539e5ce8d328c5f1f24eaceb194c60f782b",
      "tree": "f821ad5d892c21b15171af27fa61759246f6a94b",
      "parents": [
        "5a37f1787075ad7d751f8b1786f0dff9589b2b47",
        "7de84b7d3dc04707cac3216ff79696363169e044"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Fri Sep 04 13:49:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 13:49:52 2026 +0200"
      },
      "message": "Merge pull request #316 from apache/Feature/316-content-loss\n\nPrevent the ANSI appender and %aspnet-request dropping events"
    },
    {
      "commit": "7de84b7d3dc04707cac3216ff79696363169e044",
      "tree": "f821ad5d892c21b15171af27fa61759246f6a94b",
      "parents": [
        "39033a49a0bc6eb22ec17313566eb680e91f34cc"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 23:26:40 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 10:08:56 2026 +0200"
      },
      "message": "cite the audit findings behind the Ext.Mail and syslog work #314\n\nThe Ext.Mail send rework answers f004 and the remote syslog queue and pump work\nanswers f034, but neither pair named the finding. The other five 314 and 315\nentries stay unattributed: they are our own, not audit findings.\n"
    },
    {
      "commit": "39033a49a0bc6eb22ec17313566eb680e91f34cc",
      "tree": "94b56f8dfee5b2aaa9194d53d22b7a0c8c130726",
      "parents": [
        "145203420c579a703008b4b723b6a080757f4964"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 23:21:16 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 10:08:56 2026 +0200"
      },
      "message": "credit the fixer in every changelog entry\n\nCLAUDE.md wants the description to close with both sides, who raised it and who\ndid the work. Eleven entries named only the audit finding. Nothing but the\nattribution changed.\n"
    },
    {
      "commit": "145203420c579a703008b4b723b6a080757f4964",
      "tree": "a5b8da538992fe7d68fd65cba0fea8a1a32ba05a",
      "parents": [
        "d3b8e9b9770145ef2497aa113cc01c0965ec17b7"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 23:21:08 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 10:08:56 2026 +0200"
      },
      "message": "stop the aspnet-request converter dropping events with rejected content #316\n\n- Reading HttpRequest.Params validates the query string, form and cookies on\n  first access, so a request carrying \u003cscript\u003e threw inside the layout and\n  AppenderSkeleton discarded the whole event: a sender could suppress the log\n  record of their own request.\n- The converter now reads through HttpRequest.Unvalidated, so the content is\n  kept rather than replaced by the not-available marker.\n- The try now also covers the body parse and ServerVariables, which throw on an\n  oversized body or a lost client. Verified on Windows: with no worker request\n  behind it, ServerVariables is empty rather than throwing.\n- Five tests, net462 only, so they run on the Windows leg alone. Reverting the\n  fix fails exactly the two that assert the content survives.\n\naudit da18b6fd-f019\n"
    },
    {
      "commit": "d3b8e9b9770145ef2497aa113cc01c0965ec17b7",
      "tree": "3988118234b9d2447623b00b5c2f1a50517960b9",
      "parents": [
        "5a37f1787075ad7d751f8b1786f0dff9589b2b47"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 22:31:48 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 10:08:55 2026 +0200"
      },
      "message": "stop the ANSI terminal appender dropping empty messages #316\n\n- Logging an empty message threw IndexOutOfRangeException: the branch meant for\n  a one-character message read message[0] without checking there was one.\n- AppenderSkeleton caught it, so the event simply disappeared.\n- The reset codes now go at one computed offset, leaving no short-message branch\n  to get wrong.\n- All ten line-break cases are pinned by test. They carry explicit names because\n  dotnet test --filter cannot see them otherwise; CLAUDE.md records why.\n\naudit da18b6fd-f029\n"
    },
    {
      "commit": "5a37f1787075ad7d751f8b1786f0dff9589b2b47",
      "tree": "3dda265863823e2fe253d135b5ac92d5fb285e3e",
      "parents": [
        "eb41be2d37658222dfff35742fdccacdd7af7f5d",
        "4d2e10f0908199604b4326f9df6d0b43b871e333"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "43271715+FreeAndNil@users.noreply.github.com",
        "time": "Fri Sep 04 10:06:36 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 10:06:36 2026 +0200"
      },
      "message": "Merge pull request #315 from apache/Feature/315-local-syslog-newlines\n\nEscaping special characters in multiple appenders"
    },
    {
      "commit": "4f0e906e9460b0fb02b375e6921ec518da9fbd8f",
      "tree": "6b1bb0253647ba109aae1b5b8287dab6e85d868a",
      "parents": [
        "916e67123203bad24ba24576cbfd590d3b23aa03"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 09:09:40 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 09:17:58 2026 +0200"
      },
      "message": "write to Telnet clients from a background thread #318\n\n- Clients were written to serially under the appender lock, so one that stopped\n  reading blocked every logging thread for sendTimeoutMillis.\n- Events are queued now, sendQueueSize 500, enqueueTimeoutMillis 50.\n- A full queue drops from the telnet stream, never from the log.\n- While the queue stays full, enqueueTimeoutMillis caps logging at 20 events/s;\n  set it to 0 to drop immediately instead of waiting.\n\naudit da18b6fd-f014\n"
    },
    {
      "commit": "916e67123203bad24ba24576cbfd590d3b23aa03",
      "tree": "f019d0d320055c0d34c3487f1e0b4501656a0b3c",
      "parents": [
        "6ebcda0355202c0898c6ce93bc8def163203c5d8"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 09:01:23 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 09:17:58 2026 +0200"
      },
      "message": "share one RecordingErrorHandler across the appender tests\n\nThree copies, two identical and one collecting into a joined string instead of\na list. Now one internal helper beside SimpleTelnetClient and UdpMock, exposing\nMessages; the ANSI test asserts on that instead of its own Message property.\n"
    },
    {
      "commit": "6ebcda0355202c0898c6ce93bc8def163203c5d8",
      "tree": "bf1936c4005d1b245ab90206dd8d42ee0753d8f4",
      "parents": [
        "4286db7407efffc69745fb85cf22800b376b42b4"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 07:36:25 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 09:17:57 2026 +0200"
      },
      "message": "listen on loopback by default in TelnetAppender #318\n\n- The appender streams the rendered log to any client that connects, with no\n  authentication and no encryption, and defaulted to every interface on port 23.\n- It now defaults to 127.0.0.1. Watching from another machine is opt-in: set\n  listenAddress to 0.0.0.0 or ::. Every documented example already used loopback.\n- SocketHandler(port, sendTimeoutMillis) defaults the same way.\n\nDeliberate default flip: a deployment relying on the implicit all-interfaces\nbind loses remote access until it sets listenAddress.\n\naudit da18b6fd-f012\n"
    },
    {
      "commit": "4286db7407efffc69745fb85cf22800b376b42b4",
      "tree": "5165a9940dc856f83967d3be586a259212626c7e",
      "parents": [
        "4c1120c8796fa722e0ecd3b0385d4cdd4d43404d"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 00:06:35 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Fri Sep 04 00:11:55 2026 +0200"
      },
      "message": "decide filter matches deterministically #317\n\n- Substring matching was culture sensitive, so a NUL, soft hyphen or\n  zero-width space inside StringToMatch still matched. Ordinal now.\n- An abandoned regex match counted as a non-match, so content that\n  forced the timeout could suppress its own record. TimeoutDecision\n  decides it, still Neutral by default.\n- Default deadline 1000ms to 50ms. The match holds the appender lock.\n- StringMatchFilter and PropertyFilter had near-identical Decide\n  bodies, which is why each finding existed twice. Shared now.\n- filters.adoc documented the old deadline and outcome, and had an\n  example restoring the old default. MdcFilter and NdcFilter derive\n  from PropertyFilter and need no change.\n\naudit da18b6fd-f017, da18b6fd-f018, da18b6fd-f041\n"
    },
    {
      "commit": "4c1120c8796fa722e0ecd3b0385d4cdd4d43404d",
      "tree": "f821ad5d892c21b15171af27fa61759246f6a94b",
      "parents": [
        "892cded898ea7b28d44fa1f8659977c08c1926bd"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 23:26:40 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 23:27:14 2026 +0200"
      },
      "message": "cite the audit findings behind the Ext.Mail and syslog work #314\n\nThe Ext.Mail send rework answers f004 and the remote syslog queue and pump work\nanswers f034, but neither pair named the finding. The other five 314 and 315\nentries stay unattributed: they are our own, not audit findings.\n"
    },
    {
      "commit": "892cded898ea7b28d44fa1f8659977c08c1926bd",
      "tree": "94b56f8dfee5b2aaa9194d53d22b7a0c8c130726",
      "parents": [
        "8b44780ad6f0b1bad9bc1a763e29ce404716ab6d"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 23:21:16 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 23:27:14 2026 +0200"
      },
      "message": "credit the fixer in every changelog entry\n\nCLAUDE.md wants the description to close with both sides, who raised it and who\ndid the work. Eleven entries named only the audit finding. Nothing but the\nattribution changed.\n"
    },
    {
      "commit": "8b44780ad6f0b1bad9bc1a763e29ce404716ab6d",
      "tree": "a5b8da538992fe7d68fd65cba0fea8a1a32ba05a",
      "parents": [
        "da4b4af5def0c78ffd5f07279a678bce01431174"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 23:21:08 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 23:27:13 2026 +0200"
      },
      "message": "stop the aspnet-request converter dropping events with rejected content #316\n\n- Reading HttpRequest.Params validates the query string, form and cookies on\n  first access, so a request carrying \u003cscript\u003e threw inside the layout and\n  AppenderSkeleton discarded the whole event: a sender could suppress the log\n  record of their own request.\n- The converter now reads through HttpRequest.Unvalidated, so the content is\n  kept rather than replaced by the not-available marker.\n- The try now also covers the body parse and ServerVariables, which throw on an\n  oversized body or a lost client. Verified on Windows: with no worker request\n  behind it, ServerVariables is empty rather than throwing.\n- Five tests, net462 only, so they run on the Windows leg alone. Reverting the\n  fix fails exactly the two that assert the content survives.\n\naudit da18b6fd-f019\n"
    },
    {
      "commit": "da4b4af5def0c78ffd5f07279a678bce01431174",
      "tree": "3988118234b9d2447623b00b5c2f1a50517960b9",
      "parents": [
        "4d2e10f0908199604b4326f9df6d0b43b871e333"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 22:31:48 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 23:27:13 2026 +0200"
      },
      "message": "stop the ANSI terminal appender dropping empty messages #316\n\n- Logging an empty message threw IndexOutOfRangeException: the branch meant for\n  a one-character message read message[0] without checking there was one.\n- AppenderSkeleton caught it, so the event simply disappeared.\n- The reset codes now go at one computed offset, leaving no short-message branch\n  to get wrong.\n- All ten line-break cases are pinned by test. They carry explicit names because\n  dotnet test --filter cannot see them otherwise; CLAUDE.md records why.\n\naudit da18b6fd-f029\n"
    },
    {
      "commit": "4d2e10f0908199604b4326f9df6d0b43b871e333",
      "tree": "3dda265863823e2fe253d135b5ac92d5fb285e3e",
      "parents": [
        "71743377e975a9bcf27c6214c80afabf93213244"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 00:19:58 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 11:53:37 2026 +0200"
      },
      "message": "escape what the pickup mail writer cannot encode #315\n\nFile.CreateText throws on an unpaired surrogate, which abandoned the whole buffered\nbatch and left a truncated mail for the pickup service to send. Reverting the fix\nleaves the test with a file that exists and is empty.\n\nWriting under the final name stays as it was, with a note why.\n"
    },
    {
      "commit": "71743377e975a9bcf27c6214c80afabf93213244",
      "tree": "e14fc7b2f212ba3128215b8b488a209d3bcfbf46",
      "parents": [
        "e3edfab8bc199870d5861d3e2da1a9e17dbf1dd5"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 00:11:23 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 11:53:37 2026 +0200"
      },
      "message": "record the escaping rule in CLAUDE.md\n\nFour appenders have needed the same two escapes. New ones belong in ContentEscape,\nand escaping comes before any length limit, not after.\n"
    },
    {
      "commit": "e3edfab8bc199870d5861d3e2da1a9e17dbf1dd5",
      "tree": "3a052caced609ee869830d945190793182d775c4",
      "parents": [
        "2998f34044dcc0100fa65035e013b2a58dcf44d8"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 00:11:23 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 11:53:37 2026 +0200"
      },
      "message": "escape what the Telnet writer cannot encode #315\n\nThe default writer encoding threw on an unpaired surrogate, and Send reads a throw\nas a client that hung up, so one event reached nobody and disconnected everybody.\nEscaped as \\uXXXX now; the non-throwing encoding stays as belt and braces.\n"
    },
    {
      "commit": "2998f34044dcc0100fa65035e013b2a58dcf44d8",
      "tree": "e22c7b7f1e29350902707e195b09ba0b23cf96cd",
      "parents": [
        "28fbfb25678c48a8cc5bc9b94ead0dddfc39ffed"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 00:11:12 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 11:53:37 2026 +0200"
      },
      "message": "share the content escapes in ContentEscape #315\n\nThe helper held only the NUL escape. It now also escapes unpaired surrogates,\nwhich f013 needs and f011 will, so the name no longer fitted.\n"
    },
    {
      "commit": "28fbfb25678c48a8cc5bc9b94ead0dddfc39ffed",
      "tree": "f748a313722a56dec1bc2d3cbff3d2b759ce6420",
      "parents": [
        "522064b89e4ec54f4b20d6b5b7fec0cfe400a681"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Wed Sep 02 22:41:04 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 11:53:37 2026 +0200"
      },
      "message": "compute the EventLog size limit instead of guessing it #315\n\nThe limit is a whole record budget, and the log name, the source and the machine\nname are spent from it one character for one. The fixed 31837 sat above the real\nceiling, so log4net truncated to a size the service then discarded: the event was\nlost whole rather than shortened, with no exception and no record.\n\nMeasured on Windows 11 build 26200 over five source name lengths and two log names\nwith no residual: stored while message + logName + applicationName stays within\n31736. One character more and nothing is stored.\n\nApplicationName defaults to the app domain name, so the consumer\u0027s assembly name\ncame out of the budget invisibly. A 1024 margin is held back because crossing the\nline is not one lost message: the write still consumes log space, and a log given\nabout thirty of them was later found reporting a negative record count.\n\nTruncation is now reported through the error handler. There is no channel where\nthe service records a dropped write, so that is the only signal available.\n"
    },
    {
      "commit": "522064b89e4ec54f4b20d6b5b7fec0cfe400a681",
      "tree": "3c827c4f6a82f848c86e0ef8684f22d0aeeebcb1",
      "parents": [
        "77717061b20d4346b6c0ce6b54643d85fb348bc7"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Wed Sep 02 06:23:27 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 11:53:37 2026 +0200"
      },
      "message": "compare ordinally when asserting no NUL survives #315\n\nDoes.Not.Contain is culture sensitive, and a culture sensitive comparison treats\nNUL as ignorable: it reports a match in a string that contains none. Both new\nescape tests therefore failed on Windows against correctly escaped output.\n\nContainsConstraint has no comparison knob at all, so these use\nContains.Substring(x).Using(StringComparison.Ordinal), negated with the ! operator\nConstraint defines. The EventLog test asserts the whole value instead, which is\nordinal and pins the length too.\n\nThis is the shape f018 reports in StringMatchFilter, which is still open.\n"
    },
    {
      "commit": "77717061b20d4346b6c0ce6b54643d85fb348bc7",
      "tree": "68fdf4c3a80371f1e46ef98be905b3344aab8a05",
      "parents": [
        "dc5855a0720c91590fd7a81d729ea01fdd69e000"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Wed Sep 02 00:05:52 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 11:53:37 2026 +0200"
      },
      "message": "escape what RemoteSyslogAppender cannot send instead of deleting it #315\n\nRFC 3164 allows only visible ASCII and space in the message, and everything else\nfell through the loop unwritten. \"Schoenwetter \u003cCJK\u003e\" reached the collector as\n\"Schnwetter \", and a tab vanished from between its neighbours, with no marker and\nno error.\n\nSuch characters are now written as a \\uXXXX escape, which stays inside the allowed\nrange. Encoding still cannot make the message body non-ASCII, which the appender\npage now says.\n"
    },
    {
      "commit": "dc5855a0720c91590fd7a81d729ea01fdd69e000",
      "tree": "0db4191fdc3b18d1795314a504e85306eeafb5f8",
      "parents": [
        "6046fe9d7f353b49fe995361c071ec2eea8f7ef6"
      ],
      "author": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Tue Sep 01 23:57:40 2026 +0200"
      },
      "committer": {
        "name": "Jan Friedrich",
        "email": "freeandnil@apache.org",
        "time": "Thu Sep 03 11:53:37 2026 +0200"
      },
      "message": "escape NUL characters in EventLogAppender content #315\n\nReportEventW takes a null terminated string, so a NUL in logged content ended the\nstored record there and dropped whatever the layout rendered after it. WriteEntry\nraises nothing, so the record simply stored short and no ErrorHandler call fired.\n\nMeasured on Windows 11 build 26200: a 45 character message with a NUL at 23 stored\nas its 23 character prefix.\n\nEscaping happens before the size limit is applied, since it doubles each NUL, and\nPrepareEventText exists so that ordering can be tested without an event log.\n"
    }
  ],
  "next": "6046fe9d7f353b49fe995361c071ec2eea8f7ef6"
}
