@prefix sioc: <http://rdfs.org/sioc/ns#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix content: <http://purl.org/rss/1.0/modules/content/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<https://lhero.org/portfolio/lh-javascript-error-log/>
  a sioc:Post ;
  dc:title "Changelog" ;
  dcterms:identifier 149558 ;
  dc:modified "2026-10-09T11:19:24Z"^^xsd:dateTime ;
  dc:created "2026-10-09T11:19:24Z"^^xsd:dateTime ;
  sioc:link <https://lhero.org/portfolio/lh-javascript-error-log/changelog/> ;
  sioc:has_creator <https://lhero.org/author/1/#account> ;
  sioc:has_container <https://lhero.org/#posts> ;
  content:encoded "<ul class=\"lh_portfolio-meta\"><li><strong>Part of:</strong> <a href=\"https://lhero.org/portfolio/lh-javascript-error-log/\">LH Javascript Error Log</a></li></ul><ul class=\"lh_portfolio-changelog\"><li><strong>3.3.0:</strong> JavaScript errors are now reported through LH Beacon instead of the plugin&#039;s own admin-ajax endpoint, which fixes reports from logged-out visitors being dropped. The old endpoint checked a nonce printed into the page, and on pages served from cache that nonce expires, so reports from those visitors (crawlers especially) failed with a 403 and were lost. Reports now ride on LH Beacon&#039;s shared request when the page is hidden or closed, with no nonce. LH Beacon checks the origin and identifies a logged-in visitor from their login cookie, so the user ID is still recorded. LH Beacon is now required (Requires Plugins: lh-beacon), and without it the script is not loaded. The browser script records each error once (message, source, line, column and stack) and keeps its payload within a byte budget (4096 by default, filterable with lh_js_error_log_return_beacon_budget) by shortening stack traces and then dropping later errors, because LH Beacon refuses a whole request that is too large. The first 20 errors on a page are kept (lh_js_error_log_max_errors_per_beacon). Error signatures are unchanged, so new reports keep counting against existing rows. Extension filtering and the per-IP rate limit are unchanged. The admin-ajax action lh_js_error_log-log_js_errors and the bundled LH_Register_file_class have been removed.</li><li><strong>3.2.1:</strong> Fixes the 3.2.0 upgrade, which never ran: the admin check was hooked to network_admin_init, an action WordPress does not have, and activation can run the previous copy of the code. The table is now upgraded wherever it is about to be used (beacons, cron, MCP calls and admin loads), with a database lock so only one request upgrades it at a time. The upgrade also merges the existing rows that share a signature into one row each, with the summed count, earliest first-seen and latest last-seen, so the counts reflect the history already logged.</li><li><strong>3.2.0:</strong> Repeated errors are now counted instead of logged again. Each distinct error is one row: when it recurs, its error_count goes up, a new last_seen time is recorded, and the page, user agent, user and stack trace are refreshed to the latest occurrence, while the logged time stays as when it was first seen. An error&#039;s signature is now its site, message, source file without its query string (so a ?ver= change no longer splits it), line and column; the page URL is no longer part of it, so the same error on many pages counts as one. Existing rows are rehashed on the new signature when the schema upgrades (schema 7). Errors raised by browser extensions (chrome-extension://, moz-extension:// and similar, filterable through lh_js_error_log_extension_markers) are no longer logged, and existing ones are removed, since they are not ours to fix. The admin list gains sortable Last Seen and Count columns and sorts by Last Seen by default. The daily purge now removes errors not seen for a month, so an error that keeps recurring keeps its count. get-errors and get-error-stats filter by last_seen and accept a new kind filter (exceptions or failed resource loads), and records include last_seen. Adds plugin_version(), read from the plugin header.</li></ul>"^^rdf:XMLLiteral ;
  sioc:content "Part of: LH Javascript Error Log3.3.0: JavaScript errors are now reported through LH Beacon instead of the plugin&#039;s own admin-ajax endpoint, which fixes reports from logged-out visitors being dropped. The old endpoint checked a nonce printed into the page, and on pages served from cache that nonce expires, so reports from those visitors (crawlers especially) failed with a 403 and were lost. Reports now ride on LH Beacon&#039;s shared request when the page is hidden or closed, with no nonce. LH Beacon checks the origin and identifies a logged-in visitor from their login cookie, so the user ID is still recorded. LH Beacon is now required (Requires Plugins: lh-beacon), and without it the script is not loaded. The browser script records each error once (message, source, line, column and stack) and keeps its payload within a byte budget (4096 by default, filterable with lh_js_error_log_return_beacon_budget) by shortening stack traces and then dropping later errors, because LH Beacon refuses a whole request that is too large. The first 20 errors on a page are kept (lh_js_error_log_max_errors_per_beacon). Error signatures are unchanged, so new reports keep counting against existing rows. Extension filtering and the per-IP rate limit are unchanged. The admin-ajax action lh_js_error_log-log_js_errors and the bundled LH_Register_file_class have been removed.3.2.1: Fixes the 3.2.0 upgrade, which never ran: the admin check was hooked to network_admin_init, an action WordPress does not have, and activation can run the previous copy of the code. The table is now upgraded wherever it is about to be used (beacons, cron, MCP calls and admin loads), with a database lock so only one request upgrades it at a time. The upgrade also merges the existing rows that share a signature into one row each, with the summed count, earliest first-seen and latest last-seen, so the counts reflect the history already logged.3.2.0: Repeated errors are now counted instead of logged again. Each distinct error is one row: when it recurs, its error_count goes up, a new last_seen time is recorded, and the page, user agent, user and stack trace are refreshed to the latest occurrence, while the logged time stays as when it was first seen. An error&#039;s signature is now its site, message, source file without its query string (so a ?ver= change no longer splits it), line and column; the page URL is no longer part of it, so the same error on many pages counts as one. Existing rows are rehashed on the new signature when the schema upgrades (schema 7). Errors raised by browser extensions (chrome-extension://, moz-extension:// and similar, filterable through lh_js_error_log_extension_markers) are no longer logged, and existing ones are removed, since they are not ours to fix. The admin list gains sortable Last Seen and Count columns and sorts by Last Seen by default. The daily purge now removes errors not seen for a month, so an error that keeps recurring keeps its count. get-errors and get-error-stats filter by last_seen and accept a new kind filter (exceptions or failed resource loads), and records include last_seen. Adds plugin_version(), read from the plugin header." ;
  sioc:topic <https://lhero.org/?taxonomy=author&term=cap-1> .

<https://lhero.org/author/1/#account> rdfs:seeAlso <https://lhero.org/author/1/?feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=author&term=cap-1> rdfs:seeAlso <https://lhero.org/?taxonomy=author&term=cap-1&feed=lhrdf&format=turtle> .
