diff --git a/.editorconfig b/.editorconfig index f9451f42..e50b5f2f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -205,4 +205,10 @@ dotnet_diagnostic.KR1037.severity = none # NUnit2045: Use Assert.Multiple dotnet_diagnostic.NUnit2045.severity = none # IDE0079: Remove unnecessary suppressions -dotnet_diagnostic.IDE0079.severity = none \ No newline at end of file +dotnet_diagnostic.IDE0079.severity = none + +[*.xml] +tab_width = 2 +indent_size = 2 +indent_style = space +end_of_line = crlf \ No newline at end of file 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..a2d86354 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/ @@ -240,6 +225,8 @@ src/GeneratedAssemblyInfo.cs *.orig *.old *.swp +node +node_modules build-tools buildreports vs_buildtools.exe @@ -247,4 +234,6 @@ dotnetfx35.exe *.exe /src/Binaries/* -local-tasks/*.generated.js \ No newline at end of file +local-tasks/*.generated.js +/.flattened-pom.xml +validate \ No newline at end of file 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 00000000..cb28b0e3 Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ 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..6b2a2c3b --- /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 log4net + url: "https://logging.apache.org/log4net" + 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: | + + + # Disable component version selector + - path: partials/nav-explore.hbs + contents: "" + + # Fix the `Edit this page` link + - path: partials/edit-this-page.hbs + contents: | +
Edit this Page
diff --git a/mvnw b/mvnw new file mode 100755 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..488f552a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,17 @@ { "name": "log4net", - "version": "2.0.12", + "version": "3.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "log4net", - "version": "2.0.12", + "version": "3.0.4", "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 45124499..57f6fa34 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 eeb68544..9e0067d4 100644 --- a/pom.xml +++ b/pom.xml @@ -1,35 +1,54 @@ + - + ~ 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 + + pom - 3.0.4 + org.apache.logging.log4net + apache-log4net + ${revision} + Apache log4net Logging framework for Microsoft .NET Framework. - https://logging.apache.org/log4net/ + https://logging.apache.org/log4net 2004 + + + scm:git:https://github.com/apache/logging-log4net + scm:git:https://github.com/apache/logging-log4net + https://github.com/apache/logging-log4net + + - Github + GitHub Issues https://github.com/apache/logging-log4net/issues + logging commits: all git commits of the logging projects including log4net @@ -39,157 +58,131 @@ 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-log4net/actions + + + + + + 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.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.maven.plugins - maven-site-plugin - 3.4 + com.diffplug.spotless + spotless-maven-plugin - ${basedir}/src/site/site.vm + + + + **/.idea/* + src/changelog/**/*.xml + **/bin/**/*.xml + **/*.y*ml + + + - + 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/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 diff --git a/src/changelog/.changelog.adoc.ftl b/src/changelog/.changelog.adoc.ftl new file mode 100644 index 00000000..e63407d1 --- /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..c08d82f9 --- /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[] + \ 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.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 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/.release-notes.adoc.ftl b/src/changelog/3.0.2/.release-notes.adoc.ftl new file mode 100644 index 00000000..a708d2cb --- /dev/null +++ b/src/changelog/3.0.2/.release-notes.adoc.ftl @@ -0,0 +1,47 @@ +//// + 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-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/.release.xml b/src/changelog/3.0.2/.release.xml new file mode 100644 index 00000000..b5a8a85f --- /dev/null +++ b/src/changelog/3.0.2/.release.xml @@ -0,0 +1,6 @@ + + diff --git a/src/changelog/3.0.2/189-separate-review-instructions.xml b/src/changelog/3.0.2/189-separate-review-instructions.xml new file mode 100644 index 00000000..deeac463 --- /dev/null +++ b/src/changelog/3.0.2/189-separate-review-instructions.xml @@ -0,0 +1,8 @@ + + + + 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-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..a3b85d44 --- /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..7c2e49b1 --- /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..550479a9 --- /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 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..f57633a7 --- /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: "log4net" + project-id: "log4net" + 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..62bd12f3 --- /dev/null +++ b/src/site/antora/modules/ROOT/nav.adoc @@ -0,0 +1,29 @@ +//// + 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. +//// + +* 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] +* {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..67aea4bd --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/development.adoc @@ -0,0 +1,83 @@ +//// + 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] += Development + +{project-name} uses {project-github-url}[GitHub] for source code management. + +[#building] +== Building log4net + +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] +---- +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/powershell] +---- +./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/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/features.adoc b/src/site/antora/modules/ROOT/pages/features.adoc new file mode 100644 index 00000000..ebc3521f --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/features.adoc @@ -0,0 +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 + + 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. + +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/index.adoc b/src/site/antora/modules/ROOT/pages/index.adoc new file mode 100644 index 00000000..fe105b06 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/index.adoc @@ -0,0 +1,22 @@ +//// +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. +//// + +[#log4net] += log4net + +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/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/configuration.adoc b/src/site/antora/modules/ROOT/pages/manual/configuration.adoc new file mode 100644 index 00000000..ae4641ce --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/manual/configuration.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/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 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 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 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.