Comments (3)
log4j2-logstash-layout
uses Log4j 2 Lookups under the hood and basically provides access to environment variables, certain Java runtime constants (version, OS, etc.) and so on. (See the link for details.) So your question boils down to "Can I access Spring variables from Log4j 2 configuration?". Below I listed approaches I know of you can purpose for the problem:
Read Spring properties file in Log4j 2 configuration
The steps are detailed in this SO post. In a nutshell, add the following to your log4j2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Properties>
<property name="spring-profile">${bundle:application:spring.profiles.active}</property>
</Properties>
<!-- ... -->
</Configuration>
And use ${spring-profile}
variable in your layout JSON.
Set system property at application start-up
At Spring application start-up, you expose the Spring property to the rest of the application:
@SpringBootApplication
public class DemoSpringAppApplication {
@Autowired
public DemoSpringAppApplication(@Value("${spring.profiles.active}") String profile) {
System.setProperty("spring.profiles.active", profile);
}
// ...
}
Tell Log4j 2 about this property:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Properties>
<property name="spring-profile">${sys:spring.profiles.active}</property>
</Properties>
<!-- ... -->
</Configuration>
Thereafter you can access the variable in your layout JSON via spring-profile
.
You might be wondering though, why don't we just type ${sys:spring.profiles.active}
in our layout JSON? Why do we need a property
definition? log4j2-logstash-layout
initially tries to resolve variables and if it fails, treats the value as a literal. Given Spring sets the property after Log4j initialization, it becomes too late to resolve the variable and it gets injected as is. To overcome this, we first declare the variable in a property
and then access that property via ${spring-profile}
. Note that using the same property name (that is, ${spring.profiles.active}
rather than ${spring-profile}
) yields to an infinite lookup loop.
Set property via -Dspring.profiles.active
If you set the property via -Dspring.profiles.active
, then you can directly access it in layout JSON via ${sys:spring.profiles.active}
.
Set property as an environment variable shared by both Spring and Log4j 2
I assume title is self-explanatory.
from log4j2-logstash-layout.
Appreciate for the detailed answer, The first solution errored out by saying cant find the bundle for application, might be related to how it is deployed. So i opted for second solution and worked like charm, and third solution would have worked as well but while developing it is defaulted to an environment. Again thanks
from log4j2-logstash-layout.
@sabareeshkkanan, I am glad at least one of the methods worked for you. Further I created a Gist with a sample Spring Boot application which employs the 1st (the one that did not work for you) and 2nd aforementioned approaches. Hope it helps.
from log4j2-logstash-layout.
Related Issues (20)
- BufferOverflowException get thrown for messages of a larger size HOT 7
- LogstashLayout with log4j2-elasticsearch appender HOT 1
- Introduce properties to globally set LogstashLayout.Builder defaults
- Nullpointer exceptions at LogstashLayoutSerializationContexts$StringTruncatingGeneratorDelegate HOT 1
- Any template ready for GCP? HOT 9
- Message lost if exceeding maxStringLength and emptyPropertyExclusionEnabled is true HOT 4
- Use ByteArrayOutputStream instead of ByteBufferOutputStream to avoid message loss HOT 8
- Stacktraces larger than maxStringLength are not truncated HOT 7
- Failed serializing JSON: BufferOverflowException HOT 10
- How to output ThreadContext (ex -MDC fields) HOT 1
- Review request for Log4j JsonTemplateLayout HOT 7
- How exactly is MapMessage supposed to be handled? HOT 7
- Multiple template variables in single property lead to an exception HOT 2
- Fallback for json:map: fields for libraries HOT 1
- NoClassDefFoundError: logstash.layout.resolver.TemplateResolvers (initialization failure) HOT 1
- Remove max byte count cap? HOT 1
- Reference whole MapMessage - and not just keys HOT 13
- Compiling with JDK 8 results in java.lang.NoSuchMethodError: java.nio.ByteBuffer.flip()Ljava/nio/ByteBuffer; HOT 4
- Marker lookup subsitutes literal string when marker not available HOT 1
- BufferOverflowException occurs intermittently when sending data via socket appender HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from log4j2-logstash-layout.