From 710af8258f03547284c5a87e4d68942d3bb6142f Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 28 Oct 2024 22:16:37 +0100 Subject: [PATCH 01/18] moved /src/site to /site.legacy --- {src/site => site.legacy}/apt/roadmap.apt | 0 .../resources/css/bootstrap.css | 0 .../resources/css/bootstrap.min.css | 0 {src/site => site.legacy}/resources/css/site.css | 0 .../site => site.legacy}/resources/doap_log4net.rdf | 0 .../resources/images/collapsed.gif | Bin .../resources/images/expanded.gif | Bin .../resources/images/ls-logo.jpg | Bin .../site => site.legacy}/resources/images/maven.png | Bin .../resources/img/glyphicons-halflings-white.png | Bin .../resources/img/glyphicons-halflings.png | Bin {src/site => site.legacy}/resources/js/bootstrap.js | 0 .../resources/js/bootstrap.min.js | 0 {src/site => site.legacy}/resources/js/jquery.js | 0 .../site => site.legacy}/resources/js/jquery.min.js | 0 {src/site => site.legacy}/resources/js/prettify.js | 0 .../resources/js/prettify.min.js | 0 {src/site => site.legacy}/resources/js/site.js | 0 {src/site => site.legacy}/site.vm | 0 {src/site => site.legacy}/site.xml | 0 {src/site => site.legacy}/xdoc/history.xml | 0 {src/site => site.legacy}/xdoc/index.xml | 0 {src/site => site.legacy}/xdoc/release/building.xml | 0 .../xdoc/release/config-examples.xml | 0 {src/site => site.legacy}/xdoc/release/download.xml | 0 .../xdoc/release/example-apps.xml | 0 {src/site => site.legacy}/xdoc/release/faq.xml | 0 {src/site => site.legacy}/xdoc/release/features.xml | 0 .../xdoc/release/framework-support.xml | 0 .../xdoc/release/manual/configuration.xml | 0 .../xdoc/release/manual/contexts.xml | 0 .../xdoc/release/manual/installation.xml | 0 .../xdoc/release/manual/internals.xml | 0 .../xdoc/release/manual/introduction.xml | 0 .../xdoc/release/manual/plugins.xml | 0 .../xdoc/release/manual/repositories.xml | 0 .../xdoc/release/release-notes.xml | 0 .../xdoc/release/release-review-instructions.xml | 0 38 files changed, 0 insertions(+), 0 deletions(-) rename {src/site => site.legacy}/apt/roadmap.apt (100%) rename {src/site => site.legacy}/resources/css/bootstrap.css (100%) rename {src/site => site.legacy}/resources/css/bootstrap.min.css (100%) rename {src/site => site.legacy}/resources/css/site.css (100%) rename {src/site => site.legacy}/resources/doap_log4net.rdf (100%) rename {src/site => site.legacy}/resources/images/collapsed.gif (100%) rename {src/site => site.legacy}/resources/images/expanded.gif (100%) rename {src/site => site.legacy}/resources/images/ls-logo.jpg (100%) rename {src/site => site.legacy}/resources/images/maven.png (100%) rename {src/site => site.legacy}/resources/img/glyphicons-halflings-white.png (100%) rename {src/site => site.legacy}/resources/img/glyphicons-halflings.png (100%) rename {src/site => site.legacy}/resources/js/bootstrap.js (100%) rename {src/site => site.legacy}/resources/js/bootstrap.min.js (100%) rename {src/site => site.legacy}/resources/js/jquery.js (100%) rename {src/site => site.legacy}/resources/js/jquery.min.js (100%) rename {src/site => site.legacy}/resources/js/prettify.js (100%) rename {src/site => site.legacy}/resources/js/prettify.min.js (100%) rename {src/site => site.legacy}/resources/js/site.js (100%) rename {src/site => site.legacy}/site.vm (100%) rename {src/site => site.legacy}/site.xml (100%) rename {src/site => site.legacy}/xdoc/history.xml (100%) rename {src/site => site.legacy}/xdoc/index.xml (100%) rename {src/site => site.legacy}/xdoc/release/building.xml (100%) rename {src/site => site.legacy}/xdoc/release/config-examples.xml (100%) rename {src/site => site.legacy}/xdoc/release/download.xml (100%) rename {src/site => site.legacy}/xdoc/release/example-apps.xml (100%) rename {src/site => site.legacy}/xdoc/release/faq.xml (100%) rename {src/site => site.legacy}/xdoc/release/features.xml (100%) rename {src/site => site.legacy}/xdoc/release/framework-support.xml (100%) rename {src/site => site.legacy}/xdoc/release/manual/configuration.xml (100%) rename {src/site => site.legacy}/xdoc/release/manual/contexts.xml (100%) rename {src/site => site.legacy}/xdoc/release/manual/installation.xml (100%) rename {src/site => site.legacy}/xdoc/release/manual/internals.xml (100%) rename {src/site => site.legacy}/xdoc/release/manual/introduction.xml (100%) rename {src/site => site.legacy}/xdoc/release/manual/plugins.xml (100%) rename {src/site => site.legacy}/xdoc/release/manual/repositories.xml (100%) rename {src/site => site.legacy}/xdoc/release/release-notes.xml (100%) rename {src/site => site.legacy}/xdoc/release/release-review-instructions.xml (100%) diff --git a/src/site/apt/roadmap.apt b/site.legacy/apt/roadmap.apt similarity index 100% rename from src/site/apt/roadmap.apt rename to site.legacy/apt/roadmap.apt diff --git a/src/site/resources/css/bootstrap.css b/site.legacy/resources/css/bootstrap.css similarity index 100% rename from src/site/resources/css/bootstrap.css rename to site.legacy/resources/css/bootstrap.css diff --git a/src/site/resources/css/bootstrap.min.css b/site.legacy/resources/css/bootstrap.min.css similarity index 100% rename from src/site/resources/css/bootstrap.min.css rename to site.legacy/resources/css/bootstrap.min.css diff --git a/src/site/resources/css/site.css b/site.legacy/resources/css/site.css similarity index 100% rename from src/site/resources/css/site.css rename to site.legacy/resources/css/site.css diff --git a/src/site/resources/doap_log4net.rdf b/site.legacy/resources/doap_log4net.rdf similarity index 100% rename from src/site/resources/doap_log4net.rdf rename to site.legacy/resources/doap_log4net.rdf diff --git a/src/site/resources/images/collapsed.gif b/site.legacy/resources/images/collapsed.gif similarity index 100% rename from src/site/resources/images/collapsed.gif rename to site.legacy/resources/images/collapsed.gif diff --git a/src/site/resources/images/expanded.gif b/site.legacy/resources/images/expanded.gif similarity index 100% rename from src/site/resources/images/expanded.gif rename to site.legacy/resources/images/expanded.gif diff --git a/src/site/resources/images/ls-logo.jpg b/site.legacy/resources/images/ls-logo.jpg similarity index 100% rename from src/site/resources/images/ls-logo.jpg rename to site.legacy/resources/images/ls-logo.jpg diff --git a/src/site/resources/images/maven.png b/site.legacy/resources/images/maven.png similarity index 100% rename from src/site/resources/images/maven.png rename to site.legacy/resources/images/maven.png diff --git a/src/site/resources/img/glyphicons-halflings-white.png b/site.legacy/resources/img/glyphicons-halflings-white.png similarity index 100% rename from src/site/resources/img/glyphicons-halflings-white.png rename to site.legacy/resources/img/glyphicons-halflings-white.png diff --git a/src/site/resources/img/glyphicons-halflings.png b/site.legacy/resources/img/glyphicons-halflings.png similarity index 100% rename from src/site/resources/img/glyphicons-halflings.png rename to site.legacy/resources/img/glyphicons-halflings.png diff --git a/src/site/resources/js/bootstrap.js b/site.legacy/resources/js/bootstrap.js similarity index 100% rename from src/site/resources/js/bootstrap.js rename to site.legacy/resources/js/bootstrap.js diff --git a/src/site/resources/js/bootstrap.min.js b/site.legacy/resources/js/bootstrap.min.js similarity index 100% rename from src/site/resources/js/bootstrap.min.js rename to site.legacy/resources/js/bootstrap.min.js diff --git a/src/site/resources/js/jquery.js b/site.legacy/resources/js/jquery.js similarity index 100% rename from src/site/resources/js/jquery.js rename to site.legacy/resources/js/jquery.js diff --git a/src/site/resources/js/jquery.min.js b/site.legacy/resources/js/jquery.min.js similarity index 100% rename from src/site/resources/js/jquery.min.js rename to site.legacy/resources/js/jquery.min.js diff --git a/src/site/resources/js/prettify.js b/site.legacy/resources/js/prettify.js similarity index 100% rename from src/site/resources/js/prettify.js rename to site.legacy/resources/js/prettify.js diff --git a/src/site/resources/js/prettify.min.js b/site.legacy/resources/js/prettify.min.js similarity index 100% rename from src/site/resources/js/prettify.min.js rename to site.legacy/resources/js/prettify.min.js diff --git a/src/site/resources/js/site.js b/site.legacy/resources/js/site.js similarity index 100% rename from src/site/resources/js/site.js rename to site.legacy/resources/js/site.js diff --git a/src/site/site.vm b/site.legacy/site.vm similarity index 100% rename from src/site/site.vm rename to site.legacy/site.vm diff --git a/src/site/site.xml b/site.legacy/site.xml similarity index 100% rename from src/site/site.xml rename to site.legacy/site.xml diff --git a/src/site/xdoc/history.xml b/site.legacy/xdoc/history.xml similarity index 100% rename from src/site/xdoc/history.xml rename to site.legacy/xdoc/history.xml diff --git a/src/site/xdoc/index.xml b/site.legacy/xdoc/index.xml similarity index 100% rename from src/site/xdoc/index.xml rename to site.legacy/xdoc/index.xml diff --git a/src/site/xdoc/release/building.xml b/site.legacy/xdoc/release/building.xml similarity index 100% rename from src/site/xdoc/release/building.xml rename to site.legacy/xdoc/release/building.xml diff --git a/src/site/xdoc/release/config-examples.xml b/site.legacy/xdoc/release/config-examples.xml similarity index 100% rename from src/site/xdoc/release/config-examples.xml rename to site.legacy/xdoc/release/config-examples.xml diff --git a/src/site/xdoc/release/download.xml b/site.legacy/xdoc/release/download.xml similarity index 100% rename from src/site/xdoc/release/download.xml rename to site.legacy/xdoc/release/download.xml diff --git a/src/site/xdoc/release/example-apps.xml b/site.legacy/xdoc/release/example-apps.xml similarity index 100% rename from src/site/xdoc/release/example-apps.xml rename to site.legacy/xdoc/release/example-apps.xml diff --git a/src/site/xdoc/release/faq.xml b/site.legacy/xdoc/release/faq.xml similarity index 100% rename from src/site/xdoc/release/faq.xml rename to site.legacy/xdoc/release/faq.xml diff --git a/src/site/xdoc/release/features.xml b/site.legacy/xdoc/release/features.xml similarity index 100% rename from src/site/xdoc/release/features.xml rename to site.legacy/xdoc/release/features.xml diff --git a/src/site/xdoc/release/framework-support.xml b/site.legacy/xdoc/release/framework-support.xml similarity index 100% rename from src/site/xdoc/release/framework-support.xml rename to site.legacy/xdoc/release/framework-support.xml diff --git a/src/site/xdoc/release/manual/configuration.xml b/site.legacy/xdoc/release/manual/configuration.xml similarity index 100% rename from src/site/xdoc/release/manual/configuration.xml rename to site.legacy/xdoc/release/manual/configuration.xml diff --git a/src/site/xdoc/release/manual/contexts.xml b/site.legacy/xdoc/release/manual/contexts.xml similarity index 100% rename from src/site/xdoc/release/manual/contexts.xml rename to site.legacy/xdoc/release/manual/contexts.xml diff --git a/src/site/xdoc/release/manual/installation.xml b/site.legacy/xdoc/release/manual/installation.xml similarity index 100% rename from src/site/xdoc/release/manual/installation.xml rename to site.legacy/xdoc/release/manual/installation.xml diff --git a/src/site/xdoc/release/manual/internals.xml b/site.legacy/xdoc/release/manual/internals.xml similarity index 100% rename from src/site/xdoc/release/manual/internals.xml rename to site.legacy/xdoc/release/manual/internals.xml diff --git a/src/site/xdoc/release/manual/introduction.xml b/site.legacy/xdoc/release/manual/introduction.xml similarity index 100% rename from src/site/xdoc/release/manual/introduction.xml rename to site.legacy/xdoc/release/manual/introduction.xml diff --git a/src/site/xdoc/release/manual/plugins.xml b/site.legacy/xdoc/release/manual/plugins.xml similarity index 100% rename from src/site/xdoc/release/manual/plugins.xml rename to site.legacy/xdoc/release/manual/plugins.xml diff --git a/src/site/xdoc/release/manual/repositories.xml b/site.legacy/xdoc/release/manual/repositories.xml similarity index 100% rename from src/site/xdoc/release/manual/repositories.xml rename to site.legacy/xdoc/release/manual/repositories.xml diff --git a/src/site/xdoc/release/release-notes.xml b/site.legacy/xdoc/release/release-notes.xml similarity index 100% rename from src/site/xdoc/release/release-notes.xml rename to site.legacy/xdoc/release/release-notes.xml diff --git a/src/site/xdoc/release/release-review-instructions.xml b/site.legacy/xdoc/release/release-review-instructions.xml similarity index 100% rename from src/site/xdoc/release/release-review-instructions.xml rename to site.legacy/xdoc/release/release-review-instructions.xml From 7e7631f8d50896a341c58444cbd0517960a5cdeb Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 28 Oct 2024 22:26:50 +0100 Subject: [PATCH 02/18] first step for antora support --- .flattened-pom.xml | 143 ++ .mvn/jvm.config | 13 + .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 62547 bytes .mvn/wrapper/maven-wrapper.properties | 18 + antora-playbook.yaml | 141 ++ mvnw | 311 ++++ mvnw.cmd | 212 +++ package-lock.json | 1411 ++++++++++++++++- package.json | 5 +- pom.xml | 329 ++-- rat.excludesFile | 7 +- src/changelog/.changelog.adoc.ftl | 27 + src/changelog/.index.adoc.ftl | 44 + src/changelog/0.1.0/.release-notes.adoc.ftl | 43 + src/changelog/0.1.0/.release.xml | 6 + ...28_add_tools_bom_and_changelog_modules.xml | 8 + .../Appender/Internal/SimpleTelnetClient.cs | 21 + src/site/antora/antora.tmpl.yml | 50 + src/site/antora/antora.yml | 50 + src/site/antora/modules/ROOT/nav.adoc | 28 + .../modules/ROOT/pages/development.adoc | 44 + src/site/antora/modules/ROOT/pages/index.adoc | 52 + .../pages/log4j-changelog-maven-plugin.adoc | 157 ++ .../modules/ROOT/pages/log4j-changelog.adoc | 278 ++++ .../log4j-docgen-asciidoctor-extension.adoc | 62 + .../ROOT/pages/log4j-docgen-maven-plugin.adoc | 116 ++ .../modules/ROOT/pages/log4j-docgen.adoc | 110 ++ .../modules/ROOT/pages/release-notes.adoc | 21 + 28 files changed, 3456 insertions(+), 251 deletions(-) create mode 100644 .flattened-pom.xml create mode 100644 .mvn/jvm.config create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 antora-playbook.yaml create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 src/changelog/.changelog.adoc.ftl create mode 100644 src/changelog/.index.adoc.ftl create mode 100644 src/changelog/0.1.0/.release-notes.adoc.ftl create mode 100644 src/changelog/0.1.0/.release.xml create mode 100644 src/changelog/0.1.0/LOG4J2-3628_add_tools_bom_and_changelog_modules.xml create mode 100644 src/site/antora/antora.tmpl.yml create mode 100644 src/site/antora/antora.yml create mode 100644 src/site/antora/modules/ROOT/nav.adoc create mode 100644 src/site/antora/modules/ROOT/pages/development.adoc create mode 100644 src/site/antora/modules/ROOT/pages/index.adoc create mode 100644 src/site/antora/modules/ROOT/pages/log4j-changelog-maven-plugin.adoc create mode 100644 src/site/antora/modules/ROOT/pages/log4j-changelog.adoc create mode 100644 src/site/antora/modules/ROOT/pages/log4j-docgen-asciidoctor-extension.adoc create mode 100644 src/site/antora/modules/ROOT/pages/log4j-docgen-maven-plugin.adoc create mode 100644 src/site/antora/modules/ROOT/pages/log4j-docgen.adoc create mode 100644 src/site/antora/modules/ROOT/pages/release-notes.adoc diff --git a/.flattened-pom.xml b/.flattened-pom.xml new file mode 100644 index 00000000..b22b2912 --- /dev/null +++ b/.flattened-pom.xml @@ -0,0 +1,143 @@ + + + + 4.0.0 + + org.apache.logging + logging-parent + 11.0.0 + + org.apache.logging.log4j + log4j-tools-bom + 0.10.0-SNAPSHOT + pom + Parent project internally used in Maven-based projects of the Apache Logging Services + https://logging.apache.org/log4j/tools + 2022 + + The Apache Software Foundation + https://www.apache.org/ + + + + Apache-2.0 + https://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + ggregory + Gary Gregory + ggregory@apache.org + https://www.garygregory.com + The Apache Software Foundation + https://www.apache.org/ + + PMC Member + + America/New_York + + + grobmeier + Christian Grobmeier + grobmeier@apache.org + + PMC Member + + Europe/Berlin + + + mattsicker + Matt Sicker + mattsicker@apache.org + Apple + + PMC Member + + America/Chicago + + + pkarwasz + Piotr P. Karwasz + pkarwasz@apache.org + + PMC Member + + Europe/Warsaw + + + vy + Volkan Yazıcı + vy@apache.org + + PMC Chair + + Europe/Amsterdam + + + + + log4j-user + log4j-user-subscribe@logging.apache.org + log4j-user-unsubscribe@logging.apache.org + log4j-user@logging.apache.org + https://lists.apache.org/list.html?log4j-user@logging.apache.org + + + dev + dev-subscribe@logging.apache.org + dev-unsubscribe@logging.apache.org + dev@logging.apache.org + https://lists.apache.org/list.html?dev@logging.apache.org + + + + scm:git:git@github.com:apache/logging-log4j-tools.git + scm:git:git@github.com:apache/logging-log4j-tools.git + https://github.com/apache/logging-log4j-tools + + + GitHub Issues + https://github.com/apache/logging-log4j-tools/issues + + + GitHub Actions + https://github.com/apache/logging-log4j-tools/actions + + + + + org.apache.logging.log4j + log4j-changelog + 0.10.0-SNAPSHOT + + + org.apache.logging.log4j + log4j-docgen + 0.10.0-SNAPSHOT + + + org.apache.logging.log4j + log4j-docgen-asciidoctor-extension + 0.10.0-SNAPSHOT + + + + diff --git a/.mvn/jvm.config b/.mvn/jvm.config new file mode 100644 index 00000000..45a03401 --- /dev/null +++ b/.mvn/jvm.config @@ -0,0 +1,13 @@ +-Djava.awt.headless=true +--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED +--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED +--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED +--add-opens java.base/sun.nio.ch=ALL-UNNAMED +--add-opens java.base/java.io=ALL-UNNAMED diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cb28b0e37c7d206feb564310fdeec0927af4123a GIT binary patch literal 62547 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 A?*IS* literal 0 HcmV?d00001 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..08ea486a --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.0/apache-maven-3.9.0-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/antora-playbook.yaml b/antora-playbook.yaml new file mode 100644 index 00000000..a878afa4 --- /dev/null +++ b/antora-playbook.yaml @@ -0,0 +1,141 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +site: + title: Apache Log4j Tools + url: "https://logging.apache.org/log4j/kotlin" + start_page: "ROOT::index.adoc" + +content: + sources: + - url: . + branches: HEAD + start_paths: + - target/generated-site/antora + edit_url: + +runtime: + log: + # Fail on warnings + failure_level: warn + +asciidoc: + extensions: + - "@asciidoctor/tabs" + +ui: + + bundle: + url: "https://gitlab.com/antora/antora-ui-default/-/jobs/artifacts/HEAD/raw/build/ui-bundle.zip?job=bundle-stable" + snapshot: true + + # Template files: https://github.com/asciidoctor/asciidoctor-docs-ui/blob/main/src + # Template variables: https://docs.antora.org/antora-ui-default/templates + supplemental_files: + + # Add `@asciidoctor/tabs` extension styles + - path: css/vendor/tabs.css + contents: ./node_modules/@asciidoctor/tabs/dist/css/tabs.css + + # Add `@asciidoctor/tabs` extension scripts + - path: js/vendor/tabs.js + contents: ./node_modules/@asciidoctor/tabs/dist/js/tabs.js + + - path: partials/footer-scripts.hbs + contents: | + + + + + {{#if env.SITE_SEARCH_PROVIDER}} + {{> search-scripts}} + {{/if}} + + - path: partials/head-styles.hbs + contents: | + + + + + + + - path: partials/header-content.hbs + contents: | +
+ +
+ + - path: partials/footer-content.hbs + contents: | +
+

+ Copyright © 1999-{{{year}}} The Apache Software Foundation. + Licensed under the Apache Software License, Version 2.0. + Please read our privacy policy. +

+

+ Apache, Log4j, and the Apache feather logo are trademarks or registered trademarks of The Apache Software Foundation. + Oracle and Java are registered trademarks of Oracle and/or its affiliates. + Other names may be trademarks of their respective owners. +

+
+ + # Disable component version selector + - path: partials/nav-explore.hbs + contents: "" + + # Fix the `Edit this page` link + - path: partials/edit-this-page.hbs + contents: | + diff --git a/mvnw b/mvnw new file mode 100644 index 00000000..af46563a --- /dev/null +++ b/mvnw @@ -0,0 +1,311 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +LINE_SEPARATOR=" +" + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + "-Dline.separator=$LINE_SEPARATOR" \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 00000000..3cb089f4 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,212 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* +@REM Do not remove the blank lines +(set \n=^^^ + +^ + +) + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -Dline.separator=%\n% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/package-lock.json b/package-lock.json index 41fed7e6..ef584e06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,17 @@ { "name": "log4net", - "version": "2.0.12", + "version": "3.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "log4net", - "version": "2.0.12", + "version": "3.0.3", "license": "Apache-2.0", "devDependencies": { + "@antora/cli": "^3.2.0-alpha.4", + "@antora/site-generator-default": "^3.2.0-alpha.4", + "@asciidoctor/tabs": "^1.0.0-beta.6", "cross-env": "^7.0.2", "gulp-debug": "^4.0.0", "gulp-rename": "^2.0.0", @@ -22,6 +25,499 @@ "zarro": "^1.178.0" } }, + "node_modules/@antora/asciidoc-loader": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.2.0-alpha.6.tgz", + "integrity": "sha512-nxHlNCMrtzdhkNUItSQwItsusY2ZorZsmcywgr+dLf35aqrjdCH9xGT7ai09vjbuCNn6Die81Nwx5wMiO3YXog==", + "dev": true, + "dependencies": { + "@antora/logger": "3.2.0-alpha.6", + "@antora/user-require-helper": "~2.0", + "@asciidoctor/core": "~2.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/cli": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.2.0-alpha.6.tgz", + "integrity": "sha512-9sVQUM9grAdBnJooM0eoOjZ4pYEAjsbvjzkqSyDjPtWl7ullY3xnPXD/DK8RACYBjMwSOXqURar4NZWV5EwbdQ==", + "dev": true, + "dependencies": { + "@antora/logger": "3.2.0-alpha.6", + "@antora/playbook-builder": "3.2.0-alpha.6", + "@antora/user-require-helper": "~2.0", + "commander": "~12.1" + }, + "bin": { + "antora": "bin/antora" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/cli/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@antora/content-aggregator": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.2.0-alpha.6.tgz", + "integrity": "sha512-8Sva2aJUl1ab6/DrSgE3Tuu3mvNSFAJdJQCDHC20kQJvZHjpzDccpCom3CdcdsPkFndBAH4K40OOIxftotQKZQ==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~2.0", + "@antora/logger": "3.2.0-alpha.6", + "@antora/user-require-helper": "~2.0", + "braces": "~3.0", + "cache-directory": "~2.0", + "fast-glob": "~3.3", + "hpagent": "~1.2", + "isomorphic-git": "~1.25", + "js-yaml": "~4.1", + "multi-progress": "~4.0", + "picomatch": "~4.0", + "progress": "~2.0", + "should-proxy": "~1.0", + "simple-get": "~4.0", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/content-aggregator/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@antora/content-aggregator/node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@antora/content-aggregator/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@antora/content-classifier": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.2.0-alpha.6.tgz", + "integrity": "sha512-RAE4fmykoGIC+8oAr6rXLKfTzIwaPGmmtOjjm1qf0ZWxuE0NIdP1PLuQ9/Sz0/3Z5x8OwPJlNJeccA3R/zHpwQ==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.2.0-alpha.6", + "@antora/logger": "3.2.0-alpha.6", + "mime-types": "~2.1", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/content-classifier/node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@antora/content-classifier/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@antora/document-converter": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.2.0-alpha.6.tgz", + "integrity": "sha512-qDjGK/rg/zBTWjmIHd6S4YL7g/DNl3B5CRlHZGV0LC1qGmzvM6LltDUv4w9W342/9wGDmYu25GivOKQsuPqbTQ==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.2.0-alpha.6" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/expand-path-helper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@antora/expand-path-helper/-/expand-path-helper-2.0.0.tgz", + "integrity": "sha512-CSMBGC+tI21VS2kGW3PV7T2kQTM5eT3f2GTPVLttwaNYbNxDve08en/huzszHJfxo11CcEs26Ostr0F2c1QqeA==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@antora/file-publisher": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.2.0-alpha.6.tgz", + "integrity": "sha512-XsgPP3uPSYEmLr9yBhBJUF7AZglqsuuZAhYjqAVzIwYG+fWtmMxuiF3CE2I7k7POKaL+xfiA2YfgS+5Xm/wsTQ==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~2.0", + "@antora/user-require-helper": "~2.0", + "vinyl": "~3.0", + "yazl": "~2.5" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/file-publisher/node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@antora/file-publisher/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@antora/logger": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.2.0-alpha.6.tgz", + "integrity": "sha512-8QZh+iHgqVZVWoS/oQ9w92kRyezQVm1j9UE5crVtsJK1bJc75RZOUQUBCCwxOKto+Ci8jCcZvdcpTMz023UkTg==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~2.0", + "pino": "~9.2", + "pino-pretty": "~11.2", + "sonic-boom": "~4.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/navigation-builder": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.2.0-alpha.6.tgz", + "integrity": "sha512-rFpMCGeuaBJmGLkhM3t9NhMiJH2X3uIg48YCaYtJkxsgX6MPFxF+nS08RygvWke1RsBfe896L2pqVrcgs2M2Xw==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.2.0-alpha.6" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/page-composer": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.2.0-alpha.6.tgz", + "integrity": "sha512-UA6s1m2qhyzX6WnWhXzLq/5MrGbB5/2PjPo+A1zUTzRfZmSIULjNzHDWj3KoYP8tQuUMbbyMnJmV4VV7ZhqD1w==", + "dev": true, + "dependencies": { + "@antora/logger": "3.2.0-alpha.6", + "handlebars": "~4.7", + "require-from-string": "~2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/playbook-builder": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.2.0-alpha.6.tgz", + "integrity": "sha512-d2nVNl5PWxiotvkLwhYeEphgDO8yh8FkePOZHtLAxKkAiieQRf/nretHMQNE+B9/l7pPPb6E6V+SDeCxa6Jb+g==", + "dev": true, + "dependencies": { + "@iarna/toml": "~2.2", + "convict": "~6.2", + "js-yaml": "~4.1", + "json5": "~2.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/redirect-producer": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.2.0-alpha.6.tgz", + "integrity": "sha512-PjfGPWak5oT/ehWJsbAsD5B/Yisl5DuB7gDPP5JWbK/4VrfepkpZodBolVMNs1G7ieThJDfkTZEG5K3fq1BVfg==", + "dev": true, + "dependencies": { + "vinyl": "~3.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/redirect-producer/node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@antora/redirect-producer/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@antora/site-generator": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.2.0-alpha.6.tgz", + "integrity": "sha512-ECVq7XarGturr88oQ85AL8T8NE/UDfaNoUkns0cqN3bXAnBfWMRAqVh/LN5e5WmW6oCyXgmaH2eVlxhZ02PISA==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.2.0-alpha.6", + "@antora/content-aggregator": "3.2.0-alpha.6", + "@antora/content-classifier": "3.2.0-alpha.6", + "@antora/document-converter": "3.2.0-alpha.6", + "@antora/file-publisher": "3.2.0-alpha.6", + "@antora/logger": "3.2.0-alpha.6", + "@antora/navigation-builder": "3.2.0-alpha.6", + "@antora/page-composer": "3.2.0-alpha.6", + "@antora/playbook-builder": "3.2.0-alpha.6", + "@antora/redirect-producer": "3.2.0-alpha.6", + "@antora/site-mapper": "3.2.0-alpha.6", + "@antora/site-publisher": "3.2.0-alpha.6", + "@antora/ui-loader": "3.2.0-alpha.6", + "@antora/user-require-helper": "~2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/site-generator-default": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.2.0-alpha.6.tgz", + "integrity": "sha512-CKa4042ltQ3ZuWtoDKPa6CAPlwtSRFZH4GCByofhjZ2Xpey3KzIaxose9ewUdLvvrzk4tP+Ub/gtQYp0sNqnrw==", + "dev": true, + "dependencies": { + "@antora/site-generator": "3.2.0-alpha.6" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/site-mapper": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.2.0-alpha.6.tgz", + "integrity": "sha512-4ads+/5o2JcNWhxZZmbaaOMQdnD6EnjjaTmkFQj/VUCmlUo6p8TkjxW0xDEFBLztVDHMeoZ9R+czNcvPyoc8Fw==", + "dev": true, + "dependencies": { + "@antora/content-classifier": "3.2.0-alpha.6", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/site-mapper/node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@antora/site-mapper/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@antora/site-publisher": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.2.0-alpha.6.tgz", + "integrity": "sha512-Sh2iMuwmv1xvWcuHEVhU40odmxWXmnjPMzWDHcKMMZtiqVF/eZQyIbY3vuumdF5aIwyyqZxNTQQVRH15Z6RbOg==", + "dev": true, + "dependencies": { + "@antora/file-publisher": "3.2.0-alpha.6" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/ui-loader": { + "version": "3.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.2.0-alpha.6.tgz", + "integrity": "sha512-PlIKJLGwxOr5apt+EJ10R8RGz66pjdEns1hPYEwLAorXyPPidGYy+hsMKcBWvI8PdL9OAgw82xI8I4TjW+C6VQ==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~2.0", + "braces": "~3.0", + "cache-directory": "~2.0", + "fast-glob": "~3.3", + "hpagent": "~1.2", + "js-yaml": "~4.1", + "picomatch": "~4.0", + "should-proxy": "~1.0", + "simple-get": "~4.0", + "vinyl": "~3.0", + "yauzl": "~3.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@antora/ui-loader/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@antora/ui-loader/node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@antora/ui-loader/node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@antora/ui-loader/node_modules/yauzl": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.1.3.tgz", + "integrity": "sha512-JCCdmlJJWv7L0q/KylOekyRaUrdEoUxWkWVcgorosTROCFWiS9p2NNPE9Yb91ak7b1N5SxAZEliWpspbZccivw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@antora/user-require-helper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@antora/user-require-helper/-/user-require-helper-2.0.0.tgz", + "integrity": "sha512-5fMfBZfw4zLoFdDAPMQX6Frik90uvfD8rXOA4UpXPOUikkX4uT1Rk6m0/4oi8oS3fcjiIl0k/7Nc+eTxW5TcQQ==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~2.0" + }, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@asciidoctor/core": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.8.tgz", + "integrity": "sha512-oozXk7ZO1RAd/KLFLkKOhqTcG4GO3CV44WwOFg2gMcCsqCUTarvMT7xERIoWW2WurKbB0/ce+98r01p8xPOlBw==", + "dev": true, + "dependencies": { + "asciidoctor-opal-runtime": "0.3.3", + "unxhr": "1.0.1" + }, + "engines": { + "node": ">=8.11", + "npm": ">=5.0.0", + "yarn": ">=1.1.0" + } + }, + "node_modules/@asciidoctor/tabs": { + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@asciidoctor/tabs/-/tabs-1.0.0-beta.6.tgz", + "integrity": "sha512-gGZnW7UfRXnbiyKNd9PpGKtSuD8+DsqaaTSbQ1dHVkZ76NaolLhdQg8RW6/xqN3pX1vWZEcF4e81+Oe9rNRWxg==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@gulpjs/messages": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz", @@ -43,6 +539,12 @@ "node": ">=10.13.0" } }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -288,6 +790,18 @@ "node": ">=10.0.0" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -405,6 +919,12 @@ "node": ">= 8" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -621,6 +1141,37 @@ "node": ">=8" } }, + "node_modules/asciidoctor-opal-runtime": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/asciidoctor-opal-runtime/-/asciidoctor-opal-runtime-0.3.3.tgz", + "integrity": "sha512-/CEVNiOia8E5BMO9FLooo+Kv18K4+4JBFRJp8vUy/N5dMRAg+fRNV4HA+o6aoSC79jVU/aT5XvUpxSxSsTS8FQ==", + "dev": true, + "dependencies": { + "glob": "7.1.3", + "unxhr": "1.0.1" + }, + "engines": { + "node": ">=8.11" + } + }, + "node_modules/asciidoctor-opal-runtime/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -662,6 +1213,12 @@ "node": ">= 10.13.0" } }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "dev": true + }, "node_modules/async-settle": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz", @@ -680,6 +1237,15 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -879,6 +1445,18 @@ "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==", "dev": true }, + "node_modules/cache-directory": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cache-directory/-/cache-directory-2.0.0.tgz", + "integrity": "sha512-7YKEapH+2Uikde8hySyfobXBqPKULDyHNl/lhKm7cKf/GJFdG/tU/WpLrOg2y9aUrQrWUilYqawFIiGJPS6gDA==", + "dev": true, + "dependencies": { + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -969,6 +1547,12 @@ "fsevents": "~2.3.2" } }, + "node_modules/clean-git-ref": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", + "dev": true + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -1069,6 +1653,12 @@ "color-support": "bin.js" } }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1099,6 +1689,19 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/convict": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.2.4.tgz", + "integrity": "sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ==", + "dev": true, + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^20.2.7" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/copy-props": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz", @@ -1127,6 +1730,18 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/cross-env": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", @@ -1180,6 +1795,15 @@ "node": ">=0.10" } }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1213,7 +1837,22 @@ "strip-dirs": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decompress-tar": { @@ -1399,6 +2038,12 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "node_modules/diff3": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", + "dev": true + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1557,6 +2202,24 @@ "through": "^2.3.8" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/exec-step": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/exec-step/-/exec-step-0.14.0.tgz", @@ -1633,6 +2296,12 @@ "node": ">= 0.10" } }, + "node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "dev": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1646,9 +2315,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -1658,7 +2327,7 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -1676,6 +2345,21 @@ "fastest-levenshtein": "^1.0.7" } }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -2502,16 +3186,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gulp-zip/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/gulplog": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz", @@ -2524,6 +3198,27 @@ "node": ">= 10.13.0" } }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2640,6 +3335,12 @@ "node": ">= 0.4" } }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "dev": true + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -2658,6 +3359,15 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, + "node_modules/hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -3154,12 +3864,81 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic-git": { + "version": "1.25.10", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.10.tgz", + "integrity": "sha512-IxGiaKBwAdcgBXwIcxJU6rHLk+NrzYaaPKXXQffcA0GW3IUrQXdUPDXDo+hkGVcYruuz/7JlGBiuaeTCgIgivQ==", + "dev": true, + "dependencies": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^3.4.0", + "sha.js": "^2.4.9", + "simple-get": "^4.0.1" + }, + "bin": { + "isogit": "cli.cjs" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/isomorphic-git/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/isomorphic-git/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -3190,6 +3969,18 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -3292,6 +4083,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, "node_modules/lodash.defaultsdeep": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", @@ -3405,6 +4202,18 @@ "node": ">= 0.6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3423,12 +4232,30 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "node_modules/minimisted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", + "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/multi-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multi-progress/-/multi-progress-4.0.0.tgz", + "integrity": "sha512-9zcjyOou3FFCKPXsmkbC3ethv51SFPoA4dJD6TscIp2pUmy26kBDZW6h9XofPELrzseSkuD7r0V+emGEeo39Pg==", + "dev": true, + "peerDependencies": { + "progress": "^2.0.0" + } + }, "node_modules/multimatch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", @@ -3454,6 +4281,12 @@ "node": ">= 10.13.0" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -3833,6 +4666,15 @@ "node": ">=0.10.0" } }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3965,87 +4807,288 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "dependencies": { - "pify": "^3.0.0" + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pino": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.2.0.tgz", + "integrity": "sha512-g3/hpwfujK5a4oVbaefoJxezLzsDgLcNJeITvC6yrfwYeT9la+edCK42j5QpEQSQCZgTKapXvnQIdgZwvRaZug==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dev": true, + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "node_modules/pino-abstract-transport/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/pino-abstract-transport/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "through": "~2.3" + "safe-buffer": "~5.2.0" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "node_modules/pino-pretty": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.2.tgz", + "integrity": "sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==", "dev": true, - "engines": { - "node": ">=8.6" + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "bin": { + "pino-pretty": "bin.js" } }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "node_modules/pino-pretty/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "node_modules/pino-pretty/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "node_modules/pino-pretty/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "node_modules/pino-pretty/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "safe-buffer": "~5.2.0" } }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "dev": true + }, "node_modules/plugin-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", @@ -4085,12 +5128,36 @@ "node": ">=6" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/promise-polyfill": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", @@ -4109,6 +5176,16 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -4153,6 +5230,12 @@ "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", "dev": true }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "dev": true + }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -4200,6 +5283,15 @@ "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=", "dev": true }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -4286,6 +5378,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -4498,6 +5599,15 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4510,6 +5620,12 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "dev": true + }, "node_modules/seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", @@ -4550,6 +5666,19 @@ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4577,6 +5706,12 @@ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "dev": true }, + "node_modules/should-proxy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/should-proxy/-/should-proxy-1.0.4.tgz", + "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==", + "dev": true + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -4600,6 +5735,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-git": { "version": "3.22.0", "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", @@ -4624,6 +5804,24 @@ "node": ">=8" } }, + "node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sparkles": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz", @@ -4677,6 +5875,15 @@ "node": "*" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -4931,6 +6138,18 @@ "is-natural-number": "^4.0.1" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5047,6 +6266,15 @@ "b4a": "^1.6.4" } }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dev": true, + "dependencies": { + "real-require": "^0.2.0" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -5164,6 +6392,19 @@ "node": ">=14.17" } }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -5267,6 +6508,15 @@ "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", "dev": true }, + "node_modules/unxhr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.0.1.tgz", + "integrity": "sha512-MAhukhVHyaLGDjyDYhy8gVjWJyhTECCdNsLwlMoGFoNJ3o79fpQhtQuzmAE4IxCMDwraF4cW8ZjpAV0m9CRQbg==", + "dev": true, + "engines": { + "node": ">=8.11" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -5577,6 +6827,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -5654,6 +6910,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", diff --git a/package.json b/package.json index 5a33423d..cd67d519 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,9 @@ "typescript": "^5.3.3", "which": "^2.0.2", "yafs": "^1.36.0", - "zarro": "^1.178.0" + "zarro": "^1.178.0", + "@antora/cli": "^3.2.0-alpha.4", + "@antora/site-generator-default": "^3.2.0-alpha.4", + "@asciidoctor/tabs": "^1.0.0-beta.6" } } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 56bebe4b..ccac106f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,195 +1,172 @@ + - + ~ Licensed to the Apache Software Foundation (ASF) under one or more + ~ contributor license agreements. See the NOTICE file distributed with + ~ this work for additional information regarding copyright ownership. + ~ The ASF licenses this file to you under the Apache License, Version 2.0 + ~ (the "License"); you may not use this file except in compliance with + ~ the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + + + + 4.0.0 - log4net - apache-log4net + + + org.apache.logging + logging-parent + 11.0.0 + + + org.apache.logging.log4j + log4j-tools-bom + ${revision} pom - 3.0.3 - Apache log4net - Logging framework for Microsoft .NET Framework. - https://logging.apache.org/log4net/ - 2004 + + https://logging.apache.org/log4j/tools + + 2022 + + + scm:git:git@github.com:apache/logging-log4j-tools.git + scm:git:git@github.com:apache/logging-log4j-tools.git + HEAD + https://github.com/apache/logging-log4j-tools + + - Github - https://github.com/apache/logging-log4net/issues + GitHub Issues + https://github.com/apache/logging-log4j-tools/issues - - - logging commits: all git commits of the logging projects including log4net - commits-subscribe@logging.apache.org - commits-unsubscribe@logging.apache.org - Read-Only List - https://mail-archives.apache.org/mod_mbox/logging-commits/ - - - - - Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - scm:git:https://github.com/apache/logging-log4net - scm:git:https://github.com/apache/logging-log4net - https://github.com/apache/logging-log4net - - - Apache Software Foundation - https://www.apache.org - + + + GitHub Actions + https://github.com/apache/logging-log4j-tools/actions + + + + https://logging.apache.org/log4j/tools + + + + + + 0.10.0-SNAPSHOT + + + 2024-05-09T11:40:45Z + + + true + true + true + + + + + + + + org.apache.logging.log4j + log4j-changelog + ${project.version} + + + + org.apache.logging.log4j + log4j-docgen + ${project.version} + + + + org.apache.logging.log4j + log4j-docgen-asciidoctor-extension + ${project.version} + + + + + + + - org.apache.rat - apache-rat-plugin - 0.11 - - - org.apache.maven.plugins - maven-site-plugin - 3.4 - - ${basedir}/src/site/site.vm - + org.codehaus.mojo + flatten-maven-plugin + ${flatten-maven-plugin.version} + + + flatten-bom + + flatten + + process-resources + false + + - - - - + + - org.apache.maven.plugins - maven-site-plugin - 3.4 - - ${basedir}/src/site/site.vm - + org.codehaus.mojo + xml-maven-plugin + + + validate-changelog + + + + src/changelog + + **/*.xml + + true + + + + + - org.apache.rat apache-rat-plugin - 0.12 + true ${basedir}/rat.excludesFile - - org.apache.maven.plugins - maven-project-info-reports-plugin - 2.8.1 - - - - cim - scm - license - project-team - - - - + - - - - Davyd McColl - fluffynuts - - - Jan Friedrich - freeandnil - - - Curt Arnold - carnold - - - Stefan Bodewig - bodewig - - - Nicko Cadell - nicko - - - Niall Daley - niall - - - Gert Driesen - drieseng - - - Ron Grabowski - rgrabowski - - - Dominik Psenner - dpsenner - - - - - Erik Mavrinac - - - Julian Biddle - - - Daniel Cazzulino - - - Aspi Havewala - - - Rick Hobbs - - - Lance Nehring - - - Angelika Schnagl - - - Edward Smit - - - Douglas de la Torre - - - Pavlos Touboulidis - - - Thomas Voss - - - Jarrod Alexander - - - - - - - logging.site - file:///${user.dir}/target/site-deploy - - - \ No newline at end of file + + + diff --git a/rat.excludesFile b/rat.excludesFile index 9527f4be..cae188f8 100644 --- a/rat.excludesFile +++ b/rat.excludesFile @@ -1,5 +1,6 @@ rat.excludesFile .editorconfig +.gitattributes **/*.suo **/*.sln **/*.user @@ -23,9 +24,13 @@ rat.excludesFile **/*.snk **/*.readme **/*.json +**/*.globalconfig src/.idea/** src/integration-testing/** build/** build-tools/** doc/** -src/site/** \ No newline at end of file +src/site/** +site.legacy/** +NOTICE +LICENSE \ No newline at end of file diff --git a/src/changelog/.changelog.adoc.ftl b/src/changelog/.changelog.adoc.ftl new file mode 100644 index 00000000..00a9a1a9 --- /dev/null +++ b/src/changelog/.changelog.adoc.ftl @@ -0,0 +1,27 @@ +<#-- + ~ Licensed to the Apache Software Foundation (ASF) under one or more + ~ contributor license agreements. See the NOTICE file distributed with + ~ this work for additional information regarding copyright ownership. + ~ The ASF licenses this file to you under the Apache License, Version 2.0 + ~ (the "License"); you may not use this file except in compliance with + ~ the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<#if entriesByType?size gt 0> +<#list entriesByType as entryType, entries> + +[#release-notes-${release.version?replace("[^a-zA-Z0-9]", "-", "r")}-${entryType?lower_case}] +=== ${entryType?capitalize} + +<#list entries as entry> +* ${entry.description.text?replace("\\s+", " ", "r")}<#if entry.issues?has_content> (<#list entry.issues as issue>${issue.link}[${issue.id}]<#if issue?has_next>, ) + + + diff --git a/src/changelog/.index.adoc.ftl b/src/changelog/.index.adoc.ftl new file mode 100644 index 00000000..24c1ef38 --- /dev/null +++ b/src/changelog/.index.adoc.ftl @@ -0,0 +1,44 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +//// + ██ ██ █████ ██████ ███ ██ ██ ███ ██ ██████ ██ + ██ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██ ██ ██ + ██ █ ██ ███████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ + ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ███ ███ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██████ ██ + + IF THIS FILE IS CALLED `index.adoc`, IT IS AUTO-GENERATED, DO NOT EDIT IT! + + Release notes `index.adoc` is generated from `src/changelog/.index.adoc.ftl`. + Auto-generation happens during `generate-sources` phase of Maven. + Hence, you must always + + 1. Edit `.index.adoc.ftl` + 2. Run `./mvnw generate-sources` + 3. Commit both `.index.adoc.ftl` and the generated `.index.adoc` +//// + +// Release notes index does not look nice with a deep sectioning, override it: +:page-toclevels: 1 + +[#release-notes] += Release notes +<#list releases as release><#if release.changelogEntryCount gt 0> + +include::_release-notes/${release.version}.adoc[] + diff --git a/src/changelog/0.1.0/.release-notes.adoc.ftl b/src/changelog/0.1.0/.release-notes.adoc.ftl new file mode 100644 index 00000000..626a9138 --- /dev/null +++ b/src/changelog/0.1.0/.release-notes.adoc.ftl @@ -0,0 +1,43 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +//// + ██ ██ █████ ██████ ███ ██ ██ ███ ██ ██████ ██ + ██ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██ ██ ██ + ██ █ ██ ███████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ + ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ███ ███ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██████ ██ + + IF THIS FILE DOESN'T HAVE A `.ftl` SUFFIX, IT IS AUTO-GENERATED, DO NOT EDIT IT! + + Version-specific release notes (`7.8.0.adoc`, etc.) are generated from `src/changelog/*/.release-notes.adoc.ftl`. + Auto-generation happens during `generate-sources` phase of Maven. + Hence, you must always + + 1. Find and edit the associated `.release-notes.adoc.ftl` + 2. Run `./mvnw generate-sources` + 3. Commit both `.release-notes.adoc.ftl` and the generated `7.8.0.adoc` +//// + +[#release-notes-${release.version?replace("[^a-zA-Z0-9]", "-", "r")}] +== ${release.version} + +<#if release.date?has_content>Release date:: ${release.date} + +This is the first release, aimed to assist [the Apache Log4j 2](https://logging.apache.org/log4j/2.x/) on generating release notes. + +<#include "../.changelog.adoc.ftl"> diff --git a/src/changelog/0.1.0/.release.xml b/src/changelog/0.1.0/.release.xml new file mode 100644 index 00000000..0223ff5d --- /dev/null +++ b/src/changelog/0.1.0/.release.xml @@ -0,0 +1,6 @@ + + diff --git a/src/changelog/0.1.0/LOG4J2-3628_add_tools_bom_and_changelog_modules.xml b/src/changelog/0.1.0/LOG4J2-3628_add_tools_bom_and_changelog_modules.xml new file mode 100644 index 00000000..7aebfe52 --- /dev/null +++ b/src/changelog/0.1.0/LOG4J2-3628_add_tools_bom_and_changelog_modules.xml @@ -0,0 +1,8 @@ + + + + Add `log4j-tools-bom` and `log4j-changelog` modules + diff --git a/src/log4net.Tests/Appender/Internal/SimpleTelnetClient.cs b/src/log4net.Tests/Appender/Internal/SimpleTelnetClient.cs index 2678673a..7d5b822b 100644 --- a/src/log4net.Tests/Appender/Internal/SimpleTelnetClient.cs +++ b/src/log4net.Tests/Appender/Internal/SimpleTelnetClient.cs @@ -1,3 +1,24 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + using System; using System.Net; using System.Net.Sockets; diff --git a/src/site/antora/antora.tmpl.yml b/src/site/antora/antora.tmpl.yml new file mode 100644 index 00000000..743772b9 --- /dev/null +++ b/src/site/antora/antora.tmpl.yml @@ -0,0 +1,50 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# +# ██ ██ █████ ██████ ███ ██ ██ ███ ██ ██████ ██ +# ██ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██ ██ ██ +# ██ █ ██ ███████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ +# ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +# ███ ███ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██████ ██ +# +# THIS FILE IS USED AS A TEMPLATE TO AUTO-GENERATE `antora.yml`! +# +# The actual `antora.yml` that is used in `target/generated-site/antora` is auto-generated from `.antora.yml`. +# Auto-generation happens during `pre-site` phase of Maven. +# Hence, you must always +# +# 1. Edit `.antora.yml` +# 2. Edit `antora.yml` to match the fields in `.antora.yml` and fill Maven property placeholders with dummy values +# + +name: ROOT +title: Home +version: ~ +start_page: index.adoc +asciidoc: + attributes: + project-github-url: "${scm.url}" + project-version: "${project.version}" + project-name: "Log4j Tools" + project-id: "log4j-tools" + java-target-version: "${maven.compiler.target}" + java-compiler-version: "${minimalJavaBuildVersion}" + logging-services-url: "https://logging.apache.org" + freemarker-link: "https://freemarker.apache.org[FreeMarker]" +nav: + - modules/ROOT/nav.adoc diff --git a/src/site/antora/antora.yml b/src/site/antora/antora.yml new file mode 100644 index 00000000..8b840681 --- /dev/null +++ b/src/site/antora/antora.yml @@ -0,0 +1,50 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# +# ██ ██ █████ ██████ ███ ██ ██ ███ ██ ██████ ██ +# ██ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██ ██ ██ +# ██ █ ██ ███████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ +# ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ +# ███ ███ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██████ ██ +# +# THIS FILE IS A STUB! +# +# The actual `antora.yml` that is used in `target/generated-site/antora` is auto-generated from `antora.tmpl.yml`. +# Auto-generation happens during `pre-site` phase of Maven. +# Hence, you must always +# +# 1. Edit `antora.tmpl.yml` +# 2. Edit `antora.yml` to match the fields in `antora.tmpl.yml` and fill Maven property placeholders with dummy values +# + +name: ROOT +title: Home +version: ~ +start_page: index.adoc +asciidoc: + attributes: + project-github-url: "https://github.com/apache/logging-log4j-tools" + project-version: "1.2.3" + project-name: "Log4j Tools" + project-id: "log4j-tools" + java-target-version: "8" + java-compiler-version: "[17,18)" + logging-services-url: "https://logging.apache.org" + freemarker-link: "https://freemarker.apache.org[FreeMarker]" +nav: + - modules/ROOT/nav.adoc diff --git a/src/site/antora/modules/ROOT/nav.adoc b/src/site/antora/modules/ROOT/nav.adoc new file mode 100644 index 00000000..37743285 --- /dev/null +++ b/src/site/antora/modules/ROOT/nav.adoc @@ -0,0 +1,28 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +* Components +** xref:log4j-changelog.adoc[] +** xref:log4j-changelog-maven-plugin.adoc[] +** xref:log4j-docgen.adoc[] +** xref:log4j-docgen-maven-plugin.adoc[] +** xref:log4j-docgen-asciidoctor-extension.adoc[] +* xref:development.adoc[] +* xref:release-notes.adoc[] +* {logging-services-url}/download.html[Download] +* {logging-services-url}/support.html[Support] +* {logging-services-url}/security.html[Security] diff --git a/src/site/antora/modules/ROOT/pages/development.adoc b/src/site/antora/modules/ROOT/pages/development.adoc new file mode 100644 index 00000000..2bb11445 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/development.adoc @@ -0,0 +1,44 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + += Development + +{project-name} uses {project-github-url}[GitHub] for source code management. + +The project requires a Java compiler matching the `{java-compiler-version}` range and targets Java `{java-target-version}`. + +You can build and verify sources using: + +[source,bash] +---- +./mvnw verify +---- + +You can build and view the website as follows: + +[source,bash] +---- +./mvnw -N site +---- + +You can view the generated website with a browser by pointing it to `target/site` directory. + +[#release-instructions] +== Release instructions + +{project-name} employs the CI/CD foundation provided by the {logging-services-url}/logging-parent[`logging-parent`]. +You can simply use its release instructions. diff --git a/src/site/antora/modules/ROOT/pages/index.adoc b/src/site/antora/modules/ROOT/pages/index.adoc new file mode 100644 index 00000000..f0444748 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/index.adoc @@ -0,0 +1,52 @@ +//// +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +//// + += Log4j Tools + +Tooling **internally** used by {logging-services-url}/log4j/2.x/[the Apache Log4j project] infrastructure: + +* xref:log4j-changelog.adoc[] +* xref:log4j-changelog-maven-plugin.adoc[] +* xref:log4j-docgen.adoc[] +* xref:log4j-docgen-maven-plugin.adoc[] +* xref:log4j-docgen-asciidoctor-extension.adoc[] + +[#maven-bom] +== Maven Bill of Materials (BOM) + +To keep your {project-name} module versions aligned, a https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#bill-of-materials-bom-poms[Maven Bill of Materials (BOM) POM] is provided for your convenience. + +To use this with Maven, add the dependency listed below to your `pom.xml` file. +Note that the `` nesting and the `import` instruction. +This will _import_ all modules bundled with the associated Log4j release to your `dependencyManagement`. +As a result, you don't have to specify versions of the imported modules (`log4j-changelog`, `log4j-docgen`, etc.) while using them as a ``. + +.`pom.xml` snippet importing `log4j-tools-bom` +[source,subs="+attributes"] +---- + + + + org.apache.logging.log4j + log4j-tools-bom + {project-version} + import + pom + + + +---- diff --git a/src/site/antora/modules/ROOT/pages/log4j-changelog-maven-plugin.adoc b/src/site/antora/modules/ROOT/pages/log4j-changelog-maven-plugin.adoc new file mode 100644 index 00000000..c4d9a473 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/log4j-changelog-maven-plugin.adoc @@ -0,0 +1,157 @@ +//// +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +//// + += Log4j Changelog Maven Plugin + +This project ships a Maven plugin providing access to the `ChangelogExporter` and `ChangelogReleaser` of xref:log4j-changelog.adoc[Log4j Changelog]. + +[#dependencies] +== Dependencies + +You need to have the `org.apache.logging.log4j:log4j-changelog-maven-plugin` dependency in your classpath: + +[source,xml,subs="+attributes"] +---- + + org.apache.logging.log4j + log4j-changelog-maven-plugin + {project-version} + +---- + +[#export] +== Exporting changelogs + +_Exporting_ changelogs is the act of feeding provided changelog and release information into {freemarker-link} templates to generate certain files; e.g., release notes for the website. +There are two types template files supported: + +xref:log4j-changelog.adoc#changelog-template[Changelog templates]:: +These templates are rendered with the release and changelog information of a particular release. +These are generally used to generate release notes for a particular release. + +xref:log4j-changelog.adoc#index-template[Index templates]:: +These templates are rendered with the release information of all releases. +These are generally used to generate the index page referencing to release notes of each release. + +See xref:#export[the Log4j Changelog documentation] for further details. + +You can use the `export` goal as follows: + +.`build > plugins` block entry of `pom.xml` +[source,xml,subs="+attributes"] +---- + + + org.apache.logging.log4j + log4j-changelog-maven-plugin + {project-version} + false + + + + + + + + + + + generate-changelog + + export + + + + +---- + +`export` goal by default runs during the `pre-site` phase and accepts the following configuration: + +`skip` (parameter):: +Indicates if the execution should be skipped or not. +It defaults to `false` and can be set using the `log4j.changelog.skip` property. + +`changelogDirectory` (parameter):: +Directory containing release folders composed of changelog entry XML files. +It defaults to `${project.basedir}/src/changelog` and can be set using the `log4j.changelog.directory` property. + +`outputDirectory` (parameter):: +Directory to write rendered templates. +It defaults to `${project.build.directory}/generated-sources/site/changelog` and can be set using the `log4j.changelog.exporter.outputDirectory` property. + +`indexTemplates` (parameter):: +List of xref:#export-template-type[template]s that will be rendered with release information of all releases. +See xref:log4j-changelog.adoc#index-template[the index template file documentation] for details. + +`changelogTemplates` (parameter):: +List of xref:#export-template-type[template]s that will be rendered with release and changelog information of a particular release. +See xref:log4j-changelog.adoc#changelog-template[the changelog template file documentation] for details. + +[#export-template-type] +`Template` (type):: +An object composed of following fields: ++ +`source` (parameter)::: +the {freemarker-link} template file + +`target` (parameter)::: +The output file. +If not provided, it will be derived from the `source`: if the `source` is `.index.adoc.ftl`, the `target` will be set to `index.adoc`. +If the value contains a `%v` (e.g., `%v.adoc`), it will be replaced with the associated release version. +`%v` substitution is only allowed for changelog templates and will not work for index templates. + +`failIfNotFound` (parameter)::: +Indicates if export should fail when the source cannot be found. +Defaults to `false`. + +[#release] +== Populating a release changelog directory + +You can use the `release` goal wrapping xref:log4j-changelog.adoc#qa-deploy-release[`ChangelogReleaser` to populate a release changelog directory]. +An example usage is shared below. + +.Populate `src/changelog/2.19.0` from `src/changelog/.2.x.x` +[source,bash] +---- +./mvnw -N log4j-changelog:release -Dlog4j.changelog.releaseVersion=2.19.0 +---- + +Note that above we are using `-N` (`--non-recursive`) to avoid visiting submodules, which also makes the run faster. + +`release` goal does not have default phase and accepts the following configuration parameters: + +`skip` (parameter):: +Indicates if the execution should be skipped or not. +It defaults to `false` and can be set using the `log4j.changelog.skip` property. + +`changelogDirectory` (parameter):: +Directory containing release folders composed of changelog entry XML files. +It defaults to `${project.basedir}/src/changelog` and can be set using the `log4j.changelog.directory` property. + +`releaseVersion` (parameter):: +The version to be released. +It can be set using the `log4j.changelog.releaseVersion` property. + +`versionPattern` (parameter):: +The regular expression pattern for parsing versions. +The pattern must provide the following named groups: `major`, `minor`, and `patch`. +It defaults to `^(?0|[1-9]\d*)\.(?0|[1-9]\d*)\.(?0|[1-9]\d*(-[a-zA-Z][0-9a-zA-Z-]*)?)$` and can be set using the `log4j.changelog.versionPattern` property. diff --git a/src/site/antora/modules/ROOT/pages/log4j-changelog.adoc b/src/site/antora/modules/ROOT/pages/log4j-changelog.adoc new file mode 100644 index 00000000..c75536fa --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/log4j-changelog.adoc @@ -0,0 +1,278 @@ +//// +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +//// + += Log4j Changelog + +This project contains tools to maintain changelogs. +It is designed for Apache Log4j, but can be used for any Java project. + +[#dependencies] +== Dependencies + +You need to have the `org.apache.logging.log4j:log4j-changelog` dependency in your classpath: + +[source,xml,subs="+attributes"] +---- + + org.apache.logging.log4j + log4j-changelog + {project-version} + +---- + +Java module name and OSGi `Bundle-SymbolicName` are set to `org.apache.logging.log4j.changelog`. + +[#what-is-a-changelog] +== What is a changelog? + +A changelog is a log of all notable changes made to a project. + +[#why-different] +== Why yet another changelog tool? + +Existing changelog practices (e.g., https://keepachangelog.com[Keep a changelog], https://maven.apache.org/plugins/maven-changes-plugin/[maven-changes-plugin]) store changelog entries in the same file. +This creates merge conflicts between different branches. +Imagine multiple people working on multiple branches each containing a change to `CHANGELOG.md`. +Whoever succeeds in merging their branch to `main` first will cause a merge-conflict for the others, even though their work might be totally unrelated from each other. + +This project embraces a model where changelog entries are kept in separate files and hence are not prone to merge conflicts. +Similar to `maven-changes-plugin`, changelog sources and their exports (e.g., AsciiDoc-formatted) are split by design. + +[#look] +== What does it look like? + +All changelog _sources_ and templates used to _export_ them are stored in folders under _the changelog directory_ (e.g., `/src/changelog`): + +[source] +---- +$ tree -a src/changelog +├── 2.18.0 # <1> +│ ├── LOG4J2-3424_Properties_defined_in_configuration_using_a_value_attribute.xml # <4> +│ ├── LOG4J2-3425_Syslog_appender_lacks_the_SocketOptions_setting.xml # <4> +│ ├── LOG4J2-3426_Log4j_1_2_bridge_should_not_wrap_components_unnecessarily.xml # <4> +│ ├── LOG4J2-3427_Improves_ServiceLoader_support_on_servlet_containers.xml # <4> +│ ├── .release-notes.adoc.ftl # <5> +│ └── .release.xml # <3> +├── 2.19.0 # <1> +│ ├── LOG4J2-3588_Allow_PropertySources_to_be_added.xml # <4> +│ ├── LOG4J2-3590_Remove_SLF4J_1_8_x_binding.xml # <4> +│ ├── LOG4J2-3614_Harden_InstantFormatter_against_delegate_failures.xml # <4> +│ ├── LOG4J2-3556_JsonTemplateLayout_stack_trace_truncation_fix.xml # <4> +│ ├── .release-notes.adoc.ftl # <5> +│ └── .release.xml # <3> +├── .2.x.x # <2> +│ ├── LOG4J2-1284_redirect_old_javadoc_urls.xml # <4> +│ └── .release-notes.adoc.ftl # <5> +├── .changelog.adoc.ftl # <5> +└── .index.adoc.ftl # <5> +---- +<1> Changelog sources of _released versions_ are stored in `/` folders (e.g., `src/changelog/2.19.0`) +<2> Changelog sources of _upcoming releases_ are stored in `/..x.x` folders (e.g., `/src/changelog/.2.x.x`) +<3> `.release.xml` contains the information about the associated release. +Note that upcoming release folders (e.g., `src/changelog/.2.x.x`) don't contain a `.release.xml`, since these releases are by definition not done yet. +<4> All XML files not prefixed with a `.` (e.g., `src/changelog/.2.x.x/LOG4J2-3628_new_changelog_infra.xml`) constitute changelog entries +<5> {freemarker-link} templates are used to _export_ this information to various forms; AsciiDoc-formatted pages for the website, Markdown-formatted files for GitHub Releases, etc. + +[#release-entry-file] +== Release entry file + +A release entry file, `.release.xml`, consists of meta information regarding a particular release. +A sample _release entry_ file is shared below. + +.`src/changelog/2.19.0/release.xml` file contents +[source,xml] +---- + + +---- + +Note that upcoming release folders (e.g., `src/changelog/.2.x.x`) don't contain a `.release.xml`, since these releases are by definition not done yet. + +[#changelog-entry-file] +== Changelog entry file + +A changelog entry file consists of short meta information regarding a particular change. +They are named following the `[_].xml` pattern. +Consider the following examples: + +* `LOG4J2-3556_JsonTemplateLayout_stack_trace_truncation_fix.xml` +* `LOG4J2-3578_Generate_new_SSL_certs_for_testing.xml` +* `Update_jackson_2_11_0_2_11_2.xml` + +A sample _changelog entry_ file is shared below. + +.`src/changelog/2.19.0/LOG4J2-3556_JsonTemplateLayout_stack_trace_truncation_fix.xml` file contents +[source,xml] +---- + + + + + Make `JsonTemplateLayout` stack trace truncation operate for each label block + + +---- + +Some remarks about the structure of changelog entry files: + +* The root element must be named `entry` +* `entry.type` attribute is required and must be one of the change types: +** `added` – for new features +** `changed` – for changes in existing functionality +** `deprecated` – for soon-to-be removed features +** `fixed` – for any bug fixes +** `removed` – for now removed features +** `updated` – for dependency updates +* `issue` element is optional, can occur multiple times, and, if present, must contain `id` and `link` attributes +* There must be a single `description` element with non-blank content and `format` attribute + +[#export] +== Exporting changelogs + +_Exporting_ changelogs is the act of feeding provided changelog and release information into {freemarker-link} templates to generate certain files; e.g., release notes for the website. +There are two types template files supported: + +xref:#changelog-template[Changelog templates]:: +These templates are rendered with the release and changelog information of a particular release. +These are generally used to generate release notes for a particular release. + +xref:#index-template[Index templates]:: +These templates are rendered with the release information of all releases. +These are generally used to generate the index page referencing to release notes of each release. + +`ChangelogExporter` is responsible for performing the export operation. + +[#changelog-template] +=== Changelog templates + +Changelog template files (e.g., `src/changelog/2.19.0/.release-notes.adoc.ftl` ) are rendered with the release and changelog information of a particular release using the following input data hash: + +* `release` → `ChangelogRelease` +* `entriesByType` → `Map>` + +See `ChangelogRelease` and `ChangelogEntry` for details. + +These templates are generally used to generate release notes for a particular release. +A sample changelog template file is shared below. + +.`src/changelog/2.19.0/.release-notes.adoc.ftl` file contents +[source,asciidoc] +---- += ${release.version}<#if release.date?has_content> (${release.date}) + +This release primarily contains bug fixes and minor enhancements. + +<#if entriesByType?size gt 0>== Changes +<#list entriesByType as entryType, entries> + +=== ${entryType?capitalize} + +<#list entries as entry> +* ${entry.description.text?replace("\\s+", " ", "r")} +(<#list entry.issues as issue>${issue.link}[${issue.id}]<#if issue?has_next>, ) + + + +---- + +[#index-template] +=== Index templates + +Index template files (e.g., `src/changelog/.index.adoc.ftl`) are rendered with the release information of all releases using the following input data hash: + +* `releases` -> list of hashes containing following keys: +** `version` +** `date` + +These template files are generally used to generate the index page referencing to release notes of each release. +A sample index template file is shared below. + +.`src/changelog/.index.adoc.ftl` file contents +[source,asciidoc] +---- += Release changelogs + +<#list releases as release> +* xref:${release.version}.adoc[${release.version}]<#if release.date?has_content> (${release.date}) + +---- + +[#qa] +== Q&A + +[#qa-entry] +=== How can I add an entry for a change I am about to commit? + +You have just committed, or better, about to commit a great feature you have been working on. +Simply create a <> and commit it along with your change! + +[#qa-generate] +=== How can I export changelogs to AsciiDoc, Markdown, etc. files? + +You need to use xref:log4j-changelog-maven-plugin.adoc#export[the `export` goal the Maven plugin]. + +[#qa-deploy-release] +=== I am about to deploy a new release. What shall I do? + +Just before a release, three things need to happen in the changelog sources: + +. *Changelog entry files needs to be moved* from the _upcoming_ release changelog directory `/..x.x` to the _new_ release changelog directory `/` +. *Templates need to be copied* from the _upcoming_ release changelog directory to the _new_ release changelog directory, unless it already exists in the target +. *`.release.xml` needs to be created* in the _new_ release changelog directory + +Due to the nature of release candidates, above steps might need to be repeated multiple times. + +[TIP] +==== +Log4j _releases_ and _release candidates_ all get deployed to the same https://repository.apache.org/#stagingRepositories[_staging repository_]. +Their `pom.xml` files all contain the same release version, e.g., `2.19.0`. +There are no `-rc1`, `-rc2`, etc. suffixes in the version of a release candidate. +Once a release candidate voting reaches to a consensus for release, associated artifacts simply get promoted from the _staging_ to the _public_ repository. +Hence, there are no differences between releases and release candidates from the point of view of changelogs. +==== + +How to carry out aforementioned changes are explained below in steps: + +. Populate the `/` directory (e.g., `/src/changelog/2.19.0`) from the upcoming release changelog directory (e.g., `/.2.x.x`) using the xref:log4j-changelog-maven-plugin.adoc#release[`release` Maven goal]: ++ +[source,bash] +---- +./mvnw log4j-changelog:release \ + -Dlog4j.changelog.directory=/path/to/changelog/directory \ + -Dlog4j.changelog.releaseVersion=X.Y.Z +---- +. Verify that all changelog entry files are moved from `/..x.x` directory (e.g., `/src/changelog/.2.x.x`) +. Verify that `/` directory (e.g., `/src/changelog/2.19.0`) is created, and it contains templates, changelog entry files, and a `.release.xml` ++ +[IMPORTANT] +==== +If `/` directory (e.g., `/src/changelog/2.19.0`) already exists with certain content, `ChangelogReleaser` will only move new changelog entry files and override `.release.xml`; templates will not be overridden. +This allows one to run `ChangelogReleaser` multiple times, e.g., to incorporate changes added to a release candidate. +==== +. Edit the populated templates (e.g., update the release notes with a short summary paragraph) +. `git add` the changes in the changelog directory (e.g., `/src/changelog`) and commit them diff --git a/src/site/antora/modules/ROOT/pages/log4j-docgen-asciidoctor-extension.adoc b/src/site/antora/modules/ROOT/pages/log4j-docgen-asciidoctor-extension.adoc new file mode 100644 index 00000000..a3e69de9 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/log4j-docgen-asciidoctor-extension.adoc @@ -0,0 +1,62 @@ +//// +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +//// + += Log4j Docgen AsciiDoctor extension + +While xref:log4j-docgen.adoc#descriptor-generator[the descriptor generator] converts Javadoc to AsciiDoc, it cannot resolve links. +That is, it cannot blindly replace a `{@link example.MyAppender foo}` Javadoc snippet with a `\xref:MyAppender.adoc[foo]` AsciiDoc snippet instead. +This is because, the mapping of types to AsciiDoc files are not available to the descriptor generator, but xref:log4j-docgen.adoc#documentation-generator[the documentation generator]. +That is, the descriptor generator doesn't know if the type will be mapped to `.adoc` or `/.adoc`. +As a matter of fact, it should not need to know this either: descriptors capture immutable metadata, whereas documentation file structure can always change. +To work around this, we convert `{@link example.MyAppender foo}` to `apiref:example.MyAppender[foo]` and provide an `apiref` inline AsciiDoc macro to resolve these while generating the documentation. + +`DocgenExtension` AsciiDoctor extension provides the `apiref` inline macro which can be configured using the below shared AsciiDoctor document attributes: + +`log4j-docgen-descriptor-dot-files-included`:: +Indicates if dot files (i.e., `.`-prefix file names) will be accepted in <>. +This attribute defaults to `false`. + +[#log4j-docgen-asciidoctor-extension-attribute-descriptor-path-matcher] +`log4j-docgen-descriptor-path-matcher`:: +The https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/FileSystem.html#getPathMatcher(java.lang.String)[path pattern] (e.g., `glob:**/*.xml`) to locate files produced by xref:log4j-docgen.adoc#descriptor-generator[the descriptor generator]. +This attribute is *required*. + +`log4j-docgen-type-filter-exclude-pattern`:: +The regular expression to match against the types loaded from descriptors and determine if a type will be _excluded_ to generate links. +This argument defaults to not exclude anything. + +`log4j-docgen-type-filter-include-pattern`:: +The regular expression to match against the types loaded from descriptors and determine if a type will be _included_ to generate links. +This argument defaults to `.*`, that is, all loaded types will be used to generate links. + +`log4j-docgen-package-name-stripped`:: +Indicates if the package name will be stripped for unknown types. +That is, if `true`, `apiref:some.unknown.Class[]` will be converted to `Class`; `some.unknown.Class`, otherwise. +Note that this only applies to types where the label is not provided. +This flag is disabled by default. + +[#log4j-docgen-type-target-template] +`log4j-docgen-type-target-template`:: +The FreeMarker template to produce the link target for individual types documented, for instance: ++ +[source] +---- +#${sourcedType.groupId?replace('.', '-')}_${sourcedType.artifactId?replace('.', '-')}_${sourcedType.type.className?replace('.', '-') +---- + ++ +This attribute is *required*. diff --git a/src/site/antora/modules/ROOT/pages/log4j-docgen-maven-plugin.adoc b/src/site/antora/modules/ROOT/pages/log4j-docgen-maven-plugin.adoc new file mode 100644 index 00000000..7b728442 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/log4j-docgen-maven-plugin.adoc @@ -0,0 +1,116 @@ +//// +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +//// + += Log4j Docgen Maven Plugin + +Log4j Docgen Maven Plugin allows you to easily run Log4j Docgen xref:log4j-docgen.adoc#documentation-generator[documentation generator] and xref:log4j-docgen.adoc#schema-generator[schema generator] from your `pom.xml`. + +[#dependencies] +== Dependencies + +You need to have the `org.apache.logging.log4j:log4j-docgen-maven-plugin` dependency in your classpath: + +[source,xml,subs="+attributes"] +---- + + org.apache.logging.log4j + log4j-docgen-maven-plugin + {project-version} + +---- + +[#generate-documentation] +== Generate documentation + +The `generate-documentation` goal generates an AsciiDoc-formatted documentation using FreeMarker templates that are fed with the types loaded from given descriptors: + +.An example `log4j-docgen:generate-documentation` configuration +[source,xml,subs="+attributes"] +---- + + + + + ${project.build.directory}/plugin-descriptors + + + + + + ^java\..+ + + + + ${project.basedir}/src/docgen-templates + + + + + + + + + + +---- +<1> `target` must be in sync. with xref:log4j-docgen-asciidoctor-extension.adoc#log4j-docgen-type-target-template[the `log4j-docgen-type-target-template` configuration of `log4j-docgen-asciidoctor-extension`]. + +The `generate-documentation` goal configuration also accepts the following parameters: + +`skip` (parameter):: +Indicates if the execution should be skipped or not. +It defaults to `false` and can be set using the `log4j.docgen.skip` property. + +[#generate-schema] +== Generate schema + +The `generate-schema` goal generates an XSD derived from the types loaded using given descriptors: + +.An example `log4j-docgen:generate-schema` configuration +[source,xml,subs="+attributes"] +---- + + + + + ${project.build.directory}/plugin-descriptors + + + + + + ^java\..+ + + + + ${project.version} + ${project.build.directory}/generated-site/resources/config.xsd + + +---- + +The `generate-schema` goal configuration also accepts the following parameters: + +`skip` (parameter):: +Indicates if the execution should be skipped or not. +It defaults to `false` and can be set using the `log4j.docgen.skip` property. diff --git a/src/site/antora/modules/ROOT/pages/log4j-docgen.adoc b/src/site/antora/modules/ROOT/pages/log4j-docgen.adoc new file mode 100644 index 00000000..d78e02ca --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/log4j-docgen.adoc @@ -0,0 +1,110 @@ +//// +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +//// + += Log4j Docgen + +Log4j Docgen (Documentation Generation) bundles utility classes to generate documentation from Log4j plugins. +Given almost all Log4j functionality (layouts, appenders, etc.) is implemented in the form of plugins, this project aims the following goals: + +Avoid the need to maintain documentation in multiple places:: +For instance, Log4j JSON Template Layout is composed of several plugins with sufficient Javadoc explaining their behaviour. +Next to this we also maintain a big `json-template-layout.adoc` page for the website, again, documenting each component. +By generating documentation from the source code, developers can precisely capture the behaviour of their components only in the very code itself that they change. + +Accurately capture the component configuration:: +It is pretty common that source code changes are not reflected to documentation. +By generating the documentation from the source code, this discrepancy gets removed. + +[#dependencies] +== Dependencies + +You need to have the `org.apache.logging.log4j:log4j-docgen` dependency in your classpath: + +[source,xml,subs="+attributes"] +---- + + org.apache.logging.log4j + log4j-docgen + {project-version} + +---- + +[#descriptor-generator] +== Descriptor generator + +`DescriptorGenerator` is an annotation processor that generates an XML file capturing all the metadata needed to document a plugin: + +* **types** – types it extends from, types it uses in its configuration, etc. +* **configuration** – extracts the necessary set of elements, attributes, etc. from builder classes, `@PluginFactory`-annotated methods, etc. +* **documentation** – extracts the Javadoc of each field and type, and converts it to AsciiDoc + +Users are recommended to integrate this annotation processor into their build: + +[source,xml,subs="+attributes"] +---- + + org.apache.maven.plugins + maven-compiler-plugin + + + + + org.apache.logging.log4j + log4j-docgen + {project-version} + + + + org.apache.logging.log4j + log4j-core + ${project.version} + + + + + -Alog4j.docgen.skip=false + -Alog4j.docgen.descriptorFilePath=${project.build.directory}/${project.artifactId}-plugins.xml + -Alog4j.docgen.groupId=${project.groupId} + -Alog4j.docgen.artifactId=${project.artifactId} + -Alog4j.docgen.version=${project.version} + -Alog4j.docgen.description=${project.description} + -Alog4j.docgen.typeFilter.excludePattern=^java\..+ + + + +---- + +[#documentation-generator] +== Documentation generator + +`DocumentationGenerator` receives + +. plugin descriptors (generated by the `DescriptorGenerator`) +. FreeMarker templates (to render the type hierarchy and each individual type) + +as input arguments, and produces an AsciiDoc-formatted documentation that one can integrate into the website of a project. + +Users are recommended to use xref:log4j-docgen-maven-plugin.adoc#generate-documentation[the `generate-documentation` goal of the `log4j-docgen-maven-plugin`] instead. + +[#schema-generator] +== Schema generator + +`SchemaGenerator` receives plugin descriptors (generated by the `DescriptorGenerator`) as input, and produces an XSD describing the structure defined by the descriptors. + +Users are recommended to use xref:log4j-docgen-maven-plugin.adoc#generate-schema[the `generate-schema` goal of the `log4j-docgen-maven-plugin`] instead. diff --git a/src/site/antora/modules/ROOT/pages/release-notes.adoc b/src/site/antora/modules/ROOT/pages/release-notes.adoc new file mode 100644 index 00000000..a2bfd86d --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/release-notes.adoc @@ -0,0 +1,21 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + += Release notes + +This file is a stub. +Its content will be auto-generated during build. From a335591853ac5380bbae1db526ecec7c32e25e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volkan=20Yaz=C4=B1c=C4=B1?= Date: Tue, 29 Oct 2024 14:09:55 +0100 Subject: [PATCH 03/18] Make `mvnw` executable --- mvnw | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 mvnw diff --git a/mvnw b/mvnw old mode 100644 new mode 100755 From 1204e0f9cffad002950d0326eddfcc37b8a9514c Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Tue, 29 Oct 2024 20:28:20 +0100 Subject: [PATCH 04/18] excluded .idea folder from spotless plugin --- .github/workflows/git-broadcast.yml | 16 ++++++++++++++++ .gitignore | 1 + pom.xml | 17 +++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/.github/workflows/git-broadcast.yml b/.github/workflows/git-broadcast.yml index 5541bf15..513b8c11 100644 --- a/.github/workflows/git-broadcast.yml +++ b/.github/workflows/git-broadcast.yml @@ -1,3 +1,19 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# name: Broadcast master updates to satellites on: diff --git a/.gitignore b/.gitignore index 0906a46a..2e4d1bc3 100644 --- a/.gitignore +++ b/.gitignore @@ -240,6 +240,7 @@ src/GeneratedAssemblyInfo.cs *.orig *.old *.swp +node build-tools buildreports vs_buildtools.exe diff --git a/pom.xml b/pom.xml index ccac106f..dcafecbb 100644 --- a/pom.xml +++ b/pom.xml @@ -157,6 +157,23 @@ + + + com.diffplug.spotless + spotless-maven-plugin + + + + + **/.idea/* + src/changelog/**/*.xml + .github/* + + + + + + org.apache.rat apache-rat-plugin From 7d3ab56a74c3155c3ed131995612112524571fd3 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Sat, 2 Nov 2024 17:42:12 +0100 Subject: [PATCH 05/18] exclude binaries from spotless checks --- .flattened-pom.xml | 143 --------------------------------------------- pom.xml | 1 + 2 files changed, 1 insertion(+), 143 deletions(-) delete mode 100644 .flattened-pom.xml diff --git a/.flattened-pom.xml b/.flattened-pom.xml deleted file mode 100644 index b22b2912..00000000 --- a/.flattened-pom.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - - 4.0.0 - - org.apache.logging - logging-parent - 11.0.0 - - org.apache.logging.log4j - log4j-tools-bom - 0.10.0-SNAPSHOT - pom - Parent project internally used in Maven-based projects of the Apache Logging Services - https://logging.apache.org/log4j/tools - 2022 - - The Apache Software Foundation - https://www.apache.org/ - - - - Apache-2.0 - https://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - ggregory - Gary Gregory - ggregory@apache.org - https://www.garygregory.com - The Apache Software Foundation - https://www.apache.org/ - - PMC Member - - America/New_York - - - grobmeier - Christian Grobmeier - grobmeier@apache.org - - PMC Member - - Europe/Berlin - - - mattsicker - Matt Sicker - mattsicker@apache.org - Apple - - PMC Member - - America/Chicago - - - pkarwasz - Piotr P. Karwasz - pkarwasz@apache.org - - PMC Member - - Europe/Warsaw - - - vy - Volkan Yazıcı - vy@apache.org - - PMC Chair - - Europe/Amsterdam - - - - - log4j-user - log4j-user-subscribe@logging.apache.org - log4j-user-unsubscribe@logging.apache.org - log4j-user@logging.apache.org - https://lists.apache.org/list.html?log4j-user@logging.apache.org - - - dev - dev-subscribe@logging.apache.org - dev-unsubscribe@logging.apache.org - dev@logging.apache.org - https://lists.apache.org/list.html?dev@logging.apache.org - - - - scm:git:git@github.com:apache/logging-log4j-tools.git - scm:git:git@github.com:apache/logging-log4j-tools.git - https://github.com/apache/logging-log4j-tools - - - GitHub Issues - https://github.com/apache/logging-log4j-tools/issues - - - GitHub Actions - https://github.com/apache/logging-log4j-tools/actions - - - - - org.apache.logging.log4j - log4j-changelog - 0.10.0-SNAPSHOT - - - org.apache.logging.log4j - log4j-docgen - 0.10.0-SNAPSHOT - - - org.apache.logging.log4j - log4j-docgen-asciidoctor-extension - 0.10.0-SNAPSHOT - - - - diff --git a/pom.xml b/pom.xml index dcafecbb..8750b3a0 100644 --- a/pom.xml +++ b/pom.xml @@ -167,6 +167,7 @@ **/.idea/* src/changelog/**/*.xml + **/bin/**/*.xml .github/* From a34ac12dbc5769af2dac4fa20a1ee49a8e256fc3 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Sat, 2 Nov 2024 17:59:49 +0100 Subject: [PATCH 06/18] fixed spotless and rat warnings --- .gitignore | 18 ++---------------- pom.xml | 2 +- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 2e4d1bc3..e5cec138 100644 --- a/.gitignore +++ b/.gitignore @@ -87,9 +87,6 @@ ipch/ *.vspx *.sap -# TFS 2012 Local Workspace -$tf/ - # Guidance Automation Toolkit *.gpState @@ -169,18 +166,6 @@ AppPackages/ # but keep track of directories ending in .cache !*.[Cc]ache/ -# Others -ClientBin/ -[Ss]tyle[Cc]op.* -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.pfx -*.publishsettings -node_modules/ -orleans.codegen.cs - # RIA/Silverlight projects Generated_Code/ @@ -248,4 +233,5 @@ dotnetfx35.exe *.exe /src/Binaries/* -local-tasks/*.generated.js \ No newline at end of file +local-tasks/*.generated.js +/.flattened-pom.xml diff --git a/pom.xml b/pom.xml index 8750b3a0..b38b881a 100644 --- a/pom.xml +++ b/pom.xml @@ -168,7 +168,7 @@ **/.idea/* src/changelog/**/*.xml **/bin/**/*.xml - .github/* + **/*.y*ml From 8edef1e2975222dddea5d3a16b1a101597eaece3 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Sat, 2 Nov 2024 18:38:36 +0100 Subject: [PATCH 07/18] - cleaned up pom - migrated index and first paragraph of features to adoc --- .gitignore | 1 + pom.xml | 36 +-- src/site/antora/modules/ROOT/nav.adoc | 7 +- .../antora/modules/ROOT/pages/features.adoc | 25 ++ src/site/antora/modules/ROOT/pages/index.adoc | 37 +-- .../pages/log4j-changelog-maven-plugin.adoc | 157 ---------- .../modules/ROOT/pages/log4j-changelog.adoc | 278 ------------------ .../log4j-docgen-asciidoctor-extension.adoc | 62 ---- .../ROOT/pages/log4j-docgen-maven-plugin.adoc | 116 -------- .../modules/ROOT/pages/log4j-docgen.adoc | 110 ------- 10 files changed, 41 insertions(+), 788 deletions(-) create mode 100644 src/site/antora/modules/ROOT/pages/features.adoc delete mode 100644 src/site/antora/modules/ROOT/pages/log4j-changelog-maven-plugin.adoc delete mode 100644 src/site/antora/modules/ROOT/pages/log4j-changelog.adoc delete mode 100644 src/site/antora/modules/ROOT/pages/log4j-docgen-asciidoctor-extension.adoc delete mode 100644 src/site/antora/modules/ROOT/pages/log4j-docgen-maven-plugin.adoc delete mode 100644 src/site/antora/modules/ROOT/pages/log4j-docgen.adoc diff --git a/.gitignore b/.gitignore index e5cec138..cd141542 100644 --- a/.gitignore +++ b/.gitignore @@ -226,6 +226,7 @@ src/GeneratedAssemblyInfo.cs *.old *.swp node +node_modules build-tools buildreports vs_buildtools.exe diff --git a/pom.xml b/pom.xml index b38b881a..1eda606c 100644 --- a/pom.xml +++ b/pom.xml @@ -16,16 +16,6 @@ ~ limitations under the License. --> - - - 4.0.0 @@ -34,36 +24,32 @@ 11.0.0 - org.apache.logging.log4j - log4j-tools-bom + org.apache.logging.log4net + apache-log4net ${revision} pom - https://logging.apache.org/log4j/tools - - 2022 + Apache log4net + Logging framework for Microsoft .NET Framework. + https://logging.apache.org/log4net + 2004 - scm:git:git@github.com:apache/logging-log4j-tools.git - scm:git:git@github.com:apache/logging-log4j-tools.git - HEAD - https://github.com/apache/logging-log4j-tools + scm:git:https://github.com/apache/logging-log4net + scm:git:https://github.com/apache/logging-log4net + https://github.com/apache/logging-log4net GitHub Issues - https://github.com/apache/logging-log4j-tools/issues + https://github.com/apache/logging-log4net/issues GitHub Actions - https://github.com/apache/logging-log4j-tools/actions + https://github.com/apache/logging-log4net/actions - - https://logging.apache.org/log4j/tools - - diff --git a/src/site/antora/modules/ROOT/nav.adoc b/src/site/antora/modules/ROOT/nav.adoc index 37743285..4fa5645f 100644 --- a/src/site/antora/modules/ROOT/nav.adoc +++ b/src/site/antora/modules/ROOT/nav.adoc @@ -15,13 +15,8 @@ limitations under the License. //// -* Components -** xref:log4j-changelog.adoc[] -** xref:log4j-changelog-maven-plugin.adoc[] -** xref:log4j-docgen.adoc[] -** xref:log4j-docgen-maven-plugin.adoc[] -** xref:log4j-docgen-asciidoctor-extension.adoc[] * xref:development.adoc[] +* xref:features.adoc[] * xref:release-notes.adoc[] * {logging-services-url}/download.html[Download] * {logging-services-url}/support.html[Support] diff --git a/src/site/antora/modules/ROOT/pages/features.adoc b/src/site/antora/modules/ROOT/pages/features.adoc new file mode 100644 index 00000000..a13ffaef --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/features.adoc @@ -0,0 +1,25 @@ +//// +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +//// + += Features + +log4net is a tool to help the programmer output log statements to a variety of output targets. +In case of problems with an application, it is helpful to enable logging so that the problem +can be located. +With log4net it is possible to enable logging at runtime without modifying the application binary. +The log4net package is designed so that log statements can remain in shipped code without incurring a +high performance cost. It follows that the speed of logging (or rather not logging) is crucial. diff --git a/src/site/antora/modules/ROOT/pages/index.adoc b/src/site/antora/modules/ROOT/pages/index.adoc index f0444748..7176d71a 100644 --- a/src/site/antora/modules/ROOT/pages/index.adoc +++ b/src/site/antora/modules/ROOT/pages/index.adoc @@ -15,38 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. //// -= Log4j Tools += log4net -Tooling **internally** used by {logging-services-url}/log4j/2.x/[the Apache Log4j project] infrastructure: - -* xref:log4j-changelog.adoc[] -* xref:log4j-changelog-maven-plugin.adoc[] -* xref:log4j-docgen.adoc[] -* xref:log4j-docgen-maven-plugin.adoc[] -* xref:log4j-docgen-asciidoctor-extension.adoc[] - -[#maven-bom] -== Maven Bill of Materials (BOM) - -To keep your {project-name} module versions aligned, a https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#bill-of-materials-bom-poms[Maven Bill of Materials (BOM) POM] is provided for your convenience. - -To use this with Maven, add the dependency listed below to your `pom.xml` file. -Note that the `` nesting and the `import` instruction. -This will _import_ all modules bundled with the associated Log4j release to your `dependencyManagement`. -As a result, you don't have to specify versions of the imported modules (`log4j-changelog`, `log4j-docgen`, etc.) while using them as a ``. - -.`pom.xml` snippet importing `log4j-tools-bom` -[source,subs="+attributes"] ----- - - - - org.apache.logging.log4j - log4j-tools-bom - {project-version} - import - pom - - - ----- +The Apache log4net library is a tool to help the programmer output log statements to a variety of output targets. +For more information on log4net see the xref:features.adoc[] document. \ No newline at end of file diff --git a/src/site/antora/modules/ROOT/pages/log4j-changelog-maven-plugin.adoc b/src/site/antora/modules/ROOT/pages/log4j-changelog-maven-plugin.adoc deleted file mode 100644 index c4d9a473..00000000 --- a/src/site/antora/modules/ROOT/pages/log4j-changelog-maven-plugin.adoc +++ /dev/null @@ -1,157 +0,0 @@ -//// -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -//// - -= Log4j Changelog Maven Plugin - -This project ships a Maven plugin providing access to the `ChangelogExporter` and `ChangelogReleaser` of xref:log4j-changelog.adoc[Log4j Changelog]. - -[#dependencies] -== Dependencies - -You need to have the `org.apache.logging.log4j:log4j-changelog-maven-plugin` dependency in your classpath: - -[source,xml,subs="+attributes"] ----- - - org.apache.logging.log4j - log4j-changelog-maven-plugin - {project-version} - ----- - -[#export] -== Exporting changelogs - -_Exporting_ changelogs is the act of feeding provided changelog and release information into {freemarker-link} templates to generate certain files; e.g., release notes for the website. -There are two types template files supported: - -xref:log4j-changelog.adoc#changelog-template[Changelog templates]:: -These templates are rendered with the release and changelog information of a particular release. -These are generally used to generate release notes for a particular release. - -xref:log4j-changelog.adoc#index-template[Index templates]:: -These templates are rendered with the release information of all releases. -These are generally used to generate the index page referencing to release notes of each release. - -See xref:#export[the Log4j Changelog documentation] for further details. - -You can use the `export` goal as follows: - -.`build > plugins` block entry of `pom.xml` -[source,xml,subs="+attributes"] ----- - - - org.apache.logging.log4j - log4j-changelog-maven-plugin - {project-version} - false - - - - - - - - - - - generate-changelog - - export - - - - ----- - -`export` goal by default runs during the `pre-site` phase and accepts the following configuration: - -`skip` (parameter):: -Indicates if the execution should be skipped or not. -It defaults to `false` and can be set using the `log4j.changelog.skip` property. - -`changelogDirectory` (parameter):: -Directory containing release folders composed of changelog entry XML files. -It defaults to `${project.basedir}/src/changelog` and can be set using the `log4j.changelog.directory` property. - -`outputDirectory` (parameter):: -Directory to write rendered templates. -It defaults to `${project.build.directory}/generated-sources/site/changelog` and can be set using the `log4j.changelog.exporter.outputDirectory` property. - -`indexTemplates` (parameter):: -List of xref:#export-template-type[template]s that will be rendered with release information of all releases. -See xref:log4j-changelog.adoc#index-template[the index template file documentation] for details. - -`changelogTemplates` (parameter):: -List of xref:#export-template-type[template]s that will be rendered with release and changelog information of a particular release. -See xref:log4j-changelog.adoc#changelog-template[the changelog template file documentation] for details. - -[#export-template-type] -`Template` (type):: -An object composed of following fields: -+ -`source` (parameter)::: -the {freemarker-link} template file - -`target` (parameter)::: -The output file. -If not provided, it will be derived from the `source`: if the `source` is `.index.adoc.ftl`, the `target` will be set to `index.adoc`. -If the value contains a `%v` (e.g., `%v.adoc`), it will be replaced with the associated release version. -`%v` substitution is only allowed for changelog templates and will not work for index templates. - -`failIfNotFound` (parameter)::: -Indicates if export should fail when the source cannot be found. -Defaults to `false`. - -[#release] -== Populating a release changelog directory - -You can use the `release` goal wrapping xref:log4j-changelog.adoc#qa-deploy-release[`ChangelogReleaser` to populate a release changelog directory]. -An example usage is shared below. - -.Populate `src/changelog/2.19.0` from `src/changelog/.2.x.x` -[source,bash] ----- -./mvnw -N log4j-changelog:release -Dlog4j.changelog.releaseVersion=2.19.0 ----- - -Note that above we are using `-N` (`--non-recursive`) to avoid visiting submodules, which also makes the run faster. - -`release` goal does not have default phase and accepts the following configuration parameters: - -`skip` (parameter):: -Indicates if the execution should be skipped or not. -It defaults to `false` and can be set using the `log4j.changelog.skip` property. - -`changelogDirectory` (parameter):: -Directory containing release folders composed of changelog entry XML files. -It defaults to `${project.basedir}/src/changelog` and can be set using the `log4j.changelog.directory` property. - -`releaseVersion` (parameter):: -The version to be released. -It can be set using the `log4j.changelog.releaseVersion` property. - -`versionPattern` (parameter):: -The regular expression pattern for parsing versions. -The pattern must provide the following named groups: `major`, `minor`, and `patch`. -It defaults to `^(?0|[1-9]\d*)\.(?0|[1-9]\d*)\.(?0|[1-9]\d*(-[a-zA-Z][0-9a-zA-Z-]*)?)$` and can be set using the `log4j.changelog.versionPattern` property. diff --git a/src/site/antora/modules/ROOT/pages/log4j-changelog.adoc b/src/site/antora/modules/ROOT/pages/log4j-changelog.adoc deleted file mode 100644 index c75536fa..00000000 --- a/src/site/antora/modules/ROOT/pages/log4j-changelog.adoc +++ /dev/null @@ -1,278 +0,0 @@ -//// -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -//// - -= Log4j Changelog - -This project contains tools to maintain changelogs. -It is designed for Apache Log4j, but can be used for any Java project. - -[#dependencies] -== Dependencies - -You need to have the `org.apache.logging.log4j:log4j-changelog` dependency in your classpath: - -[source,xml,subs="+attributes"] ----- - - org.apache.logging.log4j - log4j-changelog - {project-version} - ----- - -Java module name and OSGi `Bundle-SymbolicName` are set to `org.apache.logging.log4j.changelog`. - -[#what-is-a-changelog] -== What is a changelog? - -A changelog is a log of all notable changes made to a project. - -[#why-different] -== Why yet another changelog tool? - -Existing changelog practices (e.g., https://keepachangelog.com[Keep a changelog], https://maven.apache.org/plugins/maven-changes-plugin/[maven-changes-plugin]) store changelog entries in the same file. -This creates merge conflicts between different branches. -Imagine multiple people working on multiple branches each containing a change to `CHANGELOG.md`. -Whoever succeeds in merging their branch to `main` first will cause a merge-conflict for the others, even though their work might be totally unrelated from each other. - -This project embraces a model where changelog entries are kept in separate files and hence are not prone to merge conflicts. -Similar to `maven-changes-plugin`, changelog sources and their exports (e.g., AsciiDoc-formatted) are split by design. - -[#look] -== What does it look like? - -All changelog _sources_ and templates used to _export_ them are stored in folders under _the changelog directory_ (e.g., `/src/changelog`): - -[source] ----- -$ tree -a src/changelog -├── 2.18.0 # <1> -│ ├── LOG4J2-3424_Properties_defined_in_configuration_using_a_value_attribute.xml # <4> -│ ├── LOG4J2-3425_Syslog_appender_lacks_the_SocketOptions_setting.xml # <4> -│ ├── LOG4J2-3426_Log4j_1_2_bridge_should_not_wrap_components_unnecessarily.xml # <4> -│ ├── LOG4J2-3427_Improves_ServiceLoader_support_on_servlet_containers.xml # <4> -│ ├── .release-notes.adoc.ftl # <5> -│ └── .release.xml # <3> -├── 2.19.0 # <1> -│ ├── LOG4J2-3588_Allow_PropertySources_to_be_added.xml # <4> -│ ├── LOG4J2-3590_Remove_SLF4J_1_8_x_binding.xml # <4> -│ ├── LOG4J2-3614_Harden_InstantFormatter_against_delegate_failures.xml # <4> -│ ├── LOG4J2-3556_JsonTemplateLayout_stack_trace_truncation_fix.xml # <4> -│ ├── .release-notes.adoc.ftl # <5> -│ └── .release.xml # <3> -├── .2.x.x # <2> -│ ├── LOG4J2-1284_redirect_old_javadoc_urls.xml # <4> -│ └── .release-notes.adoc.ftl # <5> -├── .changelog.adoc.ftl # <5> -└── .index.adoc.ftl # <5> ----- -<1> Changelog sources of _released versions_ are stored in `/` folders (e.g., `src/changelog/2.19.0`) -<2> Changelog sources of _upcoming releases_ are stored in `/..x.x` folders (e.g., `/src/changelog/.2.x.x`) -<3> `.release.xml` contains the information about the associated release. -Note that upcoming release folders (e.g., `src/changelog/.2.x.x`) don't contain a `.release.xml`, since these releases are by definition not done yet. -<4> All XML files not prefixed with a `.` (e.g., `src/changelog/.2.x.x/LOG4J2-3628_new_changelog_infra.xml`) constitute changelog entries -<5> {freemarker-link} templates are used to _export_ this information to various forms; AsciiDoc-formatted pages for the website, Markdown-formatted files for GitHub Releases, etc. - -[#release-entry-file] -== Release entry file - -A release entry file, `.release.xml`, consists of meta information regarding a particular release. -A sample _release entry_ file is shared below. - -.`src/changelog/2.19.0/release.xml` file contents -[source,xml] ----- - - ----- - -Note that upcoming release folders (e.g., `src/changelog/.2.x.x`) don't contain a `.release.xml`, since these releases are by definition not done yet. - -[#changelog-entry-file] -== Changelog entry file - -A changelog entry file consists of short meta information regarding a particular change. -They are named following the `[_].xml` pattern. -Consider the following examples: - -* `LOG4J2-3556_JsonTemplateLayout_stack_trace_truncation_fix.xml` -* `LOG4J2-3578_Generate_new_SSL_certs_for_testing.xml` -* `Update_jackson_2_11_0_2_11_2.xml` - -A sample _changelog entry_ file is shared below. - -.`src/changelog/2.19.0/LOG4J2-3556_JsonTemplateLayout_stack_trace_truncation_fix.xml` file contents -[source,xml] ----- - - - - - Make `JsonTemplateLayout` stack trace truncation operate for each label block - - ----- - -Some remarks about the structure of changelog entry files: - -* The root element must be named `entry` -* `entry.type` attribute is required and must be one of the change types: -** `added` – for new features -** `changed` – for changes in existing functionality -** `deprecated` – for soon-to-be removed features -** `fixed` – for any bug fixes -** `removed` – for now removed features -** `updated` – for dependency updates -* `issue` element is optional, can occur multiple times, and, if present, must contain `id` and `link` attributes -* There must be a single `description` element with non-blank content and `format` attribute - -[#export] -== Exporting changelogs - -_Exporting_ changelogs is the act of feeding provided changelog and release information into {freemarker-link} templates to generate certain files; e.g., release notes for the website. -There are two types template files supported: - -xref:#changelog-template[Changelog templates]:: -These templates are rendered with the release and changelog information of a particular release. -These are generally used to generate release notes for a particular release. - -xref:#index-template[Index templates]:: -These templates are rendered with the release information of all releases. -These are generally used to generate the index page referencing to release notes of each release. - -`ChangelogExporter` is responsible for performing the export operation. - -[#changelog-template] -=== Changelog templates - -Changelog template files (e.g., `src/changelog/2.19.0/.release-notes.adoc.ftl` ) are rendered with the release and changelog information of a particular release using the following input data hash: - -* `release` → `ChangelogRelease` -* `entriesByType` → `Map>` - -See `ChangelogRelease` and `ChangelogEntry` for details. - -These templates are generally used to generate release notes for a particular release. -A sample changelog template file is shared below. - -.`src/changelog/2.19.0/.release-notes.adoc.ftl` file contents -[source,asciidoc] ----- -= ${release.version}<#if release.date?has_content> (${release.date}) - -This release primarily contains bug fixes and minor enhancements. - -<#if entriesByType?size gt 0>== Changes -<#list entriesByType as entryType, entries> - -=== ${entryType?capitalize} - -<#list entries as entry> -* ${entry.description.text?replace("\\s+", " ", "r")} -(<#list entry.issues as issue>${issue.link}[${issue.id}]<#if issue?has_next>, ) - - - ----- - -[#index-template] -=== Index templates - -Index template files (e.g., `src/changelog/.index.adoc.ftl`) are rendered with the release information of all releases using the following input data hash: - -* `releases` -> list of hashes containing following keys: -** `version` -** `date` - -These template files are generally used to generate the index page referencing to release notes of each release. -A sample index template file is shared below. - -.`src/changelog/.index.adoc.ftl` file contents -[source,asciidoc] ----- -= Release changelogs - -<#list releases as release> -* xref:${release.version}.adoc[${release.version}]<#if release.date?has_content> (${release.date}) - ----- - -[#qa] -== Q&A - -[#qa-entry] -=== How can I add an entry for a change I am about to commit? - -You have just committed, or better, about to commit a great feature you have been working on. -Simply create a <> and commit it along with your change! - -[#qa-generate] -=== How can I export changelogs to AsciiDoc, Markdown, etc. files? - -You need to use xref:log4j-changelog-maven-plugin.adoc#export[the `export` goal the Maven plugin]. - -[#qa-deploy-release] -=== I am about to deploy a new release. What shall I do? - -Just before a release, three things need to happen in the changelog sources: - -. *Changelog entry files needs to be moved* from the _upcoming_ release changelog directory `/..x.x` to the _new_ release changelog directory `/` -. *Templates need to be copied* from the _upcoming_ release changelog directory to the _new_ release changelog directory, unless it already exists in the target -. *`.release.xml` needs to be created* in the _new_ release changelog directory - -Due to the nature of release candidates, above steps might need to be repeated multiple times. - -[TIP] -==== -Log4j _releases_ and _release candidates_ all get deployed to the same https://repository.apache.org/#stagingRepositories[_staging repository_]. -Their `pom.xml` files all contain the same release version, e.g., `2.19.0`. -There are no `-rc1`, `-rc2`, etc. suffixes in the version of a release candidate. -Once a release candidate voting reaches to a consensus for release, associated artifacts simply get promoted from the _staging_ to the _public_ repository. -Hence, there are no differences between releases and release candidates from the point of view of changelogs. -==== - -How to carry out aforementioned changes are explained below in steps: - -. Populate the `/` directory (e.g., `/src/changelog/2.19.0`) from the upcoming release changelog directory (e.g., `/.2.x.x`) using the xref:log4j-changelog-maven-plugin.adoc#release[`release` Maven goal]: -+ -[source,bash] ----- -./mvnw log4j-changelog:release \ - -Dlog4j.changelog.directory=/path/to/changelog/directory \ - -Dlog4j.changelog.releaseVersion=X.Y.Z ----- -. Verify that all changelog entry files are moved from `/..x.x` directory (e.g., `/src/changelog/.2.x.x`) -. Verify that `/` directory (e.g., `/src/changelog/2.19.0`) is created, and it contains templates, changelog entry files, and a `.release.xml` -+ -[IMPORTANT] -==== -If `/` directory (e.g., `/src/changelog/2.19.0`) already exists with certain content, `ChangelogReleaser` will only move new changelog entry files and override `.release.xml`; templates will not be overridden. -This allows one to run `ChangelogReleaser` multiple times, e.g., to incorporate changes added to a release candidate. -==== -. Edit the populated templates (e.g., update the release notes with a short summary paragraph) -. `git add` the changes in the changelog directory (e.g., `/src/changelog`) and commit them diff --git a/src/site/antora/modules/ROOT/pages/log4j-docgen-asciidoctor-extension.adoc b/src/site/antora/modules/ROOT/pages/log4j-docgen-asciidoctor-extension.adoc deleted file mode 100644 index a3e69de9..00000000 --- a/src/site/antora/modules/ROOT/pages/log4j-docgen-asciidoctor-extension.adoc +++ /dev/null @@ -1,62 +0,0 @@ -//// -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -//// - -= Log4j Docgen AsciiDoctor extension - -While xref:log4j-docgen.adoc#descriptor-generator[the descriptor generator] converts Javadoc to AsciiDoc, it cannot resolve links. -That is, it cannot blindly replace a `{@link example.MyAppender foo}` Javadoc snippet with a `\xref:MyAppender.adoc[foo]` AsciiDoc snippet instead. -This is because, the mapping of types to AsciiDoc files are not available to the descriptor generator, but xref:log4j-docgen.adoc#documentation-generator[the documentation generator]. -That is, the descriptor generator doesn't know if the type will be mapped to `.adoc` or `/.adoc`. -As a matter of fact, it should not need to know this either: descriptors capture immutable metadata, whereas documentation file structure can always change. -To work around this, we convert `{@link example.MyAppender foo}` to `apiref:example.MyAppender[foo]` and provide an `apiref` inline AsciiDoc macro to resolve these while generating the documentation. - -`DocgenExtension` AsciiDoctor extension provides the `apiref` inline macro which can be configured using the below shared AsciiDoctor document attributes: - -`log4j-docgen-descriptor-dot-files-included`:: -Indicates if dot files (i.e., `.`-prefix file names) will be accepted in <>. -This attribute defaults to `false`. - -[#log4j-docgen-asciidoctor-extension-attribute-descriptor-path-matcher] -`log4j-docgen-descriptor-path-matcher`:: -The https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/FileSystem.html#getPathMatcher(java.lang.String)[path pattern] (e.g., `glob:**/*.xml`) to locate files produced by xref:log4j-docgen.adoc#descriptor-generator[the descriptor generator]. -This attribute is *required*. - -`log4j-docgen-type-filter-exclude-pattern`:: -The regular expression to match against the types loaded from descriptors and determine if a type will be _excluded_ to generate links. -This argument defaults to not exclude anything. - -`log4j-docgen-type-filter-include-pattern`:: -The regular expression to match against the types loaded from descriptors and determine if a type will be _included_ to generate links. -This argument defaults to `.*`, that is, all loaded types will be used to generate links. - -`log4j-docgen-package-name-stripped`:: -Indicates if the package name will be stripped for unknown types. -That is, if `true`, `apiref:some.unknown.Class[]` will be converted to `Class`; `some.unknown.Class`, otherwise. -Note that this only applies to types where the label is not provided. -This flag is disabled by default. - -[#log4j-docgen-type-target-template] -`log4j-docgen-type-target-template`:: -The FreeMarker template to produce the link target for individual types documented, for instance: -+ -[source] ----- -#${sourcedType.groupId?replace('.', '-')}_${sourcedType.artifactId?replace('.', '-')}_${sourcedType.type.className?replace('.', '-') ----- - -+ -This attribute is *required*. diff --git a/src/site/antora/modules/ROOT/pages/log4j-docgen-maven-plugin.adoc b/src/site/antora/modules/ROOT/pages/log4j-docgen-maven-plugin.adoc deleted file mode 100644 index 7b728442..00000000 --- a/src/site/antora/modules/ROOT/pages/log4j-docgen-maven-plugin.adoc +++ /dev/null @@ -1,116 +0,0 @@ -//// -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -//// - -= Log4j Docgen Maven Plugin - -Log4j Docgen Maven Plugin allows you to easily run Log4j Docgen xref:log4j-docgen.adoc#documentation-generator[documentation generator] and xref:log4j-docgen.adoc#schema-generator[schema generator] from your `pom.xml`. - -[#dependencies] -== Dependencies - -You need to have the `org.apache.logging.log4j:log4j-docgen-maven-plugin` dependency in your classpath: - -[source,xml,subs="+attributes"] ----- - - org.apache.logging.log4j - log4j-docgen-maven-plugin - {project-version} - ----- - -[#generate-documentation] -== Generate documentation - -The `generate-documentation` goal generates an AsciiDoc-formatted documentation using FreeMarker templates that are fed with the types loaded from given descriptors: - -.An example `log4j-docgen:generate-documentation` configuration -[source,xml,subs="+attributes"] ----- - - - - - ${project.build.directory}/plugin-descriptors - - - - - - ^java\..+ - - - - ${project.basedir}/src/docgen-templates - - - - - - - - - - ----- -<1> `target` must be in sync. with xref:log4j-docgen-asciidoctor-extension.adoc#log4j-docgen-type-target-template[the `log4j-docgen-type-target-template` configuration of `log4j-docgen-asciidoctor-extension`]. - -The `generate-documentation` goal configuration also accepts the following parameters: - -`skip` (parameter):: -Indicates if the execution should be skipped or not. -It defaults to `false` and can be set using the `log4j.docgen.skip` property. - -[#generate-schema] -== Generate schema - -The `generate-schema` goal generates an XSD derived from the types loaded using given descriptors: - -.An example `log4j-docgen:generate-schema` configuration -[source,xml,subs="+attributes"] ----- - - - - - ${project.build.directory}/plugin-descriptors - - - - - - ^java\..+ - - - - ${project.version} - ${project.build.directory}/generated-site/resources/config.xsd - - ----- - -The `generate-schema` goal configuration also accepts the following parameters: - -`skip` (parameter):: -Indicates if the execution should be skipped or not. -It defaults to `false` and can be set using the `log4j.docgen.skip` property. diff --git a/src/site/antora/modules/ROOT/pages/log4j-docgen.adoc b/src/site/antora/modules/ROOT/pages/log4j-docgen.adoc deleted file mode 100644 index d78e02ca..00000000 --- a/src/site/antora/modules/ROOT/pages/log4j-docgen.adoc +++ /dev/null @@ -1,110 +0,0 @@ -//// -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -//// - -= Log4j Docgen - -Log4j Docgen (Documentation Generation) bundles utility classes to generate documentation from Log4j plugins. -Given almost all Log4j functionality (layouts, appenders, etc.) is implemented in the form of plugins, this project aims the following goals: - -Avoid the need to maintain documentation in multiple places:: -For instance, Log4j JSON Template Layout is composed of several plugins with sufficient Javadoc explaining their behaviour. -Next to this we also maintain a big `json-template-layout.adoc` page for the website, again, documenting each component. -By generating documentation from the source code, developers can precisely capture the behaviour of their components only in the very code itself that they change. - -Accurately capture the component configuration:: -It is pretty common that source code changes are not reflected to documentation. -By generating the documentation from the source code, this discrepancy gets removed. - -[#dependencies] -== Dependencies - -You need to have the `org.apache.logging.log4j:log4j-docgen` dependency in your classpath: - -[source,xml,subs="+attributes"] ----- - - org.apache.logging.log4j - log4j-docgen - {project-version} - ----- - -[#descriptor-generator] -== Descriptor generator - -`DescriptorGenerator` is an annotation processor that generates an XML file capturing all the metadata needed to document a plugin: - -* **types** – types it extends from, types it uses in its configuration, etc. -* **configuration** – extracts the necessary set of elements, attributes, etc. from builder classes, `@PluginFactory`-annotated methods, etc. -* **documentation** – extracts the Javadoc of each field and type, and converts it to AsciiDoc - -Users are recommended to integrate this annotation processor into their build: - -[source,xml,subs="+attributes"] ----- - - org.apache.maven.plugins - maven-compiler-plugin - - - - - org.apache.logging.log4j - log4j-docgen - {project-version} - - - - org.apache.logging.log4j - log4j-core - ${project.version} - - - - - -Alog4j.docgen.skip=false - -Alog4j.docgen.descriptorFilePath=${project.build.directory}/${project.artifactId}-plugins.xml - -Alog4j.docgen.groupId=${project.groupId} - -Alog4j.docgen.artifactId=${project.artifactId} - -Alog4j.docgen.version=${project.version} - -Alog4j.docgen.description=${project.description} - -Alog4j.docgen.typeFilter.excludePattern=^java\..+ - - - ----- - -[#documentation-generator] -== Documentation generator - -`DocumentationGenerator` receives - -. plugin descriptors (generated by the `DescriptorGenerator`) -. FreeMarker templates (to render the type hierarchy and each individual type) - -as input arguments, and produces an AsciiDoc-formatted documentation that one can integrate into the website of a project. - -Users are recommended to use xref:log4j-docgen-maven-plugin.adoc#generate-documentation[the `generate-documentation` goal of the `log4j-docgen-maven-plugin`] instead. - -[#schema-generator] -== Schema generator - -`SchemaGenerator` receives plugin descriptors (generated by the `DescriptorGenerator`) as input, and produces an XSD describing the structure defined by the descriptors. - -Users are recommended to use xref:log4j-docgen-maven-plugin.adoc#generate-schema[the `generate-schema` goal of the `log4j-docgen-maven-plugin`] instead. From 9826f8f0cca78ac4a095b42a7c15bc4d0064d538 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Sat, 2 Nov 2024 23:35:37 +0100 Subject: [PATCH 08/18] updated development.adoc --- antora-playbook.yaml | 6 +-- src/site/antora/antora.tmpl.yml | 4 +- .../modules/ROOT/pages/development.adoc | 47 +++++++++++++++++-- .../antora/modules/ROOT/pages/features.adoc | 7 ++- 4 files changed, 51 insertions(+), 13 deletions(-) diff --git a/antora-playbook.yaml b/antora-playbook.yaml index a878afa4..6b2a2c3b 100644 --- a/antora-playbook.yaml +++ b/antora-playbook.yaml @@ -16,8 +16,8 @@ # site: - title: Apache Log4j Tools - url: "https://logging.apache.org/log4j/kotlin" + title: Apache log4net + url: "https://logging.apache.org/log4net" start_page: "ROOT::index.adoc" content: @@ -138,4 +138,4 @@ ui: # Fix the `Edit this page` link - path: partials/edit-this-page.hbs contents: | - + diff --git a/src/site/antora/antora.tmpl.yml b/src/site/antora/antora.tmpl.yml index 743772b9..f57633a7 100644 --- a/src/site/antora/antora.tmpl.yml +++ b/src/site/antora/antora.tmpl.yml @@ -40,8 +40,8 @@ asciidoc: attributes: project-github-url: "${scm.url}" project-version: "${project.version}" - project-name: "Log4j Tools" - project-id: "log4j-tools" + project-name: "log4net" + project-id: "log4net" java-target-version: "${maven.compiler.target}" java-compiler-version: "${minimalJavaBuildVersion}" logging-services-url: "https://logging.apache.org" diff --git a/src/site/antora/modules/ROOT/pages/development.adoc b/src/site/antora/modules/ROOT/pages/development.adoc index 2bb11445..67aea4bd 100644 --- a/src/site/antora/modules/ROOT/pages/development.adoc +++ b/src/site/antora/modules/ROOT/pages/development.adoc @@ -15,22 +15,61 @@ limitations under the License. //// +[#development] = Development {project-name} uses {project-github-url}[GitHub] for source code management. -The project requires a Java compiler matching the `{java-compiler-version}` range and targets Java `{java-target-version}`. +[#building] +== Building log4net -You can build and verify sources using: +Log4net provides support for the following targets +* net462 +* netstandard2.0 + +[#windows] +=== Windows +* install Visual Studio Build Tools (at least VS 2022) +* install dotnet (v8+) and the .NET SDK (current latest) +* in the project folder ++ +[source,powershell] +---- +dotnet test ./src/log4net.sln +---- + +[#docker] +=== Docker +* install docker (if you haven't already) +** https://docs.docker.com/engine/install/ +* in logging/log4net run ++ [source,bash] ---- -./mvnw verify +docker build -t log4net-builder . +docker run -it log4net-builder +---- +** this will +*** install all dependencies in the container +*** build src/log4net.sln +* inside the container run ++ +[source,bash] +---- +dotnet test /logging-log4net/src/log4net.sln ---- +[#linux-macos] +=== Linux / MacOS +- install the dotnet SDK - v8 or better +- install Mono (you're going to need it to target certain versions of .NET) + +[#site] +== Site You can build and view the website as follows: -[source,bash] +[source,bash/powershell] ---- ./mvnw -N site ---- diff --git a/src/site/antora/modules/ROOT/pages/features.adoc b/src/site/antora/modules/ROOT/pages/features.adoc index a13ffaef..fec253d9 100644 --- a/src/site/antora/modules/ROOT/pages/features.adoc +++ b/src/site/antora/modules/ROOT/pages/features.adoc @@ -18,8 +18,7 @@ limitations under the License. = Features log4net is a tool to help the programmer output log statements to a variety of output targets. -In case of problems with an application, it is helpful to enable logging so that the problem -can be located. +In case of problems with an application, it is helpful to enable logging so that the problem can be located. With log4net it is possible to enable logging at runtime without modifying the application binary. -The log4net package is designed so that log statements can remain in shipped code without incurring a -high performance cost. It follows that the speed of logging (or rather not logging) is crucial. +The log4net package is designed so that log statements can remain in shipped code without incurring a high performance cost. +It follows that the speed of logging (or rather not logging) is crucial. \ No newline at end of file From 159e924b004b54163bf5aa1ccaf23b6d91e67de2 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 11 Nov 2024 21:51:53 +0100 Subject: [PATCH 09/18] fix duplicate tag in pom --- package-lock.json | 4 ++-- pom.xml | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef584e06..488f552a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "log4net", - "version": "3.0.3", + "version": "3.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "log4net", - "version": "3.0.3", + "version": "3.0.4", "license": "Apache-2.0", "devDependencies": { "@antora/cli": "^3.2.0-alpha.4", diff --git a/pom.xml b/pom.xml index 166ca362..9e0067d4 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,6 @@ org.apache.logging.log4net apache-log4net ${revision} - pom Apache log4net Logging framework for Microsoft .NET Framework. From 8a3042ee1fbdade5b348c0e7661f54b6c793d1c1 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 11 Nov 2024 22:35:50 +0100 Subject: [PATCH 10/18] added release notes for 3.0.2 and 3.0.3 --- .../{0.1.0 => 3.0.2}/.release-notes.adoc.ftl | 2 - src/changelog/{0.1.0 => 3.0.2}/.release.xml | 4 +- .../189-separate-review-instructions.xml} | 6 +-- ...ectdisposedexception-in-telnetappender.xml | 9 ++++ src/changelog/3.0.2/196-broken-mdc.xml | 8 ++++ src/changelog/3.0.2/196-broken-ndc.xml | 8 ++++ .../3.0.2/196-more-modern-coding-style.xml | 8 ++++ ...n-creating-child-loggers-multithreaded.xml | 9 ++++ src/changelog/3.0.3/.release-notes.adoc.ftl | 41 +++++++++++++++++++ src/changelog/3.0.3/.release.xml | 6 +++ src/changelog/3.0.3/196-fix-mdc.xml | 8 ++++ src/changelog/3.0.3/196-fix-ndc.xml | 8 ++++ .../3.0.3/199-fix-empty-username-linux.xml | 8 ++++ src/changelog/3.0.3/200-bump-nunit.xml | 8 ++++ src/changelog/3.0.3/201-enable-ca.xml | 8 ++++ .../3.0.3/202-file-scoped-namespaces.xml | 8 ++++ .../3.0.3/203-raw-strings-in-tests.xml | 8 ++++ .../3.0.3/205-rollpverrenamefiles-virtual.xml | 9 ++++ 18 files changed, 159 insertions(+), 7 deletions(-) rename src/changelog/{0.1.0 => 3.0.2}/.release-notes.adoc.ftl (94%) rename src/changelog/{0.1.0 => 3.0.2}/.release.xml (83%) rename src/changelog/{0.1.0/LOG4J2-3628_add_tools_bom_and_changelog_modules.xml => 3.0.2/189-separate-review-instructions.xml} (59%) create mode 100644 src/changelog/3.0.2/194-objectdisposedexception-in-telnetappender.xml create mode 100644 src/changelog/3.0.2/196-broken-mdc.xml create mode 100644 src/changelog/3.0.2/196-broken-ndc.xml create mode 100644 src/changelog/3.0.2/196-more-modern-coding-style.xml create mode 100644 src/changelog/3.0.2/197-indexoutfrangeexception-when-creating-child-loggers-multithreaded.xml create mode 100644 src/changelog/3.0.3/.release-notes.adoc.ftl create mode 100644 src/changelog/3.0.3/.release.xml create mode 100644 src/changelog/3.0.3/196-fix-mdc.xml create mode 100644 src/changelog/3.0.3/196-fix-ndc.xml create mode 100644 src/changelog/3.0.3/199-fix-empty-username-linux.xml create mode 100644 src/changelog/3.0.3/200-bump-nunit.xml create mode 100644 src/changelog/3.0.3/201-enable-ca.xml create mode 100644 src/changelog/3.0.3/202-file-scoped-namespaces.xml create mode 100644 src/changelog/3.0.3/203-raw-strings-in-tests.xml create mode 100644 src/changelog/3.0.3/205-rollpverrenamefiles-virtual.xml diff --git a/src/changelog/0.1.0/.release-notes.adoc.ftl b/src/changelog/3.0.2/.release-notes.adoc.ftl similarity index 94% rename from src/changelog/0.1.0/.release-notes.adoc.ftl rename to src/changelog/3.0.2/.release-notes.adoc.ftl index 626a9138..85eb1e0e 100644 --- a/src/changelog/0.1.0/.release-notes.adoc.ftl +++ b/src/changelog/3.0.2/.release-notes.adoc.ftl @@ -38,6 +38,4 @@ <#if release.date?has_content>Release date:: ${release.date} -This is the first release, aimed to assist [the Apache Log4j 2](https://logging.apache.org/log4j/2.x/) on generating release notes. - <#include "../.changelog.adoc.ftl"> diff --git a/src/changelog/0.1.0/.release.xml b/src/changelog/3.0.2/.release.xml similarity index 83% rename from src/changelog/0.1.0/.release.xml rename to src/changelog/3.0.2/.release.xml index 0223ff5d..b5a8a85f 100644 --- a/src/changelog/0.1.0/.release.xml +++ b/src/changelog/3.0.2/.release.xml @@ -2,5 +2,5 @@ + date="2024-10-21" + version="3.0.2"/> diff --git a/src/changelog/0.1.0/LOG4J2-3628_add_tools_bom_and_changelog_modules.xml b/src/changelog/3.0.2/189-separate-review-instructions.xml similarity index 59% rename from src/changelog/0.1.0/LOG4J2-3628_add_tools_bom_and_changelog_modules.xml rename to src/changelog/3.0.2/189-separate-review-instructions.xml index 7aebfe52..deeac463 100644 --- a/src/changelog/0.1.0/LOG4J2-3628_add_tools_bom_and_changelog_modules.xml +++ b/src/changelog/3.0.2/189-separate-review-instructions.xml @@ -3,6 +3,6 @@ xmlns="https://logging.apache.org/xml/ns" xsi:schemaLocation="https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" type="added"> - - Add `log4j-tools-bom` and `log4j-changelog` modules - + + separate review instructions for log4net (by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.2/194-objectdisposedexception-in-telnetappender.xml b/src/changelog/3.0.2/194-objectdisposedexception-in-telnetappender.xml new file mode 100644 index 00000000..21412943 --- /dev/null +++ b/src/changelog/3.0.2/194-objectdisposedexception-in-telnetappender.xml @@ -0,0 +1,9 @@ + + + + ObjectDisposedException in TelnetAppender (3.0.1) reported by @VianneyTremelo, + fixed by @FreeAndNil in https://github.com/apache/logging-log4net/pull/195[#195] + diff --git a/src/changelog/3.0.2/196-broken-mdc.xml b/src/changelog/3.0.2/196-broken-mdc.xml new file mode 100644 index 00000000..6526fe1b --- /dev/null +++ b/src/changelog/3.0.2/196-broken-mdc.xml @@ -0,0 +1,8 @@ + + + + MDC was accidentally renamed into Mdc - this will be reverted in 3.0.3 + diff --git a/src/changelog/3.0.2/196-broken-ndc.xml b/src/changelog/3.0.2/196-broken-ndc.xml new file mode 100644 index 00000000..c83409c9 --- /dev/null +++ b/src/changelog/3.0.2/196-broken-ndc.xml @@ -0,0 +1,8 @@ + + + + NDC was accidentally renamed into Ndc - this will be reverted in 3.0.3 + diff --git a/src/changelog/3.0.2/196-more-modern-coding-style.xml b/src/changelog/3.0.2/196-more-modern-coding-style.xml new file mode 100644 index 00000000..7dba546f --- /dev/null +++ b/src/changelog/3.0.2/196-more-modern-coding-style.xml @@ -0,0 +1,8 @@ + + + + more modern coding style (by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.2/197-indexoutfrangeexception-when-creating-child-loggers-multithreaded.xml b/src/changelog/3.0.2/197-indexoutfrangeexception-when-creating-child-loggers-multithreaded.xml new file mode 100644 index 00000000..80000aef --- /dev/null +++ b/src/changelog/3.0.2/197-indexoutfrangeexception-when-creating-child-loggers-multithreaded.xml @@ -0,0 +1,9 @@ + + + + IndexOutOfRangeException when creating child loggers multithreaded (reported by @FreeAndNil, + fixed by @FreeAndNil in https://github.com/apache/logging-log4net/pull/198[#198] + diff --git a/src/changelog/3.0.3/.release-notes.adoc.ftl b/src/changelog/3.0.3/.release-notes.adoc.ftl new file mode 100644 index 00000000..85eb1e0e --- /dev/null +++ b/src/changelog/3.0.3/.release-notes.adoc.ftl @@ -0,0 +1,41 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +//// + ██ ██ █████ ██████ ███ ██ ██ ███ ██ ██████ ██ + ██ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██ ██ ██ + ██ █ ██ ███████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ + ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ███ ███ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██████ ██ + + IF THIS FILE DOESN'T HAVE A `.ftl` SUFFIX, IT IS AUTO-GENERATED, DO NOT EDIT IT! + + Version-specific release notes (`7.8.0.adoc`, etc.) are generated from `src/changelog/*/.release-notes.adoc.ftl`. + Auto-generation happens during `generate-sources` phase of Maven. + Hence, you must always + + 1. Find and edit the associated `.release-notes.adoc.ftl` + 2. Run `./mvnw generate-sources` + 3. Commit both `.release-notes.adoc.ftl` and the generated `7.8.0.adoc` +//// + +[#release-notes-${release.version?replace("[^a-zA-Z0-9]", "-", "r")}] +== ${release.version} + +<#if release.date?has_content>Release date:: ${release.date} + +<#include "../.changelog.adoc.ftl"> diff --git a/src/changelog/3.0.3/.release.xml b/src/changelog/3.0.3/.release.xml new file mode 100644 index 00000000..32a5f023 --- /dev/null +++ b/src/changelog/3.0.3/.release.xml @@ -0,0 +1,6 @@ + + diff --git a/src/changelog/3.0.3/196-fix-mdc.xml b/src/changelog/3.0.3/196-fix-mdc.xml new file mode 100644 index 00000000..a6083b85 --- /dev/null +++ b/src/changelog/3.0.3/196-fix-mdc.xml @@ -0,0 +1,8 @@ + + + + MDC was accidentally renamed into Mdc in 3.0.2 - this change was reverted + diff --git a/src/changelog/3.0.3/196-fix-ndc.xml b/src/changelog/3.0.3/196-fix-ndc.xml new file mode 100644 index 00000000..70b46b7c --- /dev/null +++ b/src/changelog/3.0.3/196-fix-ndc.xml @@ -0,0 +1,8 @@ + + + + NDC was accidentally renamed into Ndc in 3.0.2 - this change was reverted + diff --git a/src/changelog/3.0.3/199-fix-empty-username-linux.xml b/src/changelog/3.0.3/199-fix-empty-username-linux.xml new file mode 100644 index 00000000..ec19569d --- /dev/null +++ b/src/changelog/3.0.3/199-fix-empty-username-linux.xml @@ -0,0 +1,8 @@ + + + + Fix empty string received by .NET 8 users on Linux on userName (by @gdziadkiewicz) + diff --git a/src/changelog/3.0.3/200-bump-nunit.xml b/src/changelog/3.0.3/200-bump-nunit.xml new file mode 100644 index 00000000..54f0b26e --- /dev/null +++ b/src/changelog/3.0.3/200-bump-nunit.xml @@ -0,0 +1,8 @@ + + + + Bumped NUnit to 4.2.2 (by @FreeAndNil) + diff --git a/src/changelog/3.0.3/201-enable-ca.xml b/src/changelog/3.0.3/201-enable-ca.xml new file mode 100644 index 00000000..d0faca23 --- /dev/null +++ b/src/changelog/3.0.3/201-enable-ca.xml @@ -0,0 +1,8 @@ + + + + Enable Microsoft.CodeAnalysis.NetAnalyzers (by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.3/202-file-scoped-namespaces.xml b/src/changelog/3.0.3/202-file-scoped-namespaces.xml new file mode 100644 index 00000000..888b2648 --- /dev/null +++ b/src/changelog/3.0.3/202-file-scoped-namespaces.xml @@ -0,0 +1,8 @@ + + + + file scoped namespaces and CA warnings fixed in examples (by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.3/203-raw-strings-in-tests.xml b/src/changelog/3.0.3/203-raw-strings-in-tests.xml new file mode 100644 index 00000000..5d8c0194 --- /dev/null +++ b/src/changelog/3.0.3/203-raw-strings-in-tests.xml @@ -0,0 +1,8 @@ + + + + use raw strings for config files in unit tests (by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.3/205-rollpverrenamefiles-virtual.xml b/src/changelog/3.0.3/205-rollpverrenamefiles-virtual.xml new file mode 100644 index 00000000..45ec4fc1 --- /dev/null +++ b/src/changelog/3.0.3/205-rollpverrenamefiles-virtual.xml @@ -0,0 +1,9 @@ + + + + use raw strings for config files in unit tests (reported by @FerdinandStapenhorst, + implemented by @FreeAndNil in https://github.com/apache/logging-log4net/pull/206[#206] + \ No newline at end of file From 6888d2d8c357c130ec920ef635a218f90a59f4b9 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Tue, 12 Nov 2024 19:12:50 +0100 Subject: [PATCH 11/18] fixed known issues section --- src/changelog/3.0.2/.release-notes.adoc.ftl | 8 +++++++- src/changelog/3.0.2/196-broken-mdc.xml | 8 -------- src/changelog/3.0.2/196-broken-ndc.xml | 8 -------- src/changelog/3.0.3/196-fix-mdc.xml | 2 +- src/changelog/3.0.3/196-fix-ndc.xml | 2 +- 5 files changed, 9 insertions(+), 19 deletions(-) delete mode 100644 src/changelog/3.0.2/196-broken-mdc.xml delete mode 100644 src/changelog/3.0.2/196-broken-ndc.xml diff --git a/src/changelog/3.0.2/.release-notes.adoc.ftl b/src/changelog/3.0.2/.release-notes.adoc.ftl index 85eb1e0e..a708d2cb 100644 --- a/src/changelog/3.0.2/.release-notes.adoc.ftl +++ b/src/changelog/3.0.2/.release-notes.adoc.ftl @@ -38,4 +38,10 @@ <#if release.date?has_content>Release date:: ${release.date} -<#include "../.changelog.adoc.ftl"> +[#release-notes-3-0-2-known-issues] +=== Known issues + +* MDC was accidentally renamed into Mdc - this will be reverted in 3.0.3 +* NDC was accidentally renamed into Ndc - this will be reverted in 3.0.3 + +<#include "../.changelog.adoc.ftl"> \ No newline at end of file diff --git a/src/changelog/3.0.2/196-broken-mdc.xml b/src/changelog/3.0.2/196-broken-mdc.xml deleted file mode 100644 index 6526fe1b..00000000 --- a/src/changelog/3.0.2/196-broken-mdc.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - MDC was accidentally renamed into Mdc - this will be reverted in 3.0.3 - diff --git a/src/changelog/3.0.2/196-broken-ndc.xml b/src/changelog/3.0.2/196-broken-ndc.xml deleted file mode 100644 index c83409c9..00000000 --- a/src/changelog/3.0.2/196-broken-ndc.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - NDC was accidentally renamed into Ndc - this will be reverted in 3.0.3 - diff --git a/src/changelog/3.0.3/196-fix-mdc.xml b/src/changelog/3.0.3/196-fix-mdc.xml index a6083b85..7c2e49b1 100644 --- a/src/changelog/3.0.3/196-fix-mdc.xml +++ b/src/changelog/3.0.3/196-fix-mdc.xml @@ -3,6 +3,6 @@ xmlns="https://logging.apache.org/xml/ns" xsi:schemaLocation="https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" type="fixed"> - + MDC was accidentally renamed into Mdc in 3.0.2 - this change was reverted diff --git a/src/changelog/3.0.3/196-fix-ndc.xml b/src/changelog/3.0.3/196-fix-ndc.xml index 70b46b7c..550479a9 100644 --- a/src/changelog/3.0.3/196-fix-ndc.xml +++ b/src/changelog/3.0.3/196-fix-ndc.xml @@ -3,6 +3,6 @@ xmlns="https://logging.apache.org/xml/ns" xsi:schemaLocation="https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" type="fixed"> - + NDC was accidentally renamed into Ndc in 3.0.2 - this change was reverted From 21459cffdc479e61e78f4381abe161a413a7ac14 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Tue, 12 Nov 2024 19:29:26 +0100 Subject: [PATCH 12/18] added link to 2.x release notes --- src/changelog/.changelog.adoc.ftl | 6 +++--- src/changelog/.index.adoc.ftl | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/changelog/.changelog.adoc.ftl b/src/changelog/.changelog.adoc.ftl index 00a9a1a9..e63407d1 100644 --- a/src/changelog/.changelog.adoc.ftl +++ b/src/changelog/.changelog.adoc.ftl @@ -20,8 +20,8 @@ [#release-notes-${release.version?replace("[^a-zA-Z0-9]", "-", "r")}-${entryType?lower_case}] === ${entryType?capitalize} -<#list entries as entry> -* ${entry.description.text?replace("\\s+", " ", "r")}<#if entry.issues?has_content> (<#list entry.issues as issue>${issue.link}[${issue.id}]<#if issue?has_next>, ) - + <#list entries as entry> + * ${entry.description.text?replace("\\s+", " ", "r")}<#if entry.issues?has_content> (<#list entry.issues as issue>${issue.link}[${issue.id}]<#if issue?has_next>, ) + diff --git a/src/changelog/.index.adoc.ftl b/src/changelog/.index.adoc.ftl index 24c1ef38..933468fa 100644 --- a/src/changelog/.index.adoc.ftl +++ b/src/changelog/.index.adoc.ftl @@ -42,3 +42,6 @@ include::_release-notes/${release.version}.adoc[] + +[#release-notes-2.x-and-older] +=== https://logging.apache.org/log4net/log4net-2.0.17/release/release-notes.html[2.x and older] \ No newline at end of file From 2cbfc2ae4e38c20ebbd6e26e5c843d8714168a56 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Thu, 14 Nov 2024 23:22:37 +0100 Subject: [PATCH 13/18] added release note for 3.0.1 moved link to 2.x in extra folder --- .gitignore | 1 + src/changelog/.index.adoc.ftl | 5 +-- src/changelog/2.x/.release-notes.adoc.ftl | 41 +++++++++++++++++++ src/changelog/2.x/.release.xml | 6 +++ src/changelog/2.x/2.x-and-older.xml | 8 ++++ src/changelog/3.0.1/.release-notes.adoc.ftl | 41 +++++++++++++++++++ src/changelog/3.0.1/.release.xml | 6 +++ src/changelog/3.0.1/176-added-source-link.xml | 8 ++++ ...managedthreadid-for-long-running-tasks.xml | 9 ++++ .../3.0.1/181-automate-version-bumps.xml | 8 ++++ ...til.PatternString-not-working-in-3.0.0.xml | 9 ++++ ...n-creating-child-loggers-multithreaded.xml | 2 +- 12 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 src/changelog/2.x/.release-notes.adoc.ftl create mode 100644 src/changelog/2.x/.release.xml create mode 100644 src/changelog/2.x/2.x-and-older.xml create mode 100644 src/changelog/3.0.1/.release-notes.adoc.ftl create mode 100644 src/changelog/3.0.1/.release.xml create mode 100644 src/changelog/3.0.1/176-added-source-link.xml create mode 100644 src/changelog/3.0.1/177-use-managedthreadid-for-long-running-tasks.xml create mode 100644 src/changelog/3.0.1/181-automate-version-bumps.xml create mode 100644 src/changelog/3.0.1/183-log4net.Util.PatternString-not-working-in-3.0.0.xml diff --git a/.gitignore b/.gitignore index cd141542..a2d86354 100644 --- a/.gitignore +++ b/.gitignore @@ -236,3 +236,4 @@ dotnetfx35.exe local-tasks/*.generated.js /.flattened-pom.xml +validate \ No newline at end of file diff --git a/src/changelog/.index.adoc.ftl b/src/changelog/.index.adoc.ftl index 933468fa..c08d82f9 100644 --- a/src/changelog/.index.adoc.ftl +++ b/src/changelog/.index.adoc.ftl @@ -41,7 +41,4 @@ <#list releases as release><#if release.changelogEntryCount gt 0> include::_release-notes/${release.version}.adoc[] - - -[#release-notes-2.x-and-older] -=== https://logging.apache.org/log4net/log4net-2.0.17/release/release-notes.html[2.x and older] \ No newline at end of file + \ No newline at end of file diff --git a/src/changelog/2.x/.release-notes.adoc.ftl b/src/changelog/2.x/.release-notes.adoc.ftl new file mode 100644 index 00000000..e30cd4e6 --- /dev/null +++ b/src/changelog/2.x/.release-notes.adoc.ftl @@ -0,0 +1,41 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +//// + ██ ██ █████ ██████ ███ ██ ██ ███ ██ ██████ ██ + ██ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██ ██ ██ + ██ █ ██ ███████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ + ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ███ ███ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██████ ██ + + IF THIS FILE DOESN'T HAVE A `.ftl` SUFFIX, IT IS AUTO-GENERATED, DO NOT EDIT IT! + + Version-specific release notes (`7.8.0.adoc`, etc.) are generated from `src/changelog/*/.release-notes.adoc.ftl`. + Auto-generation happens during `generate-sources` phase of Maven. + Hence, you must always + + 1. Find and edit the associated `.release-notes.adoc.ftl` + 2. Run `./mvnw generate-sources` + 3. Commit both `.release-notes.adoc.ftl` and the generated `7.8.0.adoc` +//// + +[#release-notes-${release.version?replace("[^a-zA-Z0-9]", "-", "r")}] +== ${release.version} + +<#if release.date?has_content>Release date:: ${release.date} + +<#include "../.changelog.adoc.ftl"> \ No newline at end of file diff --git a/src/changelog/2.x/.release.xml b/src/changelog/2.x/.release.xml new file mode 100644 index 00000000..71f705ec --- /dev/null +++ b/src/changelog/2.x/.release.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/src/changelog/2.x/2.x-and-older.xml b/src/changelog/2.x/2.x-and-older.xml new file mode 100644 index 00000000..8b455e02 --- /dev/null +++ b/src/changelog/2.x/2.x-and-older.xml @@ -0,0 +1,8 @@ + + + + release notes for older releases can be found here + diff --git a/src/changelog/3.0.1/.release-notes.adoc.ftl b/src/changelog/3.0.1/.release-notes.adoc.ftl new file mode 100644 index 00000000..e30cd4e6 --- /dev/null +++ b/src/changelog/3.0.1/.release-notes.adoc.ftl @@ -0,0 +1,41 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +//// + ██ ██ █████ ██████ ███ ██ ██ ███ ██ ██████ ██ + ██ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██ ██ ██ + ██ █ ██ ███████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ + ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ███ ███ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██████ ██ + + IF THIS FILE DOESN'T HAVE A `.ftl` SUFFIX, IT IS AUTO-GENERATED, DO NOT EDIT IT! + + Version-specific release notes (`7.8.0.adoc`, etc.) are generated from `src/changelog/*/.release-notes.adoc.ftl`. + Auto-generation happens during `generate-sources` phase of Maven. + Hence, you must always + + 1. Find and edit the associated `.release-notes.adoc.ftl` + 2. Run `./mvnw generate-sources` + 3. Commit both `.release-notes.adoc.ftl` and the generated `7.8.0.adoc` +//// + +[#release-notes-${release.version?replace("[^a-zA-Z0-9]", "-", "r")}] +== ${release.version} + +<#if release.date?has_content>Release date:: ${release.date} + +<#include "../.changelog.adoc.ftl"> \ No newline at end of file diff --git a/src/changelog/3.0.1/.release.xml b/src/changelog/3.0.1/.release.xml new file mode 100644 index 00000000..c637ce9e --- /dev/null +++ b/src/changelog/3.0.1/.release.xml @@ -0,0 +1,6 @@ + + diff --git a/src/changelog/3.0.1/176-added-source-link.xml b/src/changelog/3.0.1/176-added-source-link.xml new file mode 100644 index 00000000..19671ba6 --- /dev/null +++ b/src/changelog/3.0.1/176-added-source-link.xml @@ -0,0 +1,8 @@ + + + + added source link (by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.1/177-use-managedthreadid-for-long-running-tasks.xml b/src/changelog/3.0.1/177-use-managedthreadid-for-long-running-tasks.xml new file mode 100644 index 00000000..79b5675b --- /dev/null +++ b/src/changelog/3.0.1/177-use-managedthreadid-for-long-running-tasks.xml @@ -0,0 +1,9 @@ + + + + use ManagedThreadId for long running tasks reported by @Audela-220, + fixed by @FreeAndNil in https://github.com/apache/logging-log4net/pull/180[#180] + diff --git a/src/changelog/3.0.1/181-automate-version-bumps.xml b/src/changelog/3.0.1/181-automate-version-bumps.xml new file mode 100644 index 00000000..b0a35b60 --- /dev/null +++ b/src/changelog/3.0.1/181-automate-version-bumps.xml @@ -0,0 +1,8 @@ + + + + automate version bumps (by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.1/183-log4net.Util.PatternString-not-working-in-3.0.0.xml b/src/changelog/3.0.1/183-log4net.Util.PatternString-not-working-in-3.0.0.xml new file mode 100644 index 00000000..49054c79 --- /dev/null +++ b/src/changelog/3.0.1/183-log4net.Util.PatternString-not-working-in-3.0.0.xml @@ -0,0 +1,9 @@ + + + + log4net.Util.PatternString not working in 3.0.0 (Unable to set property [file] on object [log4net.Appender.FileAppender]), reported by @sc-mk, + fixed by @FreeAndNil in https://github.com/apache/logging-log4net/pull/184[#184] + diff --git a/src/changelog/3.0.2/197-indexoutfrangeexception-when-creating-child-loggers-multithreaded.xml b/src/changelog/3.0.2/197-indexoutfrangeexception-when-creating-child-loggers-multithreaded.xml index 80000aef..a3b85d44 100644 --- a/src/changelog/3.0.2/197-indexoutfrangeexception-when-creating-child-loggers-multithreaded.xml +++ b/src/changelog/3.0.2/197-indexoutfrangeexception-when-creating-child-loggers-multithreaded.xml @@ -4,6 +4,6 @@ xsi:schemaLocation="https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" type="fixed"> - IndexOutOfRangeException when creating child loggers multithreaded (reported by @FreeAndNil, + IndexOutOfRangeException when creating child loggers multithreaded, reported by @FreeAndNil, fixed by @FreeAndNil in https://github.com/apache/logging-log4net/pull/198[#198] From c1c87ee6f190cc59a2aeaf50b961d64ae0eadbf2 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 18 Nov 2024 19:26:50 +0100 Subject: [PATCH 14/18] migrated release notes for 3.0.0 --- src/changelog/3.0.0/.release-notes.adoc.ftl | 98 +++++++++++++++++++ src/changelog/3.0.0/.release.xml | 6 ++ src/changelog/3.0.0/109-dotnet-test-run.xml | 8 ++ .../3.0.0/111-drop-legacy-runtimes.xml | 9 ++ src/changelog/3.0.0/124-eventlist.xml | 8 ++ src/changelog/3.0.0/124-innerhashtable.xml | 8 ++ .../3.0.0/124-nullable-annotations.xml | 16 +++ src/changelog/3.0.0/125-remove-deprecated.xml | 9 ++ src/changelog/3.0.0/127-add-docker.xml | 9 ++ .../3.0.0/154-remotingappender-removed.xml | 8 ++ .../3.0.0/156-regression-logger-reverse.xml | 8 ++ .../157-emittednoappenderwarning-internal.xml | 8 ++ .../3.0.0/158-netsendappender-removed.xml | 8 ++ src/changelog/3.0.0/168-console-preamble.xml | 8 ++ .../3.0.0/169-nullreference-compare-level.xml | 8 ++ .../3.0.0/175-serialization-removed.xml | 8 ++ .../3.0.0/179-culture-rollingfileappender.xml | 8 ++ 17 files changed, 235 insertions(+) create mode 100644 src/changelog/3.0.0/.release-notes.adoc.ftl create mode 100644 src/changelog/3.0.0/.release.xml create mode 100644 src/changelog/3.0.0/109-dotnet-test-run.xml create mode 100644 src/changelog/3.0.0/111-drop-legacy-runtimes.xml create mode 100644 src/changelog/3.0.0/124-eventlist.xml create mode 100644 src/changelog/3.0.0/124-innerhashtable.xml create mode 100644 src/changelog/3.0.0/124-nullable-annotations.xml create mode 100644 src/changelog/3.0.0/125-remove-deprecated.xml create mode 100644 src/changelog/3.0.0/127-add-docker.xml create mode 100644 src/changelog/3.0.0/154-remotingappender-removed.xml create mode 100644 src/changelog/3.0.0/156-regression-logger-reverse.xml create mode 100644 src/changelog/3.0.0/157-emittednoappenderwarning-internal.xml create mode 100644 src/changelog/3.0.0/158-netsendappender-removed.xml create mode 100644 src/changelog/3.0.0/168-console-preamble.xml create mode 100644 src/changelog/3.0.0/169-nullreference-compare-level.xml create mode 100644 src/changelog/3.0.0/175-serialization-removed.xml create mode 100644 src/changelog/3.0.0/179-culture-rollingfileappender.xml diff --git a/src/changelog/3.0.0/.release-notes.adoc.ftl b/src/changelog/3.0.0/.release-notes.adoc.ftl new file mode 100644 index 00000000..94b14261 --- /dev/null +++ b/src/changelog/3.0.0/.release-notes.adoc.ftl @@ -0,0 +1,98 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +//// + ██ ██ █████ ██████ ███ ██ ██ ███ ██ ██████ ██ + ██ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██ ██ ██ + ██ █ ██ ███████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ + ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ███ ███ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██████ ██ + + IF THIS FILE DOESN'T HAVE A `.ftl` SUFFIX, IT IS AUTO-GENERATED, DO NOT EDIT IT! + + Version-specific release notes (`7.8.0.adoc`, etc.) are generated from `src/changelog/*/.release-notes.adoc.ftl`. + Auto-generation happens during `generate-sources` phase of Maven. + Hence, you must always + + 1. Find and edit the associated `.release-notes.adoc.ftl` + 2. Run `./mvnw generate-sources` + 3. Commit both `.release-notes.adoc.ftl` and the generated `7.8.0.adoc` +//// + +[#release-notes-${release.version?replace("[^a-zA-Z0-9]", "-", "r")}] +== ${release.version} + +<#if release.date?has_content>Release date:: ${release.date} + +[#release-notes-3-0-0-breaking-changes] +=== Breaking changes + +[IMPORTANT] +==== +Starting with 3.0.0 we only support the following target frameworks + +* net462 +* netstandard2.0 + +The reasoning for this change can be found in https://github.com/apache/logging-log4net/issues/111[#111 - Dropping support for older runtimes] +==== + +[#release-notes-3-0-0-removed-obsolete] +==== Removed obsolete classes and members + +[#release-notes-3-0-0-removed-obsolete-1.2.14] +===== since 1.2.14 (2015) + +* log4net.Appender.BufferingAppenderSkeleton.OnlyFixPartialEventData +* log4net.Appender.ColoredConsoleAppender.ctor(ILayout) +* log4net.Appender.ColoredConsoleAppender.ctor(ILayout, bool) +* log4net.Appender.ConsoleAppender.ctor(ILayout) +* log4net.Appender.ConsoleAppender.ctor(ILayout, bool) +* log4net.Appender.DebugAppender.ctor(ILayout) +* log4net.Appender.EventLogAppender.ctor(ILayout) +* log4net.Appender.FileAppender.ctor(ILayout, string) +* log4net.Appender.FileAppender.ctor(ILayout, string, bool) +* log4net.Appender.MemoryAppender.OnlyFixPartialEventData +* log4net.Appender.SmtpAppender.LocationInfo +* log4net.Appender.TextWriterAppender.ctor(ILayout, Stream) +* log4net.Appender.TextWriterAppender.ctor(ILayout, TextWriter) +* log4net.Appender.TraceAppender.ctor(ILayout) +* log4net.Config.DOMConfigurator +* log4net.Config.AliasDomainAttribute +* log4net.Config.DomainAttribute +* log4net.Config.DOMConfiguratorAttribute +* log4net.Core.LoggerManager.GetLoggerRepository +* log4net.Core.LoggerManager.CreateDomain +* log4net.Core.LoggingEventData.TimeStamp +* log4net.Core.LoggingEvent.GetExceptionStrRep +* log4net.Core.LoggingEvent.FixVolatileData +* log4net.LogManager.GetLoggerRepository +* log4net.LogManager.CreateDomain + +[#release-notes-3-0-0-removed-obsolete-2.0.6] +===== since 2.0.6 (2016) + +* log4net.Util.SystemInfo.ProcessStartTime + +[#release-notes-3-0-0-sealed] +==== Sealed classes - the following classes are now sealed + +* log4net.Config.AliasRepositoryAttribute +* log4net.Config.RepositoryAttribute +* log4net.Config.XmlConfiguratorAttribute + +<#include "../.changelog.adoc.ftl"> \ No newline at end of file diff --git a/src/changelog/3.0.0/.release.xml b/src/changelog/3.0.0/.release.xml new file mode 100644 index 00000000..addfd973 --- /dev/null +++ b/src/changelog/3.0.0/.release.xml @@ -0,0 +1,6 @@ + + diff --git a/src/changelog/3.0.0/109-dotnet-test-run.xml b/src/changelog/3.0.0/109-dotnet-test-run.xml new file mode 100644 index 00000000..36eea130 --- /dev/null +++ b/src/changelog/3.0.0/109-dotnet-test-run.xml @@ -0,0 +1,8 @@ + + + + Fix dotnet (ie not netfx) test run (by @mobilebilly) + \ No newline at end of file diff --git a/src/changelog/3.0.0/111-drop-legacy-runtimes.xml b/src/changelog/3.0.0/111-drop-legacy-runtimes.xml new file mode 100644 index 00000000..8a145492 --- /dev/null +++ b/src/changelog/3.0.0/111-drop-legacy-runtimes.xml @@ -0,0 +1,9 @@ + + + + + Dropping support for older runtimes (by @fluffynuts and @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.0/124-eventlist.xml b/src/changelog/3.0.0/124-eventlist.xml new file mode 100644 index 00000000..9484d278 --- /dev/null +++ b/src/changelog/3.0.0/124-eventlist.xml @@ -0,0 +1,8 @@ + + + + log4net.Appender.MemoryAppender.m_eventsList (protected field) is now List<LoggingEvent> (instead of System.Collections.ArrayList) + \ No newline at end of file diff --git a/src/changelog/3.0.0/124-innerhashtable.xml b/src/changelog/3.0.0/124-innerhashtable.xml new file mode 100644 index 00000000..86fb605a --- /dev/null +++ b/src/changelog/3.0.0/124-innerhashtable.xml @@ -0,0 +1,8 @@ + + + + log4net.Util.ReadOnlyPropertiesDictionary.InnerHashtable is now Dictionary<string, object?> (instead of System.Collections.Hashtable) + \ No newline at end of file diff --git a/src/changelog/3.0.0/124-nullable-annotations.xml b/src/changelog/3.0.0/124-nullable-annotations.xml new file mode 100644 index 00000000..d69263fd --- /dev/null +++ b/src/changelog/3.0.0/124-nullable-annotations.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + Add support for nullable annotations (by @erikmav) + \ No newline at end of file diff --git a/src/changelog/3.0.0/125-remove-deprecated.xml b/src/changelog/3.0.0/125-remove-deprecated.xml new file mode 100644 index 00000000..47a940ab --- /dev/null +++ b/src/changelog/3.0.0/125-remove-deprecated.xml @@ -0,0 +1,9 @@ + + + + + Remove deprecated code for 3.0 (by @erikmav) + \ No newline at end of file diff --git a/src/changelog/3.0.0/127-add-docker.xml b/src/changelog/3.0.0/127-add-docker.xml new file mode 100644 index 00000000..06fda1ce --- /dev/null +++ b/src/changelog/3.0.0/127-add-docker.xml @@ -0,0 +1,9 @@ + + + + + Enable building log4net with docker container (by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.0/154-remotingappender-removed.xml b/src/changelog/3.0.0/154-remotingappender-removed.xml new file mode 100644 index 00000000..0f7cfbc3 --- /dev/null +++ b/src/changelog/3.0.0/154-remotingappender-removed.xml @@ -0,0 +1,8 @@ + + + + log4net.Appender.RemotingAppender + \ No newline at end of file diff --git a/src/changelog/3.0.0/156-regression-logger-reverse.xml b/src/changelog/3.0.0/156-regression-logger-reverse.xml new file mode 100644 index 00000000..7fb69647 --- /dev/null +++ b/src/changelog/3.0.0/156-regression-logger-reverse.xml @@ -0,0 +1,8 @@ + + + + Regression: Creating nested loggers in reverse order fails in 3.0.0-preview.1 (by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.0/157-emittednoappenderwarning-internal.xml b/src/changelog/3.0.0/157-emittednoappenderwarning-internal.xml new file mode 100644 index 00000000..322607a8 --- /dev/null +++ b/src/changelog/3.0.0/157-emittednoappenderwarning-internal.xml @@ -0,0 +1,8 @@ + + + + log4net.Repository.Hierarchy.Hierarchy.EmittedNoAppenderWarning is now internal + \ No newline at end of file diff --git a/src/changelog/3.0.0/158-netsendappender-removed.xml b/src/changelog/3.0.0/158-netsendappender-removed.xml new file mode 100644 index 00000000..a5f693c3 --- /dev/null +++ b/src/changelog/3.0.0/158-netsendappender-removed.xml @@ -0,0 +1,8 @@ + + + + log4net.Appender.NetSendAppender + \ No newline at end of file diff --git a/src/changelog/3.0.0/168-console-preamble.xml b/src/changelog/3.0.0/168-console-preamble.xml new file mode 100644 index 00000000..e22ecc98 --- /dev/null +++ b/src/changelog/3.0.0/168-console-preamble.xml @@ -0,0 +1,8 @@ + + + + ColoredConsoleAppender writes UTF-8 preamble to the console on initialization (reported by @RoboBurned, fixed by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.0/169-nullreference-compare-level.xml b/src/changelog/3.0.0/169-nullreference-compare-level.xml new file mode 100644 index 00000000..f6502b06 --- /dev/null +++ b/src/changelog/3.0.0/169-nullreference-compare-level.xml @@ -0,0 +1,8 @@ + + + + System.NullReferenceException when comparing with a null Level (by @FreeAndNil) + \ No newline at end of file diff --git a/src/changelog/3.0.0/175-serialization-removed.xml b/src/changelog/3.0.0/175-serialization-removed.xml new file mode 100644 index 00000000..e4d6e508 --- /dev/null +++ b/src/changelog/3.0.0/175-serialization-removed.xml @@ -0,0 +1,8 @@ + + + + Serializable Support (for .netstandard) + \ No newline at end of file diff --git a/src/changelog/3.0.0/179-culture-rollingfileappender.xml b/src/changelog/3.0.0/179-culture-rollingfileappender.xml new file mode 100644 index 00000000..a24dc5ac --- /dev/null +++ b/src/changelog/3.0.0/179-culture-rollingfileappender.xml @@ -0,0 +1,8 @@ + + + + Culture-Specific String Comparisons Cause RollingFileAppender Failure in log4net on NET 5+ (reported by @stianeklund) + \ No newline at end of file From 80fae104865576911779fbd4fd4ea2480c2fd76d Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Sat, 14 Dec 2024 13:09:52 +0100 Subject: [PATCH 15/18] finished features page --- src/site/antora/modules/ROOT/nav.adoc | 2 + .../antora/modules/ROOT/pages/features.adoc | 153 ++++++++++++++++-- .../ROOT/pages/manual/configuration.adoc | 19 +++ .../modules/ROOT/pages/manual/index.adoc | 71 ++++++++ 4 files changed, 230 insertions(+), 15 deletions(-) create mode 100644 src/site/antora/modules/ROOT/pages/manual/configuration.adoc create mode 100644 src/site/antora/modules/ROOT/pages/manual/index.adoc diff --git a/src/site/antora/modules/ROOT/nav.adoc b/src/site/antora/modules/ROOT/nav.adoc index 4fa5645f..e489d589 100644 --- a/src/site/antora/modules/ROOT/nav.adoc +++ b/src/site/antora/modules/ROOT/nav.adoc @@ -16,6 +16,8 @@ //// * xref:development.adoc[] +* xref:manual/index.adoc[] +** xref:manual/configuration.adoc[] * xref:features.adoc[] * xref:release-notes.adoc[] * {logging-services-url}/download.html[Download] diff --git a/src/site/antora/modules/ROOT/pages/features.adoc b/src/site/antora/modules/ROOT/pages/features.adoc index fec253d9..ebc3521f 100644 --- a/src/site/antora/modules/ROOT/pages/features.adoc +++ b/src/site/antora/modules/ROOT/pages/features.adoc @@ -1,24 +1,147 @@ //// -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. //// +[#features] = Features +[#overview] +== Overview log4net is a tool to help the programmer output log statements to a variety of output targets. In case of problems with an application, it is helpful to enable logging so that the problem can be located. With log4net it is possible to enable logging at runtime without modifying the application binary. The log4net package is designed so that log statements can remain in shipped code without incurring a high performance cost. -It follows that the speed of logging (or rather not logging) is crucial. \ No newline at end of file +It follows that the speed of logging (or rather not logging) is crucial. + +At the same time, log output can be so voluminous that it quickly becomes overwhelming. +One of the distinctive features of log4net is the notion of hierarchical loggers. +Using these loggers it is possible to selectively control which log statements are output at arbitrary granularity. + +log4net is designed with two distinct goals in mind: speed and flexibility + +[#featurelist] +== Features +* Support for multiple frameworks +* Output to multiple logging targets +* Hierarchical logging architecture +* XML Configuration +* Dynamic Configuration +* Logging Context +* Proven architecture +* Modular and extensible design +* High performance with flexibility + +[#frameworks] +== Support for multiple frameworks +log4net has specific builds for the following frameworks: + +* .NET Core 8 or higher - using netstandard-2.0 +* Microsoft .NET Framework 4.6.2 or higher + +[#appenders] +== Output to multiple logging targets +log4net ships with the following appenders +[cols="Type,Description"] +|=== +|Type |Description + +|AdoNetAppender +|Writes logging events to a database using either prepared statements or stored procedures. + +|AnsiColorTerminalAppender +|Writes color highlighted logging events to a an ANSI terminal window. + +|AspNetTraceAppender +|Writes logging events to the ASP trace context. These can then be rendered at the end of the ASP page or on the ASP trace page. + +|ColoredConsoleAppender +|Writes color highlighted logging events to the application's Windows Console. + +|ConsoleAppender +|Writes logging events to the application's Console. +The events may go to either the standard our stream or the standard error stream. + +|DebugAppender +|Writes logging events to the .net debugger (https://web.archive.org/web/20240930165834/https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.debug?view=net-8.0[System.Diagnostics.Debug]). + +|EventLogAppender +|Writes logging events to the Windows Event Log. + +|FileAppender +|Writes logging events to a file in the file system. + +|LocalSyslogAppender +|Writes logging events to the local https://datatracker.ietf.org/doc/html/rfc3164[syslog] service (UNIX only). + +|MemoryAppender +|Stores logging events in an in memory buffer. + +|OutputDebugStringAppender +|Writes logging events to the debugger (using https://web.archive.org/web/20241118170546/https://learn.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-outputdebugstringw[OutputDebugString]). +If the application has no debugger, the system debugger displays the string. +If the application has no debugger and the system debugger is not active, the message is ignored. + +|RemoteSyslogAppender +|Writes logging events to a remote https://datatracker.ietf.org/doc/html/rfc3164[syslog] service using UDP networking. + +|RollingFileAppender +|Writes logging events to a file in the file system. +The RollingFileAppender can be configured to log to multiple files based upon date or file size constraints. + +|SmtpAppender +|Sends logging events to an email address. + +|SmtpPickupDirAppender +|Sends logging events to an email address but writes the emails to a configurable directory rather than sending them directly via SMTP. + +|TelnetAppender +|*Clients* connect via Telnet to receive logging events. + +|TraceAppender +|Writes logging events to the .NET trace system (https://web.archive.org/web/20240907024634/https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.trace?view=net-8.0[System.Diagnostics.Trace]). + +|UdpAppender +|Sends logging events as connectionless UDP datagrams to a remote host or a multicast group using a UdpClient. + +|ForwardingAppender +|Can be used to wrap another appender, for example to attach additional filters. + +|=== + +[#hierarchy] +== Hierarchical logging architecture +Hierarchical logging is an ideal fit with component based development. +Each component has its own of logger. +When individually tested, the properties of these loggers may be set as the developer requires. +When combined with other components, the loggers inherit the properties determined by the integrator of the components. +One can selectively elevate logging priorities on one component without affecting the other components. +This is useful when you need a detailed trace from just a single component without crowding the trace file with messages from other components. +All this can be done through configuration files - no code changes are required. + +[#xml-config] +== XML Configuration +log4net is configured using an XML configuration file. +The configuration information can be embedded within other XML configuration files (such as the application's .config file) or in a separate file. +The configuration is easily readable and updateable while retaining the flexibility to express all configurations. + +Alternatively log4net can be configured programmatically. + +[#dynamic-config] +== Dynamic Configuration +log4net can monitor its configuration file for changes and dynamically apply changes made by the configurator. +The logging levels, appenders, layouts, and just about everything else can be adjusted at runtime. +In many cases it is possible to diagnose application issues without terminating the process in question. +This can a very valuable tool in investigating issues with deployed applications. \ No newline at end of file diff --git a/src/site/antora/modules/ROOT/pages/manual/configuration.adoc b/src/site/antora/modules/ROOT/pages/manual/configuration.adoc new file mode 100644 index 00000000..e6e875a6 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/manual/configuration.adoc @@ -0,0 +1,19 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +[#configuration] += Configuration \ No newline at end of file diff --git a/src/site/antora/modules/ROOT/pages/manual/index.adoc b/src/site/antora/modules/ROOT/pages/manual/index.adoc new file mode 100644 index 00000000..4163c7d9 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/manual/index.adoc @@ -0,0 +1,71 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// += Manual + +log4net is a tool to help the programmer output log statements to a variety of output targets. + +In case of problems with an application, it is helpful to enable logging so that the problem can be located. +With log4net it is possible to enable logging at runtime without modifying the application binary. +The log4net package is designed so that log statements can remain in _production_ code without incurring a high performance cost. +It follows that the speed of logging (or rather not logging) is crucial. + +At the same time, log output can be so voluminous that it quickly becomes overwhelming. +One of the distinctive features of log4net (and common to all of +the log4x libraries) is the notion of _hierarchical loggers_. +Using these loggers it is possible to selectively control +which log statements are output at arbitrary granularity. + +log4net is designed with two distinct goals in mind: speed and flexibility. +There is a tight balance between these two requirements. + +== What are the prerequisites for log4net? + +log4net runs on net462 or higher and any framework supporting netstandard2.0. + +== Is there example code for using log4net? + +You can find many examples in https://github.com/apache/logging-log4net/tree/master/examples[log4net/examples]. + +== What does log4net offer? + +log4net offers numerous features, including: + +* log4net is optimized for speed +* log4net is based on a named logger hierarchy +* log4net is thread-safe +* Logging behavior can be set at runtime using a configuration file (xml) +* log4net is designed to handle exceptions from the start +* log4net can direct its output to many sinks including: a file, the console, Syslog/EventLog or even e-mail +* log4net categorizes logging into levels: DEBUG, INFO, WARN, ERROR and FATAL. +* The format of the log output can be easily changed by implementing a new layout class +* The target of the log output as well as the writing strategy can be altered by writing a new appender class +* log4net supports multiple output appenders per logger + +See xref:features.adoc[] + +//// + +== How to learn more? + + * xref:manual/getting-started.adoc[How can I get started with Log4j?] + * xref:manual/installation.adoc[How can I install Log4j?] + * xref:manual/configuration.adoc[How can I configure Log4j?] + * xref:manual/api.adoc[How can I use Log4j API?] + * xref:manual/performance.adoc[How can I tune my Log4j setup for performance?] + * xref:manual/plugins.adoc[What are Log4j plugins] and xref:manual/extending.adoc[how can I use them to extend Log4j?] + +//// \ No newline at end of file From 61015e49c13efb70b01ef6d25515ac41253bc86d Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Sat, 21 Dec 2024 17:35:58 +0100 Subject: [PATCH 16/18] added download an installation pages --- src/site/antora/modules/ROOT/nav.adoc | 2 +- .../antora/modules/ROOT/pages/download.adoc | 30 ++++++++++++++++ src/site/antora/modules/ROOT/pages/index.adoc | 1 + .../ROOT/pages/manual/installation.adoc | 35 +++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/site/antora/modules/ROOT/pages/download.adoc create mode 100644 src/site/antora/modules/ROOT/pages/manual/installation.adoc diff --git a/src/site/antora/modules/ROOT/nav.adoc b/src/site/antora/modules/ROOT/nav.adoc index e489d589..b4cc4e7a 100644 --- a/src/site/antora/modules/ROOT/nav.adoc +++ b/src/site/antora/modules/ROOT/nav.adoc @@ -15,11 +15,11 @@ limitations under the License. //// +* xref:download.adoc[] * xref:development.adoc[] * xref:manual/index.adoc[] ** xref:manual/configuration.adoc[] * xref:features.adoc[] * xref:release-notes.adoc[] -* {logging-services-url}/download.html[Download] * {logging-services-url}/support.html[Support] * {logging-services-url}/security.html[Security] diff --git a/src/site/antora/modules/ROOT/pages/download.adoc b/src/site/antora/modules/ROOT/pages/download.adoc new file mode 100644 index 00000000..9fa57ea7 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/download.adoc @@ -0,0 +1,30 @@ +//// +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +//// + +[#download] += Download + +You can manually download all published log4net distributions, verify them, and see their licensing information by following the instructions in the https://logging.apache.org/download.html[Download page] of https://logging.apache.org[Logging Services]. + +[TIP] +==== +* Are you looking for **the log4net installation instructions**? +Proceed to xref:manual/installation.adoc[]. +* Are you looking for the list of changes associated with a particular release? +Proceed to xref:release-notes.adoc[]. +==== + diff --git a/src/site/antora/modules/ROOT/pages/index.adoc b/src/site/antora/modules/ROOT/pages/index.adoc index 7176d71a..fe105b06 100644 --- a/src/site/antora/modules/ROOT/pages/index.adoc +++ b/src/site/antora/modules/ROOT/pages/index.adoc @@ -15,6 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. //// +[#log4net] = log4net The Apache log4net library is a tool to help the programmer output log statements to a variety of output targets. diff --git a/src/site/antora/modules/ROOT/pages/manual/installation.adoc b/src/site/antora/modules/ROOT/pages/manual/installation.adoc new file mode 100644 index 00000000..1eee866a --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/manual/installation.adoc @@ -0,0 +1,35 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +[#install] += Install Apache log4net + +The preferred way to install log4net is to use our https://www.nuget.org/packages/log4net[nuget package]. + +Just add the following lines in your project file. +[source,xml] +---- + + + +---- +Now you can use log4net. See our https://github.com/apache/logging-log4net/tree/master/examples[examples]. + +[source,powershell] +---- +dotnet add package log4net +---- \ No newline at end of file From a685fd6fa8890fbf4b76a622f76b630956063cc9 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Sat, 21 Dec 2024 18:28:51 +0100 Subject: [PATCH 17/18] first part of configuration migrated --- .../ROOT/pages/manual/configuration.adoc | 217 +++++++++++++++++- 1 file changed, 216 insertions(+), 1 deletion(-) diff --git a/src/site/antora/modules/ROOT/pages/manual/configuration.adoc b/src/site/antora/modules/ROOT/pages/manual/configuration.adoc index e6e875a6..ae4641ce 100644 --- a/src/site/antora/modules/ROOT/pages/manual/configuration.adoc +++ b/src/site/antora/modules/ROOT/pages/manual/configuration.adoc @@ -16,4 +16,219 @@ //// [#configuration] -= Configuration \ No newline at end of file += Configuration + +Using a configuration file is the most popular and recommended approach for configuring log4net. +In this page we will examine the composition of a configuration file and how log4net uses it. + +[source,csharp] +---- +using Animals.Carnivora; +// Import log4net classes. +using log4net; +using log4net.Config; + +namespace SampleApp; + +private static class MyApp +{ + // Define a static logger variable so that it references the Logger instance named "MyApp". + private static readonly ILog logger = LogManager.GetLogger(typeof(MyApp)); + + private static void Main(string[] args) + { + // Set up a simple configuration that logs on the console. + BasicConfigurator.Configure(); + + logger.Info("Entering application."); + Dog dog = new(); + bar.Bark(); + logger.Info("Exiting application."); + } +} +---- + +MyApp begins by importing log4net related namespaces. +It then defines a static logger variable with the name MyApp which happens to be the fully qualified name of the class. + +MyApp uses the following Dog class: + +[source,csharp] +---- + +// Import log4net classes +using log4net; + +namespace Animals.Carnivora; + +internal sealed class Dog +{ + private static readonly ILog logger = LogManager.GetLogger(typeof(Dog)); + + internal void Bark() => logger.Debug("Woof!"); +} +---- + +The invocation of the BasicConfigurator.Configure() method creates a rather simple log4net setup. +This method is hardwired to add to the root logger a ConsoleAppender. +The output will be formatted using a PatternLayout set to the following pattern: + +[source,log] +---- +%timestamp [%thread] %level %logger %ndc - %message%newline +---- + +Note that by default, the root logger is assigned to Level.DEBUG. + +The output of MyApp is: + +[source,log] +---- +2024-12-21 14:07:41,508 [main] INFO SampleApp.MyApp - Entering application. +2024-12-21 14:07:41,517 [main] DEBUG Animals.Carnivora.Dog - Woof! +2024-12-21 14:07:41,529 [main] INFO SampleApp.MyApp - Exiting application. +---- + +As a side note, let me mention that in log4net child loggers link only to their existing ancestors. +In particular, the logger named Animals.Carnivora.Dog is linked directly to the root logger, thereby circumventing the unused Animals or Animals.Carnivora loggers. +This significantly increases performance and reduces log4net's memory footprint. + +The MyApp class configures log4net by invoking BasicConfigurator.Configure() method. +Other classes only need to import the log4net namespace, retrieve the loggers they wish to use, and log away. + +The previous example always outputs the same log information. +Fortunately, it is easy to modify MyApp so that the log output can be controlled at run-time. +Here is a slightly modified version. + +[source,csharp] +---- +using Animals.Carnivora; +// Import log4net classes. +using log4net; +using log4net.Config; + +namespace SampleApp; + +private static class MyApp +{ + private static readonly ILog logger = LogManager.GetLogger(typeof(MyApp)); + + private static void Main(string[] args) + { + // BasicConfigurator replaced with XmlConfigurator. + XmlConfigurator.Configure(); + + logger.Info("Entering application."); + Dog dog = new(); + bar.Bark(); + logger.Info("Exiting application."); + } +} +---- + +This version of MyApp instructs the XmlConfigurator to parse a configuration file and set up logging accordingly. + +Here is a sample configuration file that results in exactly same output as the previous BasicConfigurator based example. + +[source,xml] +---- + + + + + + + + + + + + + + +---- + +Suppose we are no longer interested in seeing the output of any component belonging to the Animals.Carnivora namespace. + +The following configuration file shows one possible way of achieving this. + +[source,xml] +---- + + + + + + + + + + + + + + + + + + +---- + +The output of MyApp configured with this file is shown below. + +[source,log] +---- +2024-12-21 14:07:41,508 [main] INFO SampleApp.MyApp - Entering application. +2024-12-21 14:07:41,529 [main] INFO SampleApp.MyApp - Exiting application. +---- + +As the logger Animals.Carnivora.Dog does not have an assigned level, it inherits its level from Animals.Carnivora, which was set to WARN in the configuration file. +The log statement from the Dog.Bark method has the level DEBUG, lower than the logger level WARN. +Consequently, Bark() method's log request is suppressed. + +Here is another configuration file that uses multiple appenders. + +[source,xml] +---- + + + + + + + + + + + + + + + + + + + + + + + +---- + +Calling the enhanced MyApp with the this configuration file will output the following on the console. + +[source,log] +---- +INFO [main] (MyApp.cs:17) - Entering application. +DEBUG [main] (Dog.cs:10) - Woof! +INFO [main] (MyApp.cs:20) - Exiting application. +---- + +In addition, as the root logger has been allocated a second appender, output will also be directed to the example.log file. +This file will be rolled over when it reaches 100KB. +When roll-over occurs, the old version of example.log is automatically moved to example.log.1. + +Note that to obtain these different logging behaviors we did not need to recompile code. +We could just as easily have logged to an email address or redirected all Animals.Carnivora output to an remote syslog server. + +For more examples of configuring appenders using the XmlConfigurator see the Example Appender Configuration #TODO document. \ No newline at end of file From 9f0c9f3f27dfcc0729d8869d18e6c86e3a629c06 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 30 Dec 2024 17:15:48 +0100 Subject: [PATCH 18/18] added appenders doc --- src/site/antora/modules/ROOT/nav.adoc | 4 + .../modules/ROOT/pages/manual/appenders.adoc | 85 + .../pages/manual/configuration-examples.adoc | 234 +++ .../modules/ROOT/pages/manual/filters.adoc | 1506 +++++++++++++++++ .../modules/ROOT/pages/manual/layouts.adoc | 563 ++++++ 5 files changed, 2392 insertions(+) create mode 100644 src/site/antora/modules/ROOT/pages/manual/appenders.adoc create mode 100644 src/site/antora/modules/ROOT/pages/manual/configuration-examples.adoc create mode 100644 src/site/antora/modules/ROOT/pages/manual/filters.adoc create mode 100644 src/site/antora/modules/ROOT/pages/manual/layouts.adoc diff --git a/src/site/antora/modules/ROOT/nav.adoc b/src/site/antora/modules/ROOT/nav.adoc index b4cc4e7a..62bd12f3 100644 --- a/src/site/antora/modules/ROOT/nav.adoc +++ b/src/site/antora/modules/ROOT/nav.adoc @@ -18,7 +18,11 @@ * xref:download.adoc[] * xref:development.adoc[] * xref:manual/index.adoc[] +** xref:manual/appenders.adoc[] ** xref:manual/configuration.adoc[] +*** xref:manual/configuration-examples.adoc[] +** xref:manual/filters.adoc[] +** xref:manual/layouts.adoc[] * xref:features.adoc[] * xref:release-notes.adoc[] * {logging-services-url}/support.html[Support] diff --git a/src/site/antora/modules/ROOT/pages/manual/appenders.adoc b/src/site/antora/modules/ROOT/pages/manual/appenders.adoc new file mode 100644 index 00000000..da47121e --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/manual/appenders.adoc @@ -0,0 +1,85 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// +[#appenders] += Appenders + +Appenders are responsible for delivering log events to their destination. +Every Appender must implement the `IAppender` interface. + +While not strictly required by the log4net architecture, most appenders inherit from `AppenderSkeleton` and: + +* delegate the filtering of log events to an implementation of `IFilter`. +See xref:manual/filters.adoc[] for more information. +* delegate the formatting of log events to an implementation of `ILayout`. +See xref:manual/layouts.adoc[] for more information. +* only directly handle the writing of log event data to the target destination. + +Appenders always have a name so that they can be referenced from a +xref:manual/configuration.adoc#configuring-loggers[logger configuration]. + +[#file-appenders] +== File appenders + +File appenders write logs to the filesystem. +They can be further split into: + +Single file appenders::: +//See xref:manual/appenders/file.adoc[] for details. + +Rolling file appenders::: +//See xref:manual/appenders/rolling-file.adoc[] for details. + +[#database-appenders] +=== Database appenders + +The appenders write log events directly to a database. + +//xref:manual/appenders/database.adoc#JdbcAppender[JDBC appender]:: +Sends log events to a JDBC driver + +//xref:manual/appenders/database.adoc#NoSqlAppender[NoSQL appender]:: +Store log events to a document-oriented database + +//See xref:manual/appenders/database.adoc[] for details. + +[#network-appenders] +=== Network appenders + +These appenders use simple network protocols to transmit log events to a remote host. +The supported network protocols are: + +`UDP`:: +`TCP`:: +//These are handled by the xref:manual/appenders/network.adoc#SocketAppender[Socket Appender]. + +`HTTP`:: +//This is handled by the xref:manual/appenders/network.adoc#HttpAppender[HTTP Appender]. + +`SMTP`:: +//This is handled by the xref:manual/appenders/network.adoc#HttpAppender[SMTP Appender]. + +//See xref:manual/appenders/network.adoc[] for details. + +[#delegating-appenders] +=== Delegating appenders + +Delegating appenders are intended to decorate other appenders: + +//xref:manual/appenders/delegating.adoc#RoutingAppender[Routing appender]:: +Dynamically choose a different appender for each log event + +// See xref:manual/appenders/delegating.adoc[] for details. \ No newline at end of file diff --git a/src/site/antora/modules/ROOT/pages/manual/configuration-examples.adoc b/src/site/antora/modules/ROOT/pages/manual/configuration-examples.adoc new file mode 100644 index 00000000..ae4641ce --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/manual/configuration-examples.adoc @@ -0,0 +1,234 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +[#configuration] += Configuration + +Using a configuration file is the most popular and recommended approach for configuring log4net. +In this page we will examine the composition of a configuration file and how log4net uses it. + +[source,csharp] +---- +using Animals.Carnivora; +// Import log4net classes. +using log4net; +using log4net.Config; + +namespace SampleApp; + +private static class MyApp +{ + // Define a static logger variable so that it references the Logger instance named "MyApp". + private static readonly ILog logger = LogManager.GetLogger(typeof(MyApp)); + + private static void Main(string[] args) + { + // Set up a simple configuration that logs on the console. + BasicConfigurator.Configure(); + + logger.Info("Entering application."); + Dog dog = new(); + bar.Bark(); + logger.Info("Exiting application."); + } +} +---- + +MyApp begins by importing log4net related namespaces. +It then defines a static logger variable with the name MyApp which happens to be the fully qualified name of the class. + +MyApp uses the following Dog class: + +[source,csharp] +---- + +// Import log4net classes +using log4net; + +namespace Animals.Carnivora; + +internal sealed class Dog +{ + private static readonly ILog logger = LogManager.GetLogger(typeof(Dog)); + + internal void Bark() => logger.Debug("Woof!"); +} +---- + +The invocation of the BasicConfigurator.Configure() method creates a rather simple log4net setup. +This method is hardwired to add to the root logger a ConsoleAppender. +The output will be formatted using a PatternLayout set to the following pattern: + +[source,log] +---- +%timestamp [%thread] %level %logger %ndc - %message%newline +---- + +Note that by default, the root logger is assigned to Level.DEBUG. + +The output of MyApp is: + +[source,log] +---- +2024-12-21 14:07:41,508 [main] INFO SampleApp.MyApp - Entering application. +2024-12-21 14:07:41,517 [main] DEBUG Animals.Carnivora.Dog - Woof! +2024-12-21 14:07:41,529 [main] INFO SampleApp.MyApp - Exiting application. +---- + +As a side note, let me mention that in log4net child loggers link only to their existing ancestors. +In particular, the logger named Animals.Carnivora.Dog is linked directly to the root logger, thereby circumventing the unused Animals or Animals.Carnivora loggers. +This significantly increases performance and reduces log4net's memory footprint. + +The MyApp class configures log4net by invoking BasicConfigurator.Configure() method. +Other classes only need to import the log4net namespace, retrieve the loggers they wish to use, and log away. + +The previous example always outputs the same log information. +Fortunately, it is easy to modify MyApp so that the log output can be controlled at run-time. +Here is a slightly modified version. + +[source,csharp] +---- +using Animals.Carnivora; +// Import log4net classes. +using log4net; +using log4net.Config; + +namespace SampleApp; + +private static class MyApp +{ + private static readonly ILog logger = LogManager.GetLogger(typeof(MyApp)); + + private static void Main(string[] args) + { + // BasicConfigurator replaced with XmlConfigurator. + XmlConfigurator.Configure(); + + logger.Info("Entering application."); + Dog dog = new(); + bar.Bark(); + logger.Info("Exiting application."); + } +} +---- + +This version of MyApp instructs the XmlConfigurator to parse a configuration file and set up logging accordingly. + +Here is a sample configuration file that results in exactly same output as the previous BasicConfigurator based example. + +[source,xml] +---- + + + + + + + + + + + + + + +---- + +Suppose we are no longer interested in seeing the output of any component belonging to the Animals.Carnivora namespace. + +The following configuration file shows one possible way of achieving this. + +[source,xml] +---- + + + + + + + + + + + + + + + + + + +---- + +The output of MyApp configured with this file is shown below. + +[source,log] +---- +2024-12-21 14:07:41,508 [main] INFO SampleApp.MyApp - Entering application. +2024-12-21 14:07:41,529 [main] INFO SampleApp.MyApp - Exiting application. +---- + +As the logger Animals.Carnivora.Dog does not have an assigned level, it inherits its level from Animals.Carnivora, which was set to WARN in the configuration file. +The log statement from the Dog.Bark method has the level DEBUG, lower than the logger level WARN. +Consequently, Bark() method's log request is suppressed. + +Here is another configuration file that uses multiple appenders. + +[source,xml] +---- + + + + + + + + + + + + + + + + + + + + + + + +---- + +Calling the enhanced MyApp with the this configuration file will output the following on the console. + +[source,log] +---- +INFO [main] (MyApp.cs:17) - Entering application. +DEBUG [main] (Dog.cs:10) - Woof! +INFO [main] (MyApp.cs:20) - Exiting application. +---- + +In addition, as the root logger has been allocated a second appender, output will also be directed to the example.log file. +This file will be rolled over when it reaches 100KB. +When roll-over occurs, the old version of example.log is automatically moved to example.log.1. + +Note that to obtain these different logging behaviors we did not need to recompile code. +We could just as easily have logged to an email address or redirected all Animals.Carnivora output to an remote syslog server. + +For more examples of configuring appenders using the XmlConfigurator see the Example Appender Configuration #TODO document. \ No newline at end of file diff --git a/src/site/antora/modules/ROOT/pages/manual/filters.adoc b/src/site/antora/modules/ROOT/pages/manual/filters.adoc new file mode 100644 index 00000000..2ebd3b2a --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/manual/filters.adoc @@ -0,0 +1,1506 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + +[id=filters] += Filters + +Filters are Log4j plugins that evaluate the parameters of a logging call or a log event and return one of three results: + +ACCEPT:: The filter accepts the log event. +This effectively causes other filters in the same filtering stage to be skipped. + +DENY:: The filter drops the log event. + +NEUTRAL:: Log4j behaves as if the filter was not present. +It is evaluated by the next filter in the filter chain. + +//// + Filters can be used at each level of the + xref:manual/architecture.adoc#architecture-diagram[logging pipeline]: + + * the global configuration element can contain a xref:manual/configuration.adoc#global-filters[global filter]. + * each xref:manual/configuration.adoc#configuring-loggers[logger] configuration element can contain a xref:manual/configuration.adoc#logger-elements-filters[logger filter]. + * each xref:manual/configuration.adoc#configuring-appenderrefs[appender reference] configuration element can contain an xref:manual/configuration.adoc#appenderrefs-elements-filters[appender reference filter]. + * each xref:manual/appenders.adoc[appender] configuration element can contain an xref:manual/appenders.adoc[appender filter]. + + Additionally, the following configuration attributes take part in the filtering process: + + * the xref:manual/configuration.adoc#logger-attributes-level[`level` attribute] of logger configuration elements. + * the xref:manual/configuration.adoc#appenderref-attributes-level[`level` attribute] of appender reference configuration elements. + + [#filtering-process] + == Filtering process + + Due to the interaction of many elements, + the filtering process in Log4j is quite complex and can be divided in four stages: + + . <> + . <> + . <> + . <> + + [IMPORTANT] + ==== + For performance reasons, log events should be filtered at the earliest possible stage. + This reduces the cost of disabled log events: + e.g., log event creation, population of context data, formatting, transfer through an asynchronous barrier. + ==== + + [#logger-stage] + === 1. `Logger` stage + + [plantuml] + .... + @startuml + start + group Logger + + :A Logger method; + + switch (Apply global filter) + case (DENY) + #pink:Discard; + detach + case (ACCEPT) + case (NEUTRAL) + if (Is less severe than logger level?) then (yes) + #pink:Discard; + detach + else (no) + ' The label improves spacing + label a1 + endif + endswitch + end group + :Create LogEvent; + stop + .... + + The parameters of the logging call are passed to the global filter. + If the global filter returns: + + DENY:: The log message is immediately discarded. + NEUTRAL:: If the level of the log message is less severe than the configured logger threshold, the message is discarded. + Otherwise, a + link:../javadoc/log4j-core/org/apache/logging/log4j/core/LogEvent.html[`LogEvent`] is created and processing continues. + ACCEPT:: A `LogEvent` is created and processing continues in the next stage. + + [IMPORTANT] + ==== + This is the only stage, which differentiates between an `ACCEPT` and `NEUTRAL` filter result. + ==== + + [TIP] + ==== + Filtering logging calls at this stage provides the best performance: + + * this stage precedes the creation of log events, therefore operations like the + {log4j2-url}/manual/thread-context.html[injection of context data], + xref:manual/layouts.adoc#LocationInformation[computation of location information] + will not be performed for disabled log statements. + * this stage precedes the asynchronous calls performed by either + xref:manual/async.adoc[asynchronous loggers] + or + xref:manual/appenders/delegating.adoc#AsyncAppender[asynchronous appenders]. + ==== + + [#logger-config-stage] + === 2. `LoggerConfig` stage + + [plantuml] + .... + @startuml + start + :LogEvent; + + group LoggerConfig + repeat + + :LoggerConfig#log(); + + if (Apply logger filter) then (DENY) + #pink:Discard; + detach + else (not DENY) + ' The label improves spacing + label a1 + endif + repeat while (Go to parent logger?) is (yes) + -> no; + end group + stop + @enduml + .... + + In this stage, log events are evaluated by all the + xref:manual/configuration.adoc#logger-elements-filters[logger filters] + that stand on the path from the logger to an appender. + Due to the + xref:manual/configuration.adoc#logger-attributes-additivity[additivity of logger configurations], + this means that a log event must also pass the filters of all the parent loggers, + until it reaches the logger that references the chosen appender. + + [#appender-control-stage] + === 3. `AppenderControl` stage + + [plantuml] + .... + @startuml + start + :LogEvent; + + group AppenderControl + + :AppenderControl#callAppender(); + + if (Is less severe then appender reference level?) then (yes) + #pink:Discard; + detach + else (no) + ' The label improves spacing + label a2 + endif + if (Apply appender reference filter) then (DENY) + #pink:Discard; + detach + else (not DENY) + ' The label improves spacing + label a1 + endif + end group + stop + @enduml + .... + + To pass this stage, log events must satisfy both conditions: + + * the log event must be at least as severe as the + xref:manual/configuration.adoc#appenderref-attributes-level[`level` attribute] + of the appender reference. + * the xref:manual/configuration.adoc#appenderrefs-elements-filters[appender reference filter] must return `ACCEPT` or `NEUTRAL`, + + [#appender-stage] + === 4. `Appender` stage (optional) + + [plantuml] + .... + @startuml + start + :LogEvent; + + group Appender + + if (Apply appender filter) then (DENY) + #pink:Discard; + detach + else (not DENY) + ' The label improves spacing + label a1 + endif + end group + #palegreen:Appender#append(); + @enduml + .... + + If the appender implements + link:../javadoc/log4j-core/org/apache/logging/log4j/core/filter/Filterable.html[`Filterable`] + an additional filtering stage is available. + When log events reach such an appender, + the filter attached to an appender is evaluated and if the result is `DENY`, + the log event is discarded. + + All standard appenders implement `Filterable`. + + [NOTE] + ==== + Some appenders like the + xref:manual/appenders/delegating.adoc#AsyncAppender[asynchronous appender] + use appender references to transfer log events to other appenders. + In such a case, the filtering process goes back to the <>. + ==== + + [TIP] + ==== + Users migrating from Log4j 1 often replace the `threshold` property of a Log4j 1 appender with a <> on the equivalent Log4j 2 appender. + + Using the `level` property of appender references will give a better performance. + ==== + + [WARNING] + ==== + Configuring filters at this stage is a measure of last resort, + since it adds a large overhead to disabled log events. + You should rather configure the filtering in one of the previous stages. + ==== + + [#example-configuration-file] + === Example configuration file + + The following example configuration file employs filters at all possible stages to explain their evaluation order: + + [tabs] + ==== + XML:: + + + [source,xml] + ---- + include::example$manual/filters/filters.xml[lines=1;18..-1] + ---- + + JSON:: + + + [source,json] + ---- + include::example$manual/filters/filters.json[] + ---- + + YAML:: + + + [source,yaml] + ---- + include::example$manual/filters/filters.yaml[lines=17..-1] + ---- + + Properties:: + + + [source,properties] + ---- + include::example$manual/filters/filters.properties[lines=17..-1] + ---- + ==== + + <1> Global filter + <2> Logger `level` attribute. This setting is **ignored** unless the global filter returns `NEUTRAL`. + <3> Filter of the `org.example` logger + <4> Filter of the root logger (it is the parent of the `org.example` logger) + <5> Appender reference `level` attribute + <6> Filter of the appender reference + <7> Filter of the appender + + [#common-configuration] + == Common configuration + + [#common-configuration-attributes] + === Common configuration attributes + + The default behavior of filters is in line with the `filter()` methods of functional interfaces, such as + https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/util/Optional.html#filter(java.util.function.Predicate)[`Optional.filter()`] + or + https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/util/stream/Stream.html#filter(java.util.function.Predicate)[`Stream.filter()`]: + filters pass matching events to the next filter and drop those that do not match. + + To allow for a larger spectrum of behaviors, + all standard filters, except `CompositeFilter` and `DenyAllFilter`, accept the following configuration attributes: + + .Common filter configuration attributes + [cols="1m,1,1,4"] + |=== + |Attribute |Type | Default value |Description + + | [[onMatch]]onMatch + | link:../javadoc/log4j-core/org/apache/logging/log4j/core/Filter.Result.html[`Result`] + | link:../javadoc/log4j-core/org/apache/logging/log4j/core/Filter.Result.html#NEUTRAL[`NEUTRAL`] + | Result returned if the condition matches. + + | [[onMismatch]]onMismatch + | link:../javadoc/log4j-core/org/apache/logging/log4j/core/Filter.Result.html[`Result`] + | link:../javadoc/log4j-core/org/apache/logging/log4j/core/Filter.Result.html#DENY[`DENY`] + | Result returned if the condition does not match. + + |=== + + [#CompositeFilter] + === Composing filters + + Filters usually test for a single condition. + To express a more complex filtering logic, Log4j provides a + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-CompositeFilter[`Filters`] + plugin. + This plugin can contain a sequence of filters and has no other configuration option. + + The `Filters` plugin sequentially evaluates each sub-filter and: + + * if the sub-filter returns `ACCEPT` (resp. `DENY`), the `Filters` plugin returns `ACCEPT` (resp. `DENY`). + * if the sub-filter return `NEUTRAL`, the `Filters` plugin evaluates the next sub-filter in the chain. + * if the last sub-filter returns `NEUTRAL`, the `Filters` plugin returns `NEUTRAL`. + + The `Filters` plugin together with the ternary logic of filters, can be used to express most boolean operators. + In the following examples `A` and `B` are two filters. + + `NOT A`:: + You can invert the functionality of filter `A` by swapping the `onMatch` and `onMismatch`: + + + [source,xml] + ---- + + ---- + + `A AND B`:: + To select the events that match both `A` and `B` you can use: + + + [source,xml] + ---- + + + + + ---- + + `A OR B`:: + To select the events that match `A` or `B` we can replace `NEUTRAL` with `ACCEPT` in the `onMatch` attribute: + + + [source,xml] + ---- + + + + + ---- + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-CompositeFilter[📖 Plugin reference for `Filters`] + + [#collection] + == Collection + + Log4j Core provides the following filters out-of-the-box. + + [#timestamp-filters] + === Timestamp filters + + Timestamp filters use the timestamp of log events to decide whether to accept them or not. + + [#BurstFilter] + ==== `BurstFilter` + + The `BurstFilter` limits the rate of log events. + The rate limit is only applied to log events less severe than a configured log level. + + Besides the <>, + the `BurstFilter` supports the following parameters: + + .`BurstFilter` -- configuration attributes + [cols="1m,1,1,4"] + |=== + |Attribute | Type | Default value | Description + + | level + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html[`Level`] + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html#WARN[`WARN`] + | The rate limit only applies to log events less severe than this level. + Events at least as severe as this level will always match. + + | rate + | `float` + | `10` + | The average number of events per second to allow. + + | maxBurst + | `long` + | `10 × rate` + | The maximum number of events that can be logged at once, without incurring in rate limiting. + + |=== + + [NOTE] + ==== + The `BurstFilter` uses the _sliding window log_ algorithm with a window `window` of `maxBurst / rate` seconds. + + The filter maintains a list of recently logged events. + If in the interval of time of duration `window` preceding the current log event, + more than `maxBurst` events have already been logged, rate limiting is applied. + + To control the size of the log files only the `rate` attribute needs to be taken into account. + The `maxBurst` attribute controls the temporal spacing between log events: + lower values of `maxBurst` will give more evenly spaced log events, + while higher values will allow for peaks of activity followed by an absence of log events. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-BurstFilter[📖 Plugin reference for `BurstFilter`] + + [#TimeFilter] + ==== `TimeFilter` + + The `TimeFilter` only matches log events emitted during a certain time of the day. + + Besides the <>, + the `TimeFilter` supports the following parameters: + + .`TimeFilter` -- configuration attributes + [cols="1m,2,1,4"] + |=== + | Attribute | Type | Default value | Description + + | start + | https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/time/LocalTime.html[`LocalTime`] in `HH:mm:ss` format + | https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/time/LocalTime.html#MIN[`LocalTime.MIN`] + | The beginning of the time slot. + + | start + | https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/time/LocalTime.html[`LocalTime`] in `HH:mm:ss` format + | https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/time/LocalTime.html#MAX[`LocalTime.MAX`] + | The end of the time slot. + + | timezone + | https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/time/ZoneId.html[`ZoneId`] + | https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/time/ZoneId.html#systemDefault()[`ZoneId.systemDefault()`] + | The timezone to use when comparing `start` and `end` to the event timestamp. + + |=== + + As a simple application of this filter, + if you want to forward messages to your console during work hours and to your e-mail account after work hours, + you can use a configuration snippet like: + + [tabs] + ==== + XML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/TimeFilter.xml[`log4j2.xml`] + [source,xml,indent=0] + ---- + include::example$manual/filters/TimeFilter.xml[tag=filter] + ---- + + JSON:: + + + .Snippet from an example {antora-examples-url}/manual/filters/TimeFilter.json[`log4j2.json`] + [source,json,indent=0] + ---- + include::example$manual/filters/TimeFilter.json[tag=filter] + ---- + + YAML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/TimeFilter.yaml[`log4j2.yaml`] + [source,yaml,indent=0] + ---- + include::example$manual/filters/TimeFilter.yaml[tag=filter] + ---- + + Properties:: + + + .Snippet from an example {antora-examples-url}/manual/filters/TimeFilter.properties[`log4j2.properties`] + [source,properties,indent=0] + ---- + include::example$manual/filters/TimeFilter.properties[tag=filter] + ---- + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-TimeFilter[📖 Plugin reference for `TimeFilter`] + + [#level-filters] + === Level filters + + The following filters allow you to filter log events based on their xref:manual/customloglevels.adoc[levels]. + + [#LevelMatchFilter] + ==== `LevelMatchFilter` + + The `LevelMatchFilter` matches log events that have exactly a certain log level. + + Besides the <>, + the `LevelMatchFilter` supports the following parameter: + + .`LevelMatchFilter` -- configuration attributes + [cols="1m,1,1,4"] + |=== + | Attribute | Type | Default value | Description + + | level + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html[`Level`] + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html#ERROR[`ERROR`] + | The filter only matches log events of this level. + + |=== + + [TIP] + ==== + If you wish to use a different log file for each log level, you should also use a + xref:manual/appenders/delegating.adoc#RoutingAppender[`Routing` appender] together with the + xref:manual/lookups.adoc#EventLookup[`${event:Level}` lookup]. + Such a solution will ensure that: + + * you don't forget any log level (Log4j supports xref:manual/customloglevels.adoc[custom levels]). + * you don't need to configure an appender for each level separately. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-LevelMatchFilter[📖 Plugin reference for `LevelMatchFilter`] + + [#LevelRangeFilter] + ==== `LevelRangeFilter` + + The `LevelRangeFilter` matches log events with a log level within a configured range. + + Besides the <>, + the `LevelRangeFilter` supports the following parameter: + + .`LevelRangeFilter` -- configuration attributes + [cols="1m,1,1,4"] + |=== + | Attribute | Type | Default value | Description + + | minLevel + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html[`Level`] + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html#OFF[`OFF`] + | The filter only matches log events at most as severe as this level. + + | maxLevel + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html[`Level`] + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html#ALL[`ALL`] + | The filter only matches log events at least as severe as this level. + + |=== + + [TIP] + ==== + Make sure not to invert the bounds of the range. + Starting from the smallest level, + {log4j2-url}/manual/customloglevels.html[the Log4j API defines]: `OFF`, + `FATAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE` and `ALL`. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-LevelRangeFilter[📖 Plugin reference for `LevelRangeFilter`] + + [#ThresholdFilter] + ==== `ThresholdFilter` + + The `ThresholdFilter` matches log events at least as severe as a configured level. + + Besides the <>, + the `ThresholdFilter` supports the following parameter: + + .`ThresholdFilter`—configuration attributes + [cols="1m,1,1,4"] + |=== + | Attribute | Type | Default value | Description + + | level + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html[`Level`] + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html#OFF[`OFF`] + | The filter only matches log events at least as severe as this level. + + |=== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-ThresholdFilter[📖 Plugin reference for `ThresholdFilter`] + + [#DynamicThresholdFilter] + ==== `DynamicThresholdFilter` + + The `DynamicThresholdFilter` is a variant of <>, + which uses a different threshold for each log event. + The effective threshold to use is determined by querying the + {log4j2-url}/manual/thread-context.html[context data] + of the log event. + For each log event: + + . The filter retrieves the value of `key` in the context data map. + . The filter checks the list of nested + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-util-KeyValuePair[`KeyValuePair`] + configuration elements to decide which level to apply. + + Besides the <>, + the `DynamicThresholdFilter` supports the following parameters: + + .`DynamicThresholdFilter`—configuration attributes + [cols="1m,1,1,4"] + |=== + | Attribute | Type | Default value | Description + + | key + | `String` + | + | The key to a value in the context map of the log event. + + **Required** + + | defaultThreshold + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html[`Level`] + | link:../javadoc/log4j-api/org/apache/logging/log4j/Level.html#ERROR[`ERROR`] + | Threshold to apply to log events that don't have a corresponding `KeyValuePair`. + + |=== + + .`DynamicThresholdFilter`—nested elements + [cols="1m,1,4"] + |=== + | Type | Multiplicity | Description + + | xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-util-KeyValuePair[`KeyValuePair`] + | One or more + | Associates a log level with the context map value associated with `key`. + + |=== + + For example, if `loginId` contains the login of the current user, + you can use this configuration to apply different thresholds to different users: + + [tabs] + ==== + XML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/DynamicThresholdFilter.xml[`log4j2.xml`] + [source,xml,indent=0] + ---- + include::example$manual/filters/DynamicThresholdFilter.xml[tag=filter] + ---- + + JSON:: + + + .Snippet from an example {antora-examples-url}/manual/filters/DynamicThresholdFilter.json[`log4j2.json`] + [source,json,indent=0] + ---- + include::example$manual/filters/DynamicThresholdFilter.json[tag=filter] + ---- + + YAML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/DynamicThresholdFilter.yaml[`log4j2.yaml`] + [source,yaml,indent=0] + ---- + include::example$manual/filters/DynamicThresholdFilter.yaml[tag=filter] + ---- + + Properties:: + + + .Snippet from an example {antora-examples-url}/manual/filters/DynamicThresholdFilter.properties[`log4j2.properties`] + [source,properties,indent=0] + ---- + include::example$manual/filters/DynamicThresholdFilter.properties[tag=filter] + ---- + ==== + + <1> If the `loginId` is `alice` a threshold level of `DEBUG` will be used. + <2> If the `loginId` is `bob` a threshold level of `INFO` will be used. + <3> For all the other values of `loginId` a threshold level of `ERROR` will be used. + + [TIP] + ==== + You can use Log4j Core's + xref:manual/configuration.adoc#configuration-attribute-monitorInterval[automatic reconfiguration feature] + to modify the ``KeyValuePair``s without restarting your application. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-DynamicThresholdFilter[📖 Plugin reference for `DynamicThresholdFilter`] + + [#marker-filters] + === Marker filters + + The following filters use the + {log4j2-url}/manual/markers.html[log event marker] + to filter log events. + + [#NoMarkerFilter] + ==== `NoMarkerFilter` + + The `NoMarkerFilter` matches log events that do not have any markers. + + This filter does not have any additional configuration attribute, + except the <>. + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-NoMarkerFilter[📖 Plugin reference for `NoMarkerFilter`] + + [#MarkerFilter] + ==== `MarkerFilter` + + The `MarkerFilter` matches log events marked with a specific marker or **any** of its descendants. + + Besides the <>, + the `MarkerFilter` supports the following parameter: + + .`MarkerFilter`—configuration attributes + [cols="1m,1,1,4"] + |=== + |Attribute | Type | Default value | Description + + | marker + | link:../javadoc/log4j-api/org/apache/logging/log4j/Marker.html[`Marker`] + | + | The filter only matches log events of marker with the given marker or one of its descendants. + + **Required** + + |=== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-MarkerFilter[📖 Plugin reference for `MarkerFilter`] + + [#message-filters] + === Message filters + + Message filters allow filtering log events based on the + {log4j2-url}/manual/messages.html[`Message`] + contained in the log event. + + include::partial$manual/log-event.adoc[] + + [#RegexFilter] + ==== `RegexFilter` + + The `RegexFilter` matches a regular expression against messages. + Besides the <>, the `RegexFilter` supports the following parameters: + + .`RegexFilter` configuration attributes + [%header,cols="1m,1,1,4"] + |=== + |Attribute + | Type + | Default value + | Description + + | regex + | https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/util/regex/Pattern.html[`Pattern`] + | + | The regular expression used to match log messages. + + **Required** + + | useRawMsg + | `boolean` + | `false` + | If `true`, for + {log4j2-url}/manual/messages.html#ParameterizedMessage[`ParameterizedMessage`], + {log4j2-url}/manual/messages.html#StringFormattedMessage[`StringFormattedMessage`], + and + {log4j2-url}/messages.html#MessageFormatMessage[`MessageFormatMessage`], + the message format pattern; for + {log4j2-url}/manual/messages.html#StructuredDataMessage[`StructuredDataMessage`], + the message field will be used as the match target. + |=== + + [WARNING] + ==== + * This filter only matches if the **whole** log message matches the regular expression. + + * Setting `useRawMsg` to `false` decreases performance, since it forces the formatting of all log messages, including the disabled ones. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-RegexFilter[📖 Plugin reference for `RegexFilter`] + + [#StringMatchFilter] + ==== `StringMatchFilter` + + The `StringMatchFilter` matches a log event, if its message contains the given string. + + Besides the <>, + the `StringMatchFilter` supports the following parameters: + + .`StringMatchFilter`—configuration attributes + [cols="1m,1,1,4"] + |=== + | Attribute | Type | Default value | Description + + | text + | `String` + | + | The text to look for. + + **Required** + + |=== + + [WARNING] + ==== + This filter decreases performance, since it forces the formatting of all log messages, including the disabled ones. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-StringMatchFilter[📖 Plugin reference for `StringMatchFilter`] + + [#map-filters] + === Map filters + + The following filters match log events based on the content of one of these map structures: + + * The map contained in a + {log4j2-url}/manual/messages.html#MapMessage[`MapMessage`] object. + See + link:../javadoc/log4j-api/org/apache/logging/log4j/message/MapMessage.html#getData()[`MapMessage.getData()`] + for details. + * The context data map contained in a + link:../javadoc/log4j-core/org/apache/logging/log4j/core/LogEvent.html[`LogEvent`]. + See + link:../javadoc/log4j-core/org/apache/logging/log4j/core/LogEvent.html#getContextData()[`LogEvent.getContextData()`] + for details. + + [#configuration-map] + ==== Configuration map + + These filters are configured with a configuration map of type `Map`, + which, + depending on the filter, + is encoded as either JSON: + + [source,json] + ---- + include::example$manual/filters/configs.json[] + ---- + + or as a sequence of + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-util-KeyValuePair[`KeyValuePair`] + plugins: + + [source,xml,indent=0] + ---- + include::example$manual/filters/ContextMapFilter.xml[tag=kvp] + ---- + + The configuration map associates to each key a list of allowed values for that key. + In the example above the allowed values for the `loginId` key are either `alice` or `bob`. + The only allowed value for the `clientId` key is `1234`. + + The map filters can work in two matching modes: + + [[matching-mode-and]] + AND:: + A map structure matches + if the value associated with **each** key + that appears in the configuration map is one of the allowed values. + + [[matching-mode-or]] + OR:: + A map structure matches + if the value associated with **at least one** key + that appears in the configuration map is one of the allowed values. + + [#MapFilter] + ==== `MapFilter` + + The `MapFilter` allows filtering based on the contents of all + {log4j2-url}/manual/messages.html#collection-structured[structured ``Message``s]. + + This filter encodes the <> introduced above as a list of + `KeyValuePair` elements. + + Besides the <>, + the `MapFilter` supports the following parameters: + + .`MapFilter` -- configuration attributes + [cols="1m,1,1,4"] + |=== + | Attribute | Type | Default value | Description + + | operator + | _enumeration_ + | `AND` + a| Determines the matching mode of the filter. + Can be: + + * <> + * <> + + |=== + + .`MapFilter` -- nested elements + [cols="1m,1,4"] + |=== + | Type | Multiplicity | Description + + | xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-util-KeyValuePair[`KeyValuePair`] + | One or more + | Adds a value as allowed value for a key. + See <> for more details. + + |=== + + For example, + if you want to filter all ``MapMessage``s + that have an `eventType` key with value `authentication` **and** an `eventId` key with value either `login` **or** `logout`, + you can use the following configuration: + + [tabs] + ==== + XML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/MapFilter.xml[`log4j2.xml`] + [source,xml,indent=0] + ---- + include::example$manual/filters/MapFilter.xml[tag=filter] + ---- + + JSON:: + + + .Snippet from an example {antora-examples-url}/manual/filters/MapFilter.json[`log4j2.json`] + [source,json,indent=0] + ---- + include::example$manual/filters/MapFilter.json[tag=filter] + ---- + + YAML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/MapFilter.yaml[`log4j2.yaml`] + [source,yaml,indent=0] + ---- + include::example$manual/filters/MapFilter.yaml[tag=filter] + ---- + + Properties:: + + + .Snippet from an example {antora-examples-url}/manual/filters/MapFilter.yaml[`log4j2.properties`] + [source,properties,indent=0] + ---- + include::example$manual/filters/MapFilter.properties[tag=filter] + ---- + ==== + + [TIP] + ==== + You can use Log4j Core's + xref:manual/configuration.adoc#configuration-attribute-monitorInterval[automatic reconfiguration feature] + to modify the ``KeyValuePair``s without restarting your application. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-MapFilter[📖 Plugin reference for `MapFilter`] + + [#StructuredDataFilter] + ==== `StructuredDataFilter` + + The `StructuredDataFilter` is a variant of <> that only matches + {log4j2-url}/manual/messages.html#StructuredDataMessage[`StructureDataMessage`]s. + + In addition to matching the map structure contained in a `StructuredDataMessage` + (which corresponds to https://datatracker.ietf.org/doc/html/rfc5424#section-6.3.3[RFC 5424 `SD-PARAM` elements]) + it provides the following virtual keys: + + .`StructuredDataFilter` -- virtual keys + [cols="1m,1,4"] + |=== + | Key | RFC5424 field | Description + + | id + | https://datatracker.ietf.org/doc/html/rfc5424#section-6.3.2[`SD-ID`] + | The + link:../javadoc/log4j-api/org/apache/logging/log4j/message/StructuredDataMessage.html#getId()[`id` field] + of the `StructuredDataMessage`. + + | id.name + | + | The + link:../javadoc/log4j-api/org/apache/logging/log4j/message/StructuredDataId.html#getName()[`name` field] + of the `StructuredDataId` element. + + | type + | https://datatracker.ietf.org/doc/html/rfc5424#section-6.2.7[`MSGID`] + | The + link:../javadoc/log4j-api/org/apache/logging/log4j/message/StructuredDataMessage.html#getType()[`type` field] + of a `StructuredDataMessage`. + + | message + | https://datatracker.ietf.org/doc/html/rfc5424#section-6.4[`MSG`] + | The result of a + link:../javadoc/log4j-api/org/apache/logging/log4j/message/Message.html#getFormat()[`Message.getFormat()`] method call. + + |=== + + The `StructuredDataFilter` encodes the <> introduced above as a list of + `KeyValuePair` and supports the following parameters, + besides the <>: + + .`StructuredDataFilter`—configuration attributes + [cols="1m,1,1,4"] + |=== + | Attribute | Type | Default value | Description + + | operator + | _enumeration_ + | `AND` + a| Determines the matching mode of the filter. + Can be: + + * <> + * <> + + |=== + + .`StructuredDataFilter` -- nested elements + [cols="1m,1,4"] + |=== + | Type | Multiplicity | Description + + | xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-util-KeyValuePair[`KeyValuePair`] + | One or more + | Adds a value as allowed value for a key. + See <> for more details. + + |=== + + If you want + to match all log messages with an `SD-ID` equal to `authentication` and the value of the `userId` `SD-PARAM` equal to either `alice` or `bob`, + you can use the following configuration: + + [tabs] + ==== + XML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/StructuredDataFilter.xml[`log4j2.xml`] + [source,xml,indent=0] + ---- + include::example$manual/filters/StructuredDataFilter.xml[tag=filter] + ---- + + JSON:: + + + .Snippet from an example {antora-examples-url}/manual/filters/StructuredDataFilter.json[`log4j2.json`] + [source,json,indent=0] + ---- + include::example$manual/filters/StructuredDataFilter.json[tag=filter] + ---- + + YAML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/StructuredDataFilter.yaml[`log4j2.yaml`] + [source,yaml,indent=0] + ---- + include::example$manual/filters/StructuredDataFilter.yaml[tag=filter] + ---- + + Properties:: + + + .Snippet from an example {antora-examples-url}/manual/filters/StructuredDataFilter.yaml[`log4j2.properties`] + [source,properties,indent=0] + ---- + include::example$manual/filters/StructuredDataFilter.properties[tag=filter] + ---- + ==== + + [TIP] + ==== + You can use Log4j Core's + xref:manual/configuration.adoc#configuration-attribute-monitorInterval[automatic reconfiguration feature] + to modify the ``KeyValuePair``s without restarting your application. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-StructuredDataFilter[📖 Plugin reference for `StructuredDataFilter`] + + [#ThreadContextMapFilter] + ==== `ContextMapFilter` + + The `ContextMapFilter` works in the same way as the <> above, + except it checks the + {log4j2-url}/manual/thread-context.html[context map data] + of the log event instead of the log message. + + This filter also encodes the <> introduced above as a list of + `KeyValuePair` elements. + + Besides the <>, + the `ContextMapFilter` supports the following parameters: + + .`ContextMapFilter` -- configuration attributes + [cols="1m,1,1,4"] + |=== + | Attribute | Type | Default value | Description + + | operator + | _enumeration_ + | `AND` + a| Determines the matching mode of the filter. + Can be: + + * <> + * <> + + |=== + + .`ContextMapFilter` -- nested elements + [cols="1m,1,4"] + |=== + | Type | Multiplicity | Description + + | xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-util-KeyValuePair[`KeyValuePair`] + | One or more + | Adds a value as allowed value for a key. + See <> for more details. + + |=== + + For example, + if the `clientId` and `userId` keys in the context data map identify your client and his end users, + you can filter the log events generated by users `alice` and `bob` of client `1234` using this configuration: + + [tabs] + ==== + XML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ContextMapFilter.xml[`log4j2.xml`] + [source,xml,indent=0] + ---- + include::example$manual/filters/ContextMapFilter.xml[tag=filter] + ---- + + JSON:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ContextMapFilter.json[`log4j2.json`] + [source,json,indent=0] + ---- + include::example$manual/filters/ContextMapFilter.json[tag=filter] + ---- + + YAML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ContextMapFilter.yaml[`log4j2.yaml`] + [source,yaml,indent=0] + ---- + include::example$manual/filters/ContextMapFilter.yaml[tag=filter] + ---- + + Properties:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ContextMapFilter.yaml[`log4j2.properties`] + [source,properties,indent=0] + ---- + include::example$manual/filters/ContextMapFilter.properties[tag=filter] + ---- + ==== + + [TIP] + ==== + You can use Log4j Core's + xref:manual/configuration.adoc#configuration-attribute-monitorInterval[automatic reconfiguration feature] + to modify the ``KeyValuePair``s without restarting your application. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-ThreadContextMapFilter[📖 Plugin reference for `ContextMapFilter`] + + [#MutableThreadContextMapFilter] + ==== `MutableContextMapFilter` + + The `MutableContextMapFilter` is an alternative version of <> that also uses the + {log4j2-url}/manual/thread-context.html[context data map] + to filter messages, but externalizes the <>, so it can be kept in a separate location. + + This filter encodes the <> as JSON. + The configuration map must be stored in an **external** location and will be regularly polled for changes. + + Besides the <>, + the `MutableContextMapFilter` supports the following parameters: + + .`MutableContextMapFilter` -- configuration attributes + [cols="1m,1,1,4"] + |=== + | Attribute | Type | Default value | Description + + | configLocation + | https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/nio/file/Path.html[`Path`] + or + https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/net/URI.html[`URI`] + | + | The location of the JSON <>. + + **Required** + + | pollInterval + | `long` + | `0` + | + Determines the polling interval used by Log4j to check for changes to the configuration map. + + If set to `0`, polling is disabled. + + |=== + + [WARNING] + ==== + Unlike other map filters that have a configurable matching mode, + this filter always uses the <> matching mode. + ==== + + To use this filter, you need to: + + . Create a JSON configuration map and place it at a known location (e.g. `++https://server.example/configs.json++`): + + + [source,json] + ---- + include::example$manual/filters/configs2.json[] + ---- + + + <1> The filter will match all events for client `1234` regardless of the `userId`. + <2> The filter will match all events for the `root` account regardless of the `clientId`. + + . Reference the configuration map location in your configuration file: + + + [tabs] + ==== + XML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/MutableContextMapFilter.xml[`log4j2.xml`] + [source,xml,indent=0] + ---- + include::example$manual/filters/MutableContextMapFilter.xml[tag=filter] + ---- + + JSON:: + + + .Snippet from an example {antora-examples-url}/manual/filters/MutableContextMapFilter.json[`log4j2.json`] + [source,json,indent=0] + ---- + include::example$manual/filters/MutableContextMapFilter.json[tag=filter] + ---- + + YAML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/MutableContextMapFilter.yaml[`log4j2.yaml`] + [source,yaml,indent=0] + ---- + include::example$manual/filters/MutableContextMapFilter.yaml[tag=filter] + ---- + + Properties:: + + + .Snippet from an example {antora-examples-url}/manual/filters/MutableContextMapFilter.yaml[`log4j2.properties`] + [source,properties,indent=0] + ---- + include::example$manual/filters/MutableContextMapFilter.properties[tag=filter] + ---- + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-MutableThreadContextMapFilter[📖 Plugin reference for `MutableContextMapFilter`] + + [#other-filters] + === Other filters + + [#deny-filter] + ==== `DenyFilter` + + The `DenyFilter` always returns `DENY`. + It does not support **any** configuration attribute, even the common configuration attributes. + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-DenyAllFilter[📖 Plugin reference for `DenyAllFilter`] + + [#ScriptFilter] + ==== `ScriptFilter` + + The `ScriptFilter` executes a script that must return `true` if the event matches and `false` otherwise. + + Besides the <>, + it accepts a single nested element: + + .`ScriptFilter` -- nested elements + [cols="3,1,4"] + |=== + | Type | Multiplicity | Description + + | + xref:manual/scripts.adoc#Script[`Script`], + xref:manual/scripts.adoc#ScriptFile[`ScriptFile`] + or + xref:manual/scripts.adoc#ScriptRef[`ScriptRef`] + | one + | A reference to the script to execute. + + See xref:manual/scripts.adoc[Scripts] for more details about scripting. + |=== + + .Additional runtime dependencies are required to use `ScripFilter` + [%collapsible] + ===== + include::partial$components/log4j-script.adoc[] + ===== + + The bindings available to the script depend + on whether the `ScriptFilter` is used as a global filter in the <> or in the remaining stages. + For global filters, the following bindings are available: + + .Script Bindings -- global filter + [cols="1m,1,4"] + |=== + | Binding name | Type | Description + + | logger + | link:../javadoc/log4j-core/org/apache/logging/log4j/core/Logger.html[`Logger`] + | The logger used in the log statement. + + | level + | {log4j2-url}/manual/customloglevels.html[`Level`] + | The level used in the log statement. + + | marker + | {log4j2-url}/manual/markers.html[`Marker`] + | The marker used in the log statement. + + | message + | {log4j2-url}/manual/messages.html[`Message`] + a| The message used in the log event if the user directly supplied one. + Otherwise: + + * If the logging statement contained an `Object` argument, it is wrapped in a + {log4j2-url}/manual/messages.html#ObjectMessage[`ObjectMessage`]. + * If the logging statement contained a format `String`, it is wrapped in a + {log4j2-url}/manual/messages.html#SimpleMessage[`SimpleMessage`]. + + | parameters + | `Object[]` + | The parameters passed to the logging call. + Some logging calls include the parameters as part of `message`. + + | throwable + | `Throwable` + | The `Throwable` passed to the logging call, if any. + Some logging calls include the `Throwable` as part of `message`. + + | substitutor + | link:../javadoc/log4j-core/org/apache/logging/log4j/core/lookup/StrSubstitutor.html[`StrSubstitutor`] + | The `StrSubstitutor` used to replace lookup variables. + + |=== + + For the remaining filters, only these bindings are available: + + .Script Bindings -- internal filter + [cols="1m,1,4"] + |=== + | Binding name | Type | Description + + | logEvent + | link:../javadoc/log4j-core/org/apache/logging/log4j/core/LogEvent.html[`LogEvent`] + | The log event being processed. + + | substitutor + | link:../javadoc/log4j-core/org/apache/logging/log4j/core/lookup/StrSubstitutor.html[`StrSubstitutor`] + | The `StrSubstitutor` used to replace lookup variables. + + + |=== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-filter-ScriptFilter[📖 Plugin reference for `ScriptFilter`] + + As an example, if you wish to match only log events that contain a certain exception, + you can use a simple Groovy script: + + .`scripts/local.groovy` + [source,groovy] + ---- + include::example$manual/filters/local.groovy[lines=17..-1] + ---- + + You can then integrate the script in a Log4j configuration: + + [tabs] + ==== + XML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ScriptFilter.xml[`log4j2.xml`] + [source,xml,indent=0] + ---- + include::example$manual/filters/ScriptFilter.xml[tag=local] + ---- + + JSON:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ScriptFilter.json[`log4j2.json`] + [source,json,indent=0] + ---- + include::example$manual/filters/ScriptFilter.json[tag=local] + ---- + + YAML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ScriptFilter.yaml[`log4j2.yaml`] + [source,yaml,indent=0] + ---- + include::example$manual/filters/ScriptFilter.yaml[tag=local] + ---- + + Properties:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ScriptFilter.yaml[`log4j2.properties`] + [source,properties,indent=0] + ---- + include::example$manual/filters/ScriptFilter.properties[tag=local] + ---- + ==== + + Writing an equivalent **global** script is a little bit more complex, + since you need to take into account all the places where a throwable can be passed as a parameter. + The script becomes: + + .`scripts/global.groovy` + [source,groovy] + ---- + include::example$manual/filters/global.groovy[lines=17..-1] + ---- + + You can use it as a global filter: + + [tabs] + ==== + XML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ScriptFilter.xml[`log4j2.xml`] + [source,xml,indent=0] + ---- + include::example$manual/filters/ScriptFilter.xml[tag=global] + ---- + + JSON:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ScriptFilter.json[`log4j2.json`] + [source,json,indent=0] + ---- + include::example$manual/filters/ScriptFilter.json[tag=global] + ---- + + YAML:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ScriptFilter.yaml[`log4j2.yaml`] + [source,yaml,indent=0] + ---- + include::example$manual/filters/ScriptFilter.yaml[tag=global] + ---- + + Properties:: + + + .Snippet from an example {antora-examples-url}/manual/filters/ScriptFilter.yaml[`log4j2.properties`] + [source,properties,indent=0] + ---- + include::example$manual/filters/ScriptFilter.properties[tag=global] + ---- + ==== + + [#extending] + == Extending + + Filters are xref:manual/plugins.adoc[plugins] implementing link:../javadoc/log4j-core/org/apache/logging/log4j/core/Filter.html[the `Filter` interface]. + This section will guide you on how to create custom ones. + + [NOTE] + ==== + While <> should address most common use cases, you might find yourself needing to implement a custom one. + If this is the case, we really appreciate it if you can *share your use case in a {logging-services-url}/support.html[user support channel]*. + ==== + + [#extending-plugins] + === Plugin preliminaries + + include::partial$manual/plugin-preliminaries.adoc[] + + [#extending-filters] + === Extending filters + + Filters are xref:manual/plugins.adoc[plugins] + implementing link:../javadoc/log4j-core/org/apache/logging/log4j/core/Filter.html[the `Filter` + interface]. + We recommend users + to extend from link:../javadoc/log4j-core/org/apache/logging/log4j/core/filter/AbstractFilter.html[`AbstractFilter`], + which provides implementation convenience. + While annotating your filter with `@Plugin`, you need to make sure that + + * It has a unique `name` attribute across all available `Filter` plugins + * The `category` attribute is set to link:../javadoc/log4j-core/org/apache/logging/log4j/core/config/Node.html#CATEGORY[`Node.CATEGORY`] + + You can check out the following files for examples: + + * {project-github-url}/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java[`MarkerFilter.java`] – <> matching on markers associated with the effective `LogEvent` in the context + * {project-github-url}/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/RegexFilter.java[`RegexFilter.java`] – <> matching on the message associated with the effective `LogEvent` in the context +//// \ No newline at end of file diff --git a/src/site/antora/modules/ROOT/pages/manual/layouts.adoc b/src/site/antora/modules/ROOT/pages/manual/layouts.adoc new file mode 100644 index 00000000..d0d659f9 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/manual/layouts.adoc @@ -0,0 +1,563 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + += Layouts + +An xref:manual/appenders.adoc[appender] uses a *layout* to encode a link:../javadoc/log4j-core/org/apache/logging/log4j/core/LogEvent.html[`LogEvent`] into a form that meets the needs of whatever will be consuming the log event. +This page will try to answer following questions: + +* <> +* <> +* <> + +[#concerns] +== Common concerns + +This section introduces you to some common concerns shared by almost all <> that you need to be aware of while using them. + +//// + [#structured-logging] + === Structured logging + + include::partial$manual/structured-logging.adoc[] + + Log4j strives to provide top of the class support for structured logging. + To create an end-to-end experience, it provides several {log4j2-url}/manual/messages.html#collection-structured[structured message types] along with layouts supporting structured logging. + + We recommend xref:manual/json-template-layout.adoc[] for structured logging purposes. + + [#charset] + === Character encoding + + All <> produce `String` that eventually get converted into a `byte` using the + https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/nio/charset/Charset.html[`Charset`] + configured. + While doing so, unless an explicit encoding configuration is stated, they use `UTF-8` by default. + If you want all your log events to be formatted in a certain character encoding that is different from what the employed layout defaults to, make sure to configure the layout's character encoding as needed. + + [#LocationInformation] + === Location information + + include::partial$manual/layouts-location-information.adoc[] + + [#collection] + == Collection + + Log4j bundles predefined layouts to assist in several common deployment use cases. + Let's start with shortcuts to most used ones: + + * Are you looking for a production-grade *JSON layout ready to be deployed to a log ingestion system* such as Elasticsearch or Google Cloud? + Refer to xref:manual/json-template-layout.adoc[]. + + * Are you looking for a layout that encodes log events in a *human-readable format suitable for tests and local development*? + Refer to xref:manual/pattern-layout.adoc[]. + + Following sections explain all predefined layouts in detail. + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-Layout[📖 Plugin reference for all `Layout` implementations] + + [#csv-layouts] + === [[CSVLayouts]] CSV Layouts + + There are two layouts performing https://en.wikipedia.org/wiki/Comma-separated_values[Comma Separated Value (CSV)] encoding: + + [#csv-layout-parameter] + ==== CSV Parameter Layout + + `CsvParameterLayout` encodes *only* the parameters of the message of a log event. + Generated CSV records will be composed of fields denoting the message parameters. + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-CsvParameterLayout[📖 Plugin reference for `CsvParameterLayout`] + + .Click here for examples + [%collapsible] + ==== + Given the following statement + + [source,java] + ---- + LOGGER.info("Record1 {} {}", "arg1", "arg2"); + LOGGER.error("Record2 {} {} {}", "arg3", "arg4", "arg5", throwable); + ---- + + `CsvParameterLayout` will output + + [source,text] + ---- + arg1,arg2 + arg3,arg4,arg5 + ---- + + The same can be achieved using link:../javadoc/log4j-api/org/apache/logging/log4j/message/ObjectArrayMessage.html[`ObjectArrayMessage`] as follows: + + [source,java] + ---- + LOGGER.info(new ObjectArrayMessage("arg1", "arg2")); + LOGGER.info(new ObjectArrayMessage("arg3", "arg4", "arg5")); + ---- + ==== + + [#csv-layout-log-event] + ==== CSV Log Event Layout + + `CsvLogEventLayout` encodes the complete log event, including the formatted message. + Generated CSV records will be composed of following fields in the given order: + + . Time (in nanoseconds) + . Time (in milliseconds) + . Level + . Thread ID + . Thread name + . Thread priority + . Message (formatted, hence including parameters) + . Logger FQCN + . Logger name + . Marker + . Throwable + . Source + . Thread context map + . Thread context stack + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-CsvLogEventLayout[📖 Plugin reference for `CsvLogEventLayout`] + + .Click here for examples + [%collapsible] + ==== + Given the following statement + + [source,java] + ---- + LOGGER.debug("one={}, two={}, three={}", 1, 2, 3); + ---- + + `CsvLogEventLayout` will output + + [source,text] + ---- + 0,1441617184044,DEBUG,main,"one=1, two=2, three=3",org.apache.logging.log4j.spi.AbstractLogger,,,,org.apache.logging.log4j.core.layout.CsvLogEventLayoutTest.testLayout(CsvLogEventLayoutTest.java:98),{},[] + ---- + ==== + + [#csv-layout-config] + ==== Configuration + + Both `CsvParameterLayout` and `CsvLogEventLayout` are configured with the following parameters: + + [%header,cols="1m,1m,4"] + |=== + |Parameter + |Type + |Description + + |format + |String + |A predefined format name (`Default`, `Excel`, `MySQL`, `RFC4180`, `TDF`, etc.) accepted by https://commons.apache.org/proper/commons-csv/apidocs/org/apache/commons/csv/CSVFormat.html[`CSVFormat`] + + |delimiter + |Character + |The field delimiter character + + |escape + |Character + |The escape character + + |quote + |Character + |The quote character + + |quoteMode + |String + |A quote mode name (`ALL`, `ALL_NONE_NULL`, `MINIMAL`, `NON_NUMERIC`, `NONE`, etc.) accepted by https://commons.apache.org/proper/commons-csv/apidocs/org/apache/commons/csv/QuoteMode.html[`QuoteMode`] + + |nullString + |String + |The string to denote `null` values + + |recordSeparator + |String + |The record separator string + + |charset + |Charset + |The character encoding + + |header + |String + |The header to include when the stream is opened + + |footer + |String + |The footer to include when the stream is closed + |=== + + Additional runtime dependencies are required for using CSV layouts: + + include::partial$features/layout-csv.adoc[] + + [#HTMLLayout] + === HTML Layout + + `HtmlLayout` generates an HTML page, and adds each log event to a row in a table. + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-HtmlLayout[📖 Plugin reference for `HtmlLayout`] + + It is configured with the following parameters: + + [%header,cols="1m,1m,4"] + |=== + |Parameter + |Type + |Description + + |charset + |String + |The character encoding + + |contentType + |String + |The `Content-Type` header value (defaults to `text/html`) + + |datePattern + |String + |The date format of the log event. + The default is `JVM_ELAPSE_TIME`, which outputs the milliseconds since JVM started. + For other valid values, refer to xref:manual/pattern-layout.adoc#converter-date[the `date` conversion specifier of Pattern Layout]. + + |fontName + |String + |The `font-family` (defaults to `arial,sans-serif`) + + |fontSize + |String + |The `font size` (defaults to `small`) + + |locationInfo + |boolean + |If `true`, the <> be included (defaults to `false`) + + |timezone + |String + |The time zone ID of the log event. + If not specified, this layout uses the + https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/util/TimeZone.html#getDefault()[`TimeZone.getDefault()`] + as the default. + You can use time zone IDs supported by + https://docs.oracle.com/en/java/javase/{java-target-version}/docs/api/java.base/java/util/TimeZone.html#getTimeZone(java.lang.String)[`TimeZone.getTimeZone(String)`]. + + |title + |String + |The HTML page title + |=== + + [#JSONTemplateLayout] + === JSON Template Layout + + `JsonTemplateLayout` is a customizable, efficient, and garbage-free JSON generating layout. + It encodes ``LogEvent``s according to the structure described by the JSON template provided. + + For instance, given the following event template stored in `MyLayout.json` in your classpath: + + [source,json] + ---- + { + "instant": { // <1> + "$resolver": "timestamp", + "pattern": { + "format": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "timeZone": "UTC" + } + }, + "someConstant": 1, // <2> + "message": { // <3> + "$resolver": "message", + "stringified": true + } + } + ---- + <1> Using the `timestamp` event template resolver to populate the `instant` field + <2> Passing a constant that will be rendered as is + <3> Using the `message` event template resolver to populate the `message` field + + in combination with the below layout configuration: + + [tabs] + ==== + XML:: + + + .Snippet from an example {antora-examples-url}/manual/json-template-layout/usage/log4j2.xml[`log4j2.xml`] + [source,xml] + ---- + include::example$manual/json-template-layout/usage/log4j2.xml[lines=26..26,indent=0] + ---- + + JSON:: + + + .Snippet from an example {antora-examples-url}/manual/json-template-layout/usage/log4j2.json[`log4j2.json`] + [source,json] + ---- + include::example$manual/json-template-layout/usage/log4j2.json[lines=6..8,indent=0] + ---- + + YAML:: + + + .Snippet from an example {antora-examples-url}/manual/json-template-layout/usage/log4j2.yaml[`log4j2.yaml`] + [source,xml] + ---- + include::example$manual/json-template-layout/usage/log4j2.yaml[lines=22..23,indent=0] + ---- + + Properties:: + + + .Snippet from an example {antora-examples-url}/manual/json-template-layout/usage/log4j2.properties[`log4j2.properties`] + [source,xml] + ---- + include::example$manual/json-template-layout/usage/log4j2.properties[lines=19..20,indent=0] + ---- + ==== + + JSON Template Layout generates JSON as follows: + + [source,json] + ---- + {"instant":"2017-05-25T19:56:23.370Z","someConstant":1,"message":"Hello, error!"} //<1> + ---- + <1> JSON pretty-printing is not supported for performance reasons. + + Good news is JSON Template Layout is perfectly production-ready without any configuration! + It bundles several predefined event templates modeling popular JSON-based log formats. + + Read more on xref:manual/json-template-layout.adoc[]... + + [#MessageLayout] + === Message Layout + + `MessageLayout` is a special layout that extracts the + {log4j2-url}/manual/messages.html[`Message`] + contained in a log event. + It is currently only useful with the + xref:manual/appenders/database.adoc#JdbcAppender[JDBC Appender]. + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-MessageLayout[{plugin-reference-marker} Plugin reference for `MessageLayout`] + + [id=pattern-layout] + === [[PatternLayout]] Pattern Layout + + `PatternLayout` is a customizable, efficient, garbage-free, and human-readable string generating layout using a user-provided pattern. + It is analogous to `String#format()` with specialized directives on injecting certain properties of a `LogEvent`. + + [IMPORTANT] + ==== + Pattern Layout is not intended for _structural logging_ purposes. + For production environments, you are strongly advised to use xref:manual/json-template-layout.adoc[] producing JSON output ready to be delivered to log ingestion systems such as Elasticsearch or Google Cloud Logging. + ==== + + A conversion pattern is composed of literal text and format control expressions. + For instance, given the `%-5p [%t]: %m%n` pattern, following statements + + [source,java] + ---- + LOGGER.debug("Message 1"); + LOGGER.warn("Message 2"); + ---- + + will yield the output + + [source,text] + ---- + DEBUG [main]: Message 1 + WARN [main]: Message 2 + ---- + + Read more on xref:manual/pattern-layout.adoc[]... + + [#RFC5424Layout] + === RFC 5424 Layout + + `Rfc5424` Layout encodes log events according to https://datatracker.ietf.org/doc/html/rfc5424#section-6[the Syslog message format described in RFC 5424]. + + [NOTE] + ==== + RFC 5424 obsoletes RFC 3164, implemented by <>. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-Rfc5424Layout[📖 Plugin reference for `Rfc5424Layout`] + + RFC 5424 Layout is configured with the following parameters: + + [%header,cols="1m,1m,4"] + |=== + |Parameter + |Type + |Description + + |appName + |String + |The `APP-NAME` field as described in RFC 5424 + + |charset + |String + |The character encoding (defaults to `UTF-8`) + + |enterpriseNumber + |integer + | + The `enterpriseId` parameter as described in RFC 5424. + If missing, `32473` will be used, which is https://www.rfc-editor.org/rfc/rfc5612.html#section-2[reserved for documentation use]. + + |exceptionPattern + |String + |An xref:manual/pattern-layout.adoc#converter-exception[`exception` conversion specifier of Pattern Layout]. + The default is to not include the `Throwable` from the event, if any, in the output. + + |facility + |String + |The name of link:../javadoc/log4j-core/org/apache/logging/log4j/core/net/Facility.html[`Facility`] as described in RFC 5424. + The matching is case-insensitive. + It defaults to `LOCAL0`. + + |id + |String + |The default _Structured Data ID_ to use when formatting according to RFC 5424. + If the log event contains a {log4j2-url}/manual/messages.html#StructuredDataMessage[`StructuredDataMessage`], the ID from that message will be used instead. + + |includeMDC + |boolean + |Indicates whether data from the {log4j2-url}/manual/thread-context.html[] map will be included in the RFC 5424 Syslog record (defaults to `true`) + + |loggerFields + |link:../javadoc/log4j-core/org/apache/logging/log4j/core/util/KeyValuePair.html[KeyValuePair[\]] + |Allows arbitrary {log4j2-url}/manual/thread-context.html[] map entries. + To use, include a `LoggerFields` nested element, containing one or more `KeyValuePair` elements. + Each `KeyValuePair` must have `key` and `value` attributes associating them with a thread context map entry. + The `value` attribute can be an arbitrary xref:manual/pattern-layout.adoc[] pattern. + + |mdcExcludes + |String + |A comma-separated list of {log4j2-url}/manual/thread-context.html[] map (aka, MDC) keys that should be excluded. + This is mutually exclusive with `mdcIncludes`. + This attribute only applies to RFC 5424 Syslog records. + + |mdcIncludes + |String + |A comma-separated list of {log4j2-url}/manual/thread-context.html[] map (aka, MDC) keys that should be included. + Any keys in the thread context map not found in the list will be excluded. + This option is mutually exclusive with `mdcExcludes`. + This attribute only applies to RFC 5424 Syslog records. + + |mdcId + |String + |The ID to use for the {log4j2-url}/manual/thread-context.html[] map (aka, MDC) Structured Data Element. + It defaults to `mdc`. + This attribute only applies to RFC 5424 Syslog records. + + |mdcPrefix + |String + |A string to be prepended to each {log4j2-url}/manual/thread-context.html[] map (aka, MDC) key to distinguish it from event attributes. + It defaults to `mdc:`. + This attribute only applies to RFC 5424 Syslog records. + + |mdcRequired + |String + |A comma-separated list of {log4j2-url}/manual/thread-context.html[`ThreadContext`] map (aka, MDC) keys that must be present. + If a key is not present, a + {log4j2-url}/javadoc/log4j-api/org/apache/logging/log4j/LoggingException.html[`LoggingException`] + will be thrown. + This attribute only applies to RFC 5424 Syslog records. + + |messageId + |String + |The default value to be used in the `MSGID` field of RFC 5424 Syslog records + + |newLine + |boolean + |If `true`, a `\n` character will be appended to the end of the Syslog record (defaults to `false`) + + |newLineEscape + |String + |The string that should be used to replace newlines within the message text + |=== + + RFC 5424 Layout has specialized handling for {log4j2-url}/manual/messages.html#StructuredDataMessage[`StructuredDataMessage`]s. + By combining two, users can have complete control on how their message is encoded in a way compliant with RFC 5424, while RFC 5424 Layout will make sure the rest of the information attached to the log event is properly injected. + + [#SyslogLayout] + === Syslog Layout + + `SyslogLayout` encodes log events according to https://datatracker.ietf.org/doc/html/rfc3164#section-4.1[the syslog message format described in RFC 3164]. + This matches the same format used by {logging-services-url}/log4j/1.x[Log4j 1]. + + [IMPORTANT] + ==== + RFC 3164, implemented by Syslog Layout, is obsoleted by RFC 5424, implemented by <>. + ==== + + xref:plugin-reference.adoc#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-layout-SyslogLayout[📖 Plugin reference for `SyslogLayout`] + + Syslog Layout is configured with the following parameters: + + [%header,cols="1m,1m,4"] + |=== + |Parameter + |Type + |Description + + |charset + |String + |The character encoding (defaults to `UTF-8`) + + |facility + |String + |The name of link:../javadoc/log4j-core/org/apache/logging/log4j/core/net/Facility.html[`Facility`] as described in RFC 5424. + The matching is case-insensitive. + It defaults to `LOCAL0`. + + |newLine + |boolean + |If `true`, a `\n` character will be appended to the end of the Syslog record (defaults to `false`) + + |newLineEscape + |String + |The string that should be used to replace newlines within the message text + |=== + + [#extending] + == Extending + + Layouts are xref:manual/plugins.adoc[plugins] implementing link:../javadoc/log4j-core/org/apache/logging/log4j/core/Layout.html[the `Layout` interface]. + This section will guide you on how to create custom ones. + + [NOTE] + ==== + While <> should address most common use cases, you might find yourself needing to implement a custom one. + If this is the case, we really appreciate it if you can *share your use case in a {logging-services-url}/support.html[user support channel]*. + ==== + + [#extending-plugins] + === Plugin preliminaries + + include::partial$manual/plugin-preliminaries.adoc[] + + [#extending-layouts] + === Extending layouts + + Layouts are xref:manual/plugins.adoc[plugins] implementing link:../javadoc/log4j-core/org/apache/logging/log4j/core/Layout.html[the `Layout` interface]. + If your layout is a `String`-based one, we recommend you to extend your plugin class from link:../javadoc/log4j-core/org/apache/logging/log4j/core/layout/AbstractStringLayout.html[`AbstractStringLayout`], which contains convenience for some of the boilerplate code shared by `String`-based layouts. + You can check out following files for examples: + + * {project-github-url}/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java[`SyslogLayout.java`] – simple, single-file, extending from `AbstractStringLayout` + * {project-github-url}/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java[`JsonTemplateLayout.java`] – advanced, using plugins for composing several of its features, contains _recycler_ concept for xref:manual/garbagefree.adoc[garbage-free] operation, extends from link:../javadoc/log4j-core/org/apache/logging/log4j/core/StringLayout.html[`StringLayout`] +//// \ No newline at end of file