2016-09-17 13 views
6

मैं एक वसंत बूट प्रोजेक्ट का उपयोग कर रहा हूं।लॉगबैक में सक्रिय वसंत प्रोफ़ाइल इंजेक्ट कैसे करें

पर्यावरण:

ch.qos.logback:logback-core:jar:1.1.5 
ch.qos.logback:logback-classic:jar:1.1.5 
org.springframework.boot:spring-boot-starter-logging:jar:1.3.3.RELEASE 

अपने प्रोजेक्ट मैं application.yml (आवेदन-dev.yml और अनुप्रयोग-production.yml)

साथ गुण का उपयोग कर रहा Logback स्प्रिंग विस्तार के बाद से में वसंत से पहले शुरू होता है मैं logback.xml फ़ाइल में spring.profiles.active इंजेक्ट करने में सक्षम नहीं हूं।

<configuration scan="true"> 

    <property name="LOG_PATH" value="/var/log/" /> 
    <property name="APP_NAME" value="xyz" /> 
    <property name="PROFILE" value="-${spring.profiles.active}" /> 
    <property name="CHARSET" value="utf-8" /> 
    <property name="PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /> 

    <appender name="APP-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${LOG_PATH}${APP_NAME}${PROFILE}.log</file> 
     <encoder> 
     <charset>${CHARSET}</charset> 
     <Pattern>${PATTERN}</Pattern> 
     </encoder> 
    </appender> 

    <logger name="a.b.c" level="INFO"> 
     <appender-ref ref="APP-FILE" /> 
    </logger> 

    <root level="INFO"> 
     <appender-ref ref="APP-FILE"/> 
    </root> 

शख्सियत मैं तलाश कर रहा हूँ संपत्ति spring.profiles.active है:

यह मेरा logback.xml फ़ाइल का एक सरल संस्करण है।

मेरा लक्ष्य /var/log फ़ाइलें निर्देशिका पर एक लॉग फ़ाइल है xyz-देव या xyz उत्पादन लेकिन मैं निश्चित रूप से बजाय xyz-spring.profiles.active_IS_UNDEFINED.log हो रही ।

दृष्टिकोण:

1 - की तरह एक घटक का उपयोग करना: क्योंकि logback स्प्रिंग एक्सटेंशन से पहले वसंत बूट आवेदन शुरू होता है

@Component 
public class InitializationService implements ApplicationListener<ContextRefreshedEvent> { 

// inject spring profile active into logback.xml 

} 

के पाठ्यक्रम काम नहीं कर रहा।

2 - इस

<file>${LOG_PATH}${APP_NAME}${PROFILE}.log</file> 

परिणाम logback.xml पर एक संपत्ति का उपयोग करना xyz-spring.profiles.active_IS_UNDEFINED.log

+0

यदि PROFILE सक्रिय प्रोफ़ाइल के लिए कुंजी-मूल्य वाली संपत्ति है, तो इसे – davidxxx

+0

पर काम करना चाहिए PROFILE जो मैं देख रहा हूं वह संपत्ति ** spring.profiles.active ** है जो application.yml में या कमांड के माध्यम से परिभाषित है लाइन। – Leonel

उत्तर

8

उत्तर देने में थोड़ा देर हो चुकी है, लेकिन मैंने अपनी "logback.xml" फ़ाइल को "लॉगबैक-वसंत.एक्सएमएल" में बदलकर स्प्रिंग प्रोफाइल सफलतापूर्वक लॉग किया है, और इस (अधिक) सरलीकृत संस्करण

जैसे प्रोफ़ाइल तक पहुंचा है

<springProperty scope="context" name="ACTIVE_PROFILE" source="spring.profiles.active"/> 

<appender name="GRAYLOG" class="com.github.pukkaone.gelf.logback.GelfAppender"> 

    <additionalField>environment=${ACTIVE_PROFILE}</additionalField> 

</appender> 

<root level="WARN"> 
    <appender-ref ref="GRAYLOG" /> 
</root> 

ऐसा लगता है कि "logback-spring.xml" प्रोफ़ाइल जानकारी ले सकते हैं।

विशिष्ट documentation is here

3

यहाँ क्या मैं अपने प्रोजेक्ट के लिए किया है। अंदर अपने logback.xml

<include resource="org/springframework/boot/logging/logback/defaults.xml"/> 

<property resource="application.properties"/> 

तो फिर तुम गुण जो आपके application.properties फाइल में परिभाषित कर रहे हैं का उपयोग कर सकते हैं। ${MY-PROPERTY} मेरे आवेदन में .properties मेरे पास logfile के नाम के लिए एक संपत्ति है।

यह application.yml => YAML संपत्ति फ़ाइल के साथ काम नहीं करता है क्योंकि yaml फ़ाइल लॉगबैक init के बाद व्याख्या की जाती है।

+0

मेरी प्रोजेक्ट में मैं application.yml (application-dev.yml और application-production.yml) के साथ गुणों का उपयोग कर रहा हूं ... तो क्या आपके पास अन्य दृष्टिकोण है? – Leonel

+0

अच्छा नहीं, मैंने कोशिश की और ऐसा लगता है कि आप नहीं कर सकते। हो सकता है कि किसी प्रॉपर्टी फ़ाइल पर वापस जाएं, लेकिन अगर आपके पास विशेष वर्ण हैं (संपत्ति फ़ाइल utf-8 अनुकूल नहीं है) http://stackoverflow.com/questions/29669049/logback-xml-is-evaluated-before-plication- yml- –

2
  • आप स्प्रिंग बूट का उपयोग कर रहे जब से तुम logging.file=blah.log परिभाषित कर सकते हैं। official docs देखें।
  • या आप वेनिला लॉगबैक का उपयोग कर सकते हैं और सिस्टम वैरिएबल पास कर सकते हैं: -DLOG_FILE=blah.log

आप प्रोफ़ाइल का उपयोग क्यों नहीं करना चाहिए:

आपको क्या करने की कोशिश कर रहे हैं नहीं है क्या वसंत प्रोफाइल के लिए बनाया गया था।स्टार्टअप के दौरान व्यवहार को सक्रिय/निष्क्रिय करने के लिए उन्हें बीन्स चालू/बंद करने की आवश्यकता होती है। सामान्य परीक्षण में अभ्यास की अनुशंसा नहीं की जाती है क्योंकि आप परीक्षण करते हैं और उत्पादन में क्या काम करता है अलग है (हालांकि कभी-कभी कोई अन्य विकल्प नहीं होता है)। the original announcement का अनुभाग देखें।

प्रोफाइल के उपयोग के साथ एक और समस्या यह है कि एक ही समय में कई प्रोफाइल सक्रिय किए जा सकते हैं। प्रोफाइल छोटे असंबद्ध भागों को चालू/बंद करने के लिए बनाए गए थे। जैसे spring.profiles.active=cache-off,perf-monitoring-on या उस तरह का कुछ।

यह कहकर कि आप अभी भी एक प्रोफ़ाइल को परिभाषित कर सकते हैं और उस प्रोफ़ाइल के भीतर logging.file=prod.log संपत्ति सेट कर सकते हैं। यह अभी भी बहुत खराब है और नहीं कि प्रोफ़ाइल का उपयोग कैसे किया जाना चाहिए, लेकिन यह बेहतर है।

+0

"प्रोफ़ाइल का परीक्षण सामान्य रूप से अभ्यास नहीं किया जाता है क्योंकि आप परीक्षण करते हैं और उत्पादन में क्या काम करता है अलग है" आपके द्वारा उद्धृत किए गए चेतावनी अनुभाग में, मैं इस तरह से कुछ भी नहीं पढ़ता। यह कहता है: ** दो प्रोफाइल के बीच पंजीकृत बीन्स का सेट शायद अलग से अधिक समान होना चाहिए। ** और मैं इसके साथ सहमत हूं। आम तौर पर, वेब अनुप्रयोगों को कई वातावरण (देव, एकीकरण, आदि ... उत्पादन तक) के माध्यम से जाना चाहिए और प्रत्येक में विशिष्टताएं (ओएस, यूआरएल, डेटाबेस, आदि ...) हैं, जो कि एक बुरी आदत को अनदेखा कर रही है। – davidxxx

+0

@davidhxxx यूआरएल, डेटाबेस, आदि प्रोफाइल में परिभाषित नहीं किया जाना चाहिए। जिन्हें जेएनडीआई में या अनुप्रयोग-विशिष्ट विन्यास फाइलों में सिस्टम वर्र्स, एनवी वर्र्स, के रूप में परिभाषित करने की आवश्यकता है। कृपया लेख से केवल एक टुकड़ा न लें, यह भी कहता है: यदि प्रोफ़ाइल का उपयोग आसान नहीं हो सकता है, तो प्रोफाइल का उपयोग न करें। –

+0

मैं लेख से केवल एक टुकड़ा नहीं लेता हूं। ** यदि कोई आसान तरीका काम पूरा कर सकता है तो प्रोफाइल का उपयोग न करें ** उस यूआरएल, डेटाबेस सूचना, आदि को व्यक्त नहीं करता है ... प्रोफ़ाइल में नहीं होना चाहिए। इसके अलावा, आप कहते हैं कि ये जानकारी एप्लिकेशन-विशिष्ट कॉन्फ़िगरेशन फ़ाइलों में हो सकती है। लेकिन स्प्रिंग बूट के साथ, प्रोफाइल एप्लिकेशन-विशिष्ट कॉन्फ़िगरेशन फ़ाइल के साथ भी काम करता है, जब आप सर्वर लॉन्च या प्रॉपर्टी एनोटेशन के माध्यम से रनटाइम पर पुनर्प्राप्त होते हैं। प्रोफाइल न केवल जावा कोड हैं। – davidxxx

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