Log4j2 on Spring Boot - spring-boot

I've been debugging the whole day and almost tried everything what the internet say about how to do it but I still don't get it correctly.
I am using Spring Boot and log4j2 for my logging because I want my logs to be written on a file instead of console. When I start Spring Boot, the log file is successfully created but I can't see "Hello Philippines" written on the file. I hope you can help me guys with this one.
Here is my Spring Boot Application:
My log4j2.xml
My POM:
I don't have any on my application.properties, this is the result when I run my application:

The name of your logger in the log4j2.xml is com.example but the logger you create in your application is DemoApplication.
You should create your logger like this:
Logger logger = LoggerFactory.getLogger(DemoApplication.class);

Related

Loading Application.yml using ApplicationContext.xml in Spring5

I need to load application.yml file using applicationContext.xml. Is there any tag which might do this. Using Spring version 5, i do not have any main class since the app is deployed as war file so cannot use annotations.

SpringBoot - MDC filter for sl4j

Spring Boot - MDC filter for logging props like correlation-id, http-method with slf4j logs is not working for the been I have created manually whereas it prints the correlation id, http-method in the log that comes out of the class with spring annotation like Component, Service, etc., I really don't understand how that I get the MDC filter to recognise the #Bean instance as well. Thanks and I will appreciate your help!.

Spring Cloud Config: Bootstrap context not loading profile-specific property files for binding

Setup
Spring Boot 2.6.0
Spring Cloud Config 3.1 RC1
Apache Maven 3.8.x
OpenJDK 11
Overview
I have a multi-module Apache Maven project that is set up with the following modules:
bootstrap: contains a PropertySourceLocator for BootstrapConfiguration, defined in spring.factories file.
starter: depends on bootstrap, and it's a (servlet-based) web application
reference: deploys the starter application using the Maven Cargo plugin, deploying into an Apache Tomcat 9.0.55
Runtime
The starter module declares a configuration class, annotated with #PropertySource("wa.properties"). This wa.properties on the classpath of the starter module has a setting: cas.authn.syncope.name=Starter
The starter module has a ServletInitializer that sets the spring.config.name property to "wa" when building the spring application.
The reference module only has a wa-embedded.properties file on the classpath with a setting: cas.authn.syncope.name=Embedded
The reference module starts with the spring activated profiles: embedded,all
Note: the cas.authn.syncope.name is bound to a Java POJO, CasConfigurationProperties, that is annotated with #ConfigurationProperties("cas").
Observation
The following bean in the application exists, simplified for this post:
#Bean
#ConditionalOnMissingBean(name = "something")
#RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
public Something something(ApplicationContext ctx, CasConfigurationProperties cas) {
...
}
If I look at the contents of cas.getAuthn().getSyncope().getName()), it shows: "Starter"
If I look at ctx.getEnvironment().getProperty("cas.authn.syncope.name"), it shows "Embedded".
In other words, property binding used during the bootstrapping process does not match the actual environment for the application's context.
Analysis
It appears that when the bootstrap application context is created, wa-embedded.properties, a profile-specific property is not read. In fact, the only property source that is used for binding is wa.properties as part of "localProperties", which I believe comes from #PropertySource("wa.properties"). Nothing else is read or found.
Then, property binding takes place binding CasConfigurationProperties and cas.authn.syncope.name initialized from #PropertySource("wa.properties"). The value of this property is set to Starter.
Then, the application servlet context is initialized and its environment is post-processed with profiles and the appropriate listener and Spring beans are created. In particular, this bean:
#Bean
#ConditionalOnMissingBean(name = "something")
#RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
public Something something(ApplicationContext ctx, CasConfigurationProperties cas) {
...
}
...shows that ctx is the actual application context with an environment that is post-processed via all profiles and shows ctx.getEnvironment().getProperty("cas.authn.syncope.name") as "Embedded".
However, CasConfigurationProperties was processed using the Bootstrap context only, and its equivalent property shows "Starter".
...which means the bean would be created using the wrong values in CasConfigurationProperties.
Research
This setup works OK using Spring Boot 2.5.6 and Spring Cloud 3.0.5. I don't think anything in Spring Boot has changed that would affect this, but I do see a number of differences in Cloud between 3.0 and 3.1.
I am not sure I can create a reproducer to adequately showcase this. I'll try. In the meantime, could you evaluate this and see if this might be seen as a bug, or misconfiguration of some kind?

setting spring boot logger to debug only for AOP related info

I use the following configuration
logging.level.org.springframework=DEBUG
to investigate in AOP related issues...is there any way to show in the log file only log entries related to AOP the same way as
logging.level.org.springframework.web=DEBUG
but for AOP?

Configure Spring Boot in external library

I'm currently code a library in Groovy and I want to use Spring Boot for configuration. That library has no main method.
I've succeeded to launch my unit test by using Spring Boot with the code below:
#RunWith(SpringJUnit4ClassRunner.class)
class AddressTest { ... }
But I want to configure my Address class thanks the application.properties file. For a test, I've only wanted to change the log level while tests by inserting the line below in the application.properties file:
logging.level.root=WARN
But, that doesn't work.
I've tried add the #Configuration annotation in my test class or my tested class but the result is the same.
Thanks for your help.

Resources