Giter Site home page Giter Site logo

Comments (3)

vy avatar vy commented on August 19, 2024 1

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.

sabareeshkkanan avatar sabareeshkkanan commented on August 19, 2024

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.

vy avatar vy commented on August 19, 2024

@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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.