////
    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-10-x-x]
=== 10.x.x



This minor release contains several small improvements.


==== Updated

* Update `actions/upload-artifact` to version `4.3.1` (https://github.com/apache/logging-parent/pull/114[114])
* Update `com.diffplug.spotless:spotless-maven-plugin` to version `2.43.0` (https://github.com/apache/logging-parent/pull/108[108])
* Update `com.github.spotbugs:spotbugs-maven-plugin` to version `4.8.3.1` (https://github.com/apache/logging-parent/pull/116[116])
* Update `com.google.errorprone:error_prone_core` to version `2.25.0` (https://github.com/apache/logging-parent/pull/122[122])
* Update `com.palantir.javaformat:palantir-java-format` to version `2.40.0` (https://github.com/apache/logging-parent/pull/109[109])
* Update `commons-codec:commons-codec` to version `1.16.1` (https://github.com/apache/logging-parent/pull/115[115])
* Update `de.skuzzle.enforcer:restrict-imports-enforcer-rule` to version `2.5.0` (https://github.com/apache/logging-parent/pull/111[111])
* Update `github/codeql-action` to version `3.24.5` (https://github.com/apache/logging-parent/pull/126[126])
* Update `org.asciidoctor:asciidoctor-maven-plugin` to version `3.0.0` (https://github.com/apache/logging-parent/pull/119[119])
* Update `org.codehaus.mojo:flatten-maven-plugin` to version `1.6.0` (https://github.com/apache/logging-parent/pull/102[102])
* Update `org.cyclonedx:cyclonedx-maven-plugin` to version `2.7.11` (https://github.com/apache/logging-parent/pull/104[104])
* Update `org.simplify4u.plugins:sign-maven-plugin` to version `1.1.0` (https://github.com/apache/logging-parent/pull/124[124])
