2016-11-16 5 views
8

मेरे spring-boot एप्लिकेशन में मैं लॉगिंग के लिए logback का उपयोग करता हूं। एप्लिकेशन पर्यावरण विशिष्ट अनुप्रयोग गुणों को सेट करने के लिए बाहरी application.properties फ़ाइल का उपयोग करता है और विकल्प के साथ शुरू होता है: -spring.config.location=path/to/file। मैं लॉगबैक कॉन्फ़िगरेशन को वहां से गुणों को पढ़ने के लिए भी चाहूंगा ताकि सभी पर्यावरण गुण एक ही स्थान पर प्रबंधित हो जाएं।बाहरी अनुप्रयोग गुण फ़ाइल में लॉगबैक पर्यावरण निर्भर गुणों को नियंत्रित करना

मैं दृष्टिकोण की कोशिश की here वर्णित है, लेकिन जब से गुण फ़ाइल classpath पर नहीं है, मैं त्रुटि मिलती है:

java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.action.PropertyAction - Could not find resource [application.properties] 

वहाँ कुछ मुझे याद आ रही है?

अद्यतन:

इस विन्यास काम करता जोड़ना:

<property file="path/to/file" /> 

लेकिन मैं फ़ाइल पथ हार्डकोड से बचने के लिए चाहते हैं।

उत्तर

3

ऐड प्रणाली वातावरण चर, इसलिए logback विन्यास फाइल

logback.configurationFile=path/to/config.xml 
+0

यह मेरे प्रश्न से स्पष्ट नहीं हो सकता है, लेकिन मैं एक लॉगबैक कॉन्फ़िगरेशन फ़ाइल को कुछ मानों के साथ रखना चाहता हूं जो वातावरण के बीच भिन्न हैं। – javafan

1

के लिए वापस इस स्थान पर गिर जाता है हम spring-boot उपयोग नहीं करते लेकिन शायद इस दृष्टिकोण उपयोगी हो सकता है:

हम इस LogbackConfigurator बनाया। इस वर्ग ContextRefreshedEvent सुनकर आवेदन स्टार्टअप पर निष्पादित किया जाता है:

@Bean 
public LogbackTestConfigurator logbackConfigurator() 
{ 
    return new LogbackTestConfigurator(); 
} 
2

जब से तुम स्प्रिंग उपयोग कर रहे हैं आप का उपयोग कर सकते हैं:

public class LogbackConfigurator implements ApplicationListener<ContextRefreshedEvent> 
{ 
    // configure your configuration file here 
    private static final String   LOGBACK_CONFIGURATION = "some/where/application.properties"; 


    @Override 
    public void onApplicationEvent(ContextRefreshedEvent event) 
    { 
     LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
     try 
     { 
      // creating JoranConfigurator 
      JoranConfigurator joranConfigurator = new JoranConfigurator(); 

      // setting logger context for JoranConfiguratior 
      joranConfigurator.setContext(loggerContext); 

      // resetting context, override default configuration 
      loggerContext.reset(); 

      // configuring Logback with resource 
      joranConfigurator.doConfigure(new Resource(LOGBACK_CONFIGURATION).getInputStream()); 
     } 
     catch (Exception exception) 
     { 
      // exception handling 
     } 
    } 
} 

सेम निष्पादित करने के लिए, हम अपने जावा विन्यास में इस लाइन जोड़ा लॉगबैक के लिए स्प्रिंग एक्सटेंशन: logback-ext-spring

यह लाइब्रेरी क्या करती है मूल रूप से आपको स्प्रिंग प्रबंधित ऑब्जेक्ट्स पर वास्तविक लॉगिंग का प्रतिनिधित्व करने की संभावना देता है जो आपको वसंत संदर्भ तक पहुंच प्रदान करता है। आप वसंत विन्यास के भीतर परिशिष्ट बना सकते हैं और कॉन्फ़िगर कर सकते हैं जहां आपको Environment चरों तक पहुंच होगी और इसलिए application.properties तक भी पहुंच होगी।

आप GitHub पृष्ठ पर और अधिक जानकारी प्राप्त कर सकते लेकिन यहाँ लिंक है, जहां सांत्वना appender के लिए पैटर्न पर्यावरण संपत्ति "consolePattern" से लिया गया है में प्रदान की जाती उदाहरण के आधार पर, एक उदाहरण विन्यास है:

logback .xml:

<configuration> 

    <appender name="consoleAppender" class="ch.qos.logback.ext.spring.DelegatingLogbackAppender"/> 

    <root level="INFO"> 
     <appender-ref ref="consoleAppender"/> 
    </root> 

</configuration> 

LogbackConfig.java:

import ch.qos.logback.classic.LoggerContext; 
import ch.qos.logback.classic.encoder.PatternLayoutEncoder; 
import ch.qos.logback.core.ConsoleAppender; 
import ch.qos.logback.ext.spring.ApplicationContextHolder; 
import org.slf4j.LoggerFactory; 
import org.springframework.core.env.Environment; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class LogbackConfig { 

    @Autowired 
    private Environment environment; 

    @Bean 
    public static ApplicationContextHolder applicationContextHolder() { 
     return new ApplicationContextHolder(); 
    } 

    @Bean 
    public static LoggerContext loggerContext() { 
     return (LoggerContext) LoggerFactory.getILoggerFactory(); 
    } 

    @Bean (initMethod = "start", destroyMethod = "stop") 
    public static PatternLayoutEncoder encoder (LoggerContext ctx) { 
     PatternLayoutEncoder encoder = new PatternLayoutEncoder(); 
     encoder.setContext(ctx); 
     encoder.setPattern(environment.getProperty("consolePattern"); 
     return encoder; 
    } 

    @Bean (initMethod = "start", destroyMethod = "stop") 
    public static ConsoleAppender consoleAppender (LoggerContext ctx, PatternLayoutEncoder encoder) { 
     ConsoleAppender appender = new ConsoleAppender(); 
     appender.setContext(ctx); 
     appender.setEncoder(encoder); 
     return appender; 
    } 
} 

Important
Please note that the spring bean name must match the name of the appender in the logback.xml , in the example "consoleAppender" . Also don't forget to specify the initMethod and destroyMethod .

आशा है कि इससे आपको मार्ग को हार्डकोड न करने का तरीका ढूंढने में मदद मिलेगी।

2

आप अपने अनुप्रयोग को चलाने के लिए वसंत बूट उपयोग कर रहे हैं आप कर सकते हैं:

logback.xml

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <property file="${configuration.file.path}" /> 
    ....... 
</configuration> 

आप "configuration.file.path" को बदल सकते हैं, लेकिन आप उस बदलना होगा जब आप अपना ऐप चलाते हैं तो नाम।

आप गुण इस तरह संपत्ति फ़ाइल पर परिभाषित का उपयोग कर सकते हैं:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <layout class="ch.qos.logback.classic.PatternLayout"> 
     <Pattern> 
      %d{yyyy-MM-dd HH:mm:ss} - ${property.defined.in.property.file} - %msg%n 
     </Pattern> 
    </layout> 
</appender> 

<root level="${level.defined.in.property.file}"> 
    <appender-ref ref="STDOUT" /> 
</root> 

और जब आप अपने एप्लिकेशन पर अमल वी एम के लिए परम जोड़ने

-Dlogging.config=/some/path/logback.xml -Dconfiguration.file.path=/other/path/application.properties 

logging.config एक वसंत है बूट कॉन्फ़िगरेशन, इसलिए आपको वह नाम रखना होगा। आप अपने एप में कॉन्फ़िगरेशन को बदले बिना प्रत्येक निष्पादन में उस फ़ाइल को बदल सकते हैं।

यदि आप मैन्युअल कमांड लाइन के द्वारा अपने ऐप को अंजाम, की तरह होना चाहिए:

java -Dlogging.config=/some/path/logback.xml -Dconfiguration.file.path=/other/path/application.properties -jar app-1.0.0.jar ..... 

ऐसा करने से, सभी लॉगिंग विन्यास गतिशील है, और आप इसे दे रहे हैं जब आप अनुप्रयोग चलाने के। अलग-अलग कॉन्फ़िगरेशन के साथ अलग-अलग उदाहरण हो सकते हैं

संबंधित मुद्दे