blob: c534a0847f896700f079c58cd6928586ed6c97c8 [file] [log] [blame]
////
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.
////
= Log4j Spring Cloud Configuration
This module allows logging configuration files to be dynamically updated when new versions are available in Spring Cloud Configuration.
== Overview
Spring Boot applications initialize logging 3 times.
. SpringApplication declares a Logger.
This Logger will be initialized using Log4j's "normal" mechanisms.
Thus a system property named xref:manual/configuration.adoc#log4j2.configurationFile[log4j2.configurationFile] will be
checked
to see if a
specific configuration
file has been provided, otherwise it will search for a configuration file on the classpath.
The property may also be declare in log4j2.component.properties.
== Usage
Log4j configuration files that specify a monitor interval of greater than zero will use polling to determine whether the configuration has been updated.
If the monitor interval is zero then Log4j will listen for notifications from Spring Cloud Config and will check for configuration changes each time an event is generated.
If the monitor interval is less than zero Log4j will not check for changes to the logging configuration.
When referencing a configuration located in Spring Cloud Config the configuration should be referenced similar to
[source,properties]
----
log4j.configurationFile=http://host.docker.internal:8888/ConfigService/sampleapp/default/master/log4j2.xml
----
Log4j also supports Composite Configurations.
The standard way to do that is to concatentate the paths to the files in a comma separated string.
Unfortunately, Spring validates the URL being provided and commas are not allowed.
Therefore, additional configurations must be supplied as "override" query parametes.
[source,properties]
----
log4j.configurationFile=http://host.docker.internal:8888/ConfigService/sampleapp/default/master/log4j2.xml?override=http://host.docker.internal:8888/ConfigService/sampleapp/default/master/log4j2-sampleapp.xml
----
Note that the location within the directory structure and how configuration files are located is completely dependent on the searchPaths setting in the Spring Cloud Config server.
When running in a docker container host.docker.internal may be used as the domain name to access an application running on the same hose outside of the docker container.
Note that in accordance with Spring Cloud Config practices but the application, profile, and label should be specified in the url.
The Spring Cloud Config support also allows connections using TLS and/or basic authentication.
When using basic authentication the userid and password may be specified as system properties, log4j2.component.properties or Spring Boot's bootstrap.yml.
The table below shows the alternate names that may be used to specify the properties.
Any of the alternatives may be used in any configuration location.
|===
| Property | Alias | Spring-like alias | Purpose
| log4j2.configurationUserName
| log4j2.config.username
| logging.auth.username
| User name for basic authentication
| log4j2.configurationPassword
| log4j2.config.password
| logging.auth.password
| Password for basic authentication
| log4j2.configurationAuthorizationEncoding
|
| logging.auth.encoding
| Encoding for basic authentication (defaults to UTF-8)
| log4j2.configurationAuthorizationProvider
| log4j2.config.authorizationProvider
| logging.auth.authorizationProvider
| Class used to create HTTP Authorization header
|===
[source,properties]
----
log4j2.configurationUserName=guest
log4j2.configurationPassword=guest
----
As noted above, Log4j supports accessing logging configuration from bootstrap.yml.
As an example, to configure reading from a Spring Cloud Configuration service using basic authoriztion you can do:
[source,yaml]
----
spring:
application:
name: myApp
cloud:
config:
uri: https://spring-configuration-server.mycorp.com
username: appuser
password: changeme
logging:
config: classpath:log4j2.xml
label: ${spring.cloud.config.label}
---
spring:
profiles: dev
logging:
config: https://spring-configuration-server.mycorp.com/myApp/default/${logging.label}/log4j2-dev.xml
auth:
username: appuser
password: changeme
----
Note that Log4j currently does not directly support encrypting the password.
However, Log4j does use Spring's standard APIs to access properties in the Spring configuration so any customizations made to Spring's property handling would apply to the properties Log4j uses as well.
If more extensive authentication is required an `AuthorizationProvider` can be implemented and the fully qualified class name in the xref:manual/configuration.adoc#log4j2.configurationAuthorizationProvider[log4j2.configurationAuthorizationProvider] system property, in `log4j2.component.properties` or in Spring's `bootstrap.yml` using either the `log4j2.authorizationProvider` key or with the key `logging.auth.authorizationProvider`.
For the properties required by TLS configuration see xref:manual/configuration.adoc#transport-security[Transport Security].
== Requirements
The Log4j 2 Spring Cloud Configuration integration has a dependency on Log4j 2 API, Log4j 2 Core, and Spring Cloud Configuration versions 2.0.3.RELEASE or 2.1.1.RELEASE or later versions it either release series.
For more information, see xref:runtime-dependencies.adoc[Runtime Dependencies].