2010-07-22 15 views
17

हमारी परियोजना log4j का उपयोग करती है, log4j.properties फ़ाइल के माध्यम से कॉन्फ़िगर किया गया है। हमारे पास कई उत्पादन सर्वर हैं, जो विभिन्न लॉग फ़ाइलों को लॉग करते हैं, ताकि लॉग को अलग किया जा सके। तो नोड 1 के लिए log4j.properties इस तरह दिखता है:मेवेन: अलग-अलग संपत्ति मूल्यों के साथ एक ही संसाधन को कई बार फ़िल्टर कैसे करें?

... 
log4j.appender.Application.File=D:/logs/application_1.log 
... 
log4j.appender.tx_info.File=D:/logs/tx_info_1.log 
... 

जबकि नोड 2 के लिए log4j.properties लग रहा है

तरह
... 
log4j.appender.Application.File=D:/logs/application_2.log 
... 
log4j.appender.tx_info.File=D:/logs/tx_info_2.log 
... 

हम पहले से ही हमारे सर्वर विन्यास पैदा करने के लिए Maven प्रोफ़ाइल का उपयोग। अब तक इसमें कई अलग-अलग log4j.properties फ़ाइलें शामिल हैं जो ऊपर दिखाए गए लॉग फ़ाइल नामों में भिन्न थीं। मैं Maven इस तरह एक संसाधन टेम्पलेट फ़ाइल का उपयोग कर के साथ इन फ़ाइलों उत्पन्न करने के लिए करना चाहते हैं:

... 
log4j.appender.Application.File=${log.location}/application${log.file.postfix}.log 
... 
log4j.appender.tx_info.File=${log.location}/tx_info${log.file.postfix}.log 
... 

यह एक अलग लॉग संपत्ति फ़ाइल हर बार उत्पन्न करने के लिए अलग अलग ${log.file.postfix} मूल्यों के साथ Maven अनेक बार चलाने के लिए आसान है। हालांकि, मैं क्या चाहता हूं प्रत्येक सर्वर के लिए में एक अलग संपत्ति फ़ाइल (नाम/पथ अलग से) उत्पन्न करता है। मुझे पूरा यकीन है कि यह किया जा सकता है, उदाहरण के लिए antrun प्लगइन के माध्यम से, लेकिन मैं उससे परिचित नहीं हूँ। इसे प्राप्त करने का सबसे आसान तरीका क्या है?

उत्तर

1

यहाँ कुछ दृष्टिकोण है कि आप की कोशिश कर सकते हैं:

  1. antrun प्लगइन का उपयोग, और copy कार्य generate-resources चरण में अपने संसाधन फ़ाइल के डुप्लिकेट बनाने के लिए। copying with maven पर इस SO प्रश्न के उत्तर में antrun प्लगइन का उपयोग करने का एक उदाहरण दिया गया है। आप प्रत्येक $ {log.file.postfix} को एक अलग मूल्य, या तो शाब्दिक मूल्य, 1,2,3 आदि या अद्वितीय प्लेसहोल्डर्स, $ {log.file.postfix1}, $ {का विस्तार करने के लिए चींटी की संपत्ति विस्तार का भी उपयोग कर सकते हैं। log.file.postfix2} जो आखिरकार बदल दिया जाता है जब मैवेन संसाधन फ़िल्टरिंग करता है।

  2. एंट्रून का उपयोग करने के बजाय, उसी फ़ाइल की कई प्रतियों को सेट करने के लिए अपने संस्करण नियंत्रण प्रणाली का उपयोग करें। इसके बाद आप resources:copy-resources लक्ष्य के कई उदाहरण चला सकते हैं, प्रत्येक अलग-अलग संपत्ति मान कॉन्फ़िगर किए गए हैं, और एक अलग लक्ष्य फ़ाइल नाम।

+0

विचारों के लिए धन्यवाद।संसाधनों का उपयोग करना: प्रति-संसाधन, क्या अलग-अलग गुणों के साथ अलग-अलग लक्ष्यों को एक ही फ़ाइल_ एकाधिक बार कॉपी करना संभव नहीं होगा? हालांकि, मैं अलग-अलग निष्पादन के लिए गुणों को कॉन्फ़िगर करने का तरीका नहीं समझ पाया - क्या आप मुझे एक ठोस उदाहरण के बारे में बता सकते हैं? –

+0

आप अपने पोम में कई बार प्रति-संसाधन लक्ष्य का आह्वान कर सकते हैं, प्रत्येक बार एक ही स्रोत को अलग-अलग लक्ष्य निर्दिष्ट करते हैं। मुझे नहीं पता कि प्रति-संसाधन फ़ाइलों का नाम बदलने की अनुमति देता है, लेकिन यह लक्ष्य निर्देशिका को सेट करने की अनुमति देता है। सूरज चमक रहा है - मुझे बगीचे में काम करना है, लेकिन मैं बाद में कुछ ठोस बनाने की कोशिश करूंगा। – mdma

15

(...) मैं काफी यकीन है कि यह किया जा सकता है, उदाहरण के लिए कर रहा हूँ antrun प्लगइन के माध्यम से, लेकिन मैं उससे परिचित नहीं हूँ। इसे प्राप्त करने का सबसे आसान तरीका क्या है?

आप वास्तव में resources:copy-resources इस्तेमाल कर सकते हैं और कई <execution> अपने पोम (ध्यान दें कि resources:copy-resources हालांकि लक्ष्य फ़ाइल का नाम बदलने के लिए अनुमति नहीं है)।

मान लेते हैं तो आपको निम्न संरचना है दो:

$ tree . 
. 
├── pom.xml 
└── src 
    ├── main 
    │   ├── filters 
    │   │   ├── filter-node1.properties 
    │   │   └── filter-node2.properties 
    │   ├── java 
    │   └── resources 
    │    ├── log4j.properties 
    │    └── another.xml 
    └── test 
     └── java 

कहाँ log4j.properties जगह धारकों और filter-nodeN.properties फ़ाइलों का उपयोग कर रहा है मान हैं।उदाहरण के लिए:

# filter-node1.properties 

log.location=D:/logs 
log.file.postfix=_1 

फिर, अपने pom.xml में, संसाधनों प्लगइन कॉन्फ़िगर और उपयोग करने के लिए एक विशिष्ट उत्पादन निर्देशिका और एक विशेष फिल्टर के साथ copy-resources कॉल करने के लिए एक <execution> प्रति नोड को परिभाषित:

<project> 
    ... 
    <build> 
    <resources> 
     <!-- this is for "normal" resources processing --> 
     <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering><!-- you might still want to filter them --> 
     <excludes> 
      <!-- we exclude the file from "normal" resource processing --> 
      <exclude>**/log4j.properties</exclude> 
     </excludes> 
     </resource> 
    </resources> 
    <plugins> 
     <plugin> 
     <artifactId>maven-resources-plugin</artifactId> 
     <version>2.4.3</version> 
     <executions> 
      <execution> 
      <id>copy-resources-node1</id> 
      <phase>process-resources</phase> 
      <goals> 
       <goal>copy-resources</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${basedir}/target/node1</outputDirectory> 
       <resources> 
       <resource> 
        <directory>src/main/resources</directory> 
        <filtering>true</filtering> 
        <includes> 
        <include>**/log4j.properties</include> 
        </includes> 
       </resource> 
       </resources> 
       <filters> 
       <filter>src/main/filters/filter-node1.properties</filter> 
       </filters> 
      </configuration> 
      </execution> 
      <execution> 
      <id>copy-resources-node2</id> 
      <phase>process-resources</phase> 
      <goals> 
       <goal>copy-resources</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${basedir}/target/node2</outputDirectory> 
       <resources> 
       <resource> 
        <directory>src/main/resources</directory> 
        <filtering>true</filtering> 
        <includes> 
        <include>**/log4j.properties</include> 
        </includes> 
       </resource> 
       </resources> 
       <filters> 
       <filter>src/main/filters/filter-node2.properties</filter> 
       </filters> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

चल mvn process-resources निम्नलिखित परिणाम उत्पन्न करेगा:

$ tree . 
. 
├── pom.xml 
├── src 
│   ├── main 
│   │   ├── filters 
│   │   │   ├── filter-node1.properties 
│   │   │   └── filter-node2.properties 
│   │   ├── java 
│   │   └── resources 
│   │    ├── log4j.properties 
│   │    └── another.xml 
│   └── test 
│    └── java 
└── target 
    ├── classes 
    │   └── another.xml 
    ├── node1 
    │   └── log4j.properties 
    └── node2 
     └── log4j.properties 

प्रत्येक 01 में उपयुक्त मानों के साथ।

$ cat target/node1/log4j.properties 
log4j.appender.Application.File=D:/logs/application_1.log 
log4j.appender.tx_info.File=D:/logs/tx_info_1.log 

इस थोड़े से काम करता है, लेकिन अत्यधिक शब्द है और यदि आप नोड्स के एक सभ्य राशि यह एक समस्या हो सकती है।


मैं अधिक संक्षिप्त कुछ लिख सकते हैं और Maven AntRun प्लगइन का उपयोग कर अनुरक्षणीय करने की कोशिश की, लेकिन मैं नहीं for कार्य ant-contrib से Maven के तहत काम करने के लिए (किसी अज्ञात कारण से हो सकता है, for कार्य मान्यता प्राप्त नहीं है) और मैंने छोड़ दिया।

यहां मैवेन एंटररन प्लगइन का उपयोग करने का एक विकल्प है। कुछ भी नहीं जटिल है, कोई पाश, मैं सिर्फ, किसी अन्य स्थान पर स्रोत फ़ाइल को कॉपी कर रहा हूँ मक्खी पर उसका नाम बदल रहा है और सामग्री को छानने: (टोकन के लिए डिलीमीटर के रूप में डिफ़ॉल्ट रूप से

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
     <execution> 
     <id>copy-resources-all-nodes</id> 
     <phase>process-resources</phase> 
     <configuration> 
      <tasks> 
      <copy file="src/main/resources/log4j.properties" toFile="target/antrun/log4j-node1.properties"> 
       <filterset> 
       <filter token="log.location" value="D:/logs"/> 
       <filter token="log.file.postfix" value="_1"/> 
       </filterset> 
      </copy> 
      <copy file="src/main/resources/log4j.properties" toFile="target/antrun/log4j-node2.properties"> 
       <filterset> 
       <filter token="log.location" value="D:/logs"/> 
       <filter token="log.file.postfix" value="_2"/> 
       </filterset> 
      </copy> 
      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

ध्यान दें कि चींटी का उपयोग करता @ नहीं कर सके ' (था के बाद से इन मूल्यों, आप प्रणाली के बजाय गुण का उपयोग कर विचार किया विशिष्ट नोड होने लगते हैं,

[email protected]@/[email protected]@.log 
[email protected]@/[email protected]@.log 

लेकिन: टी यह Maven शैली सीमांकक उपयोग करने के लिए) ताकि log4j.properties बन गया आप स्टार्टअप स्क्रिप्ट में रख सकते हैं)? यह कुछ ऐसा है जो मैंने पहले ही किया है (log4j.xml के साथ), यह अच्छी तरह से काम करता है और यह चीजों को अत्यधिक सरल बना देगा।

+0

पूर्ण उदाहरण के लिए धन्यवाद। यह वास्तव में बहुत verbose है - सौभाग्य से हमारे पास केवल 3 नोड्स हैं इसलिए इसे हाथ से बाहर _too_ नहीं मिलेगा ... btw क्या आप पूरी संपत्ति फ़ाइल के बजाय प्रति निष्पादन प्रोफ़ाइल को केवल एक संपत्ति को परिभाषित करने के किसी भी तरीके से जानते हैं? हमारे पास केवल एक ही संपत्ति है जो नोड्स में भिन्न होती है, इसलिए एक पूर्ण संपत्ति फ़ाइल ओवरकिल की तरह थोड़ा सा लगता है। –

+0

एकाधिक निष्पादन प्रोफाइल के बजाय सिस्टम गुणों का उपयोग करना निश्चित रूप से अधिक सुरुचिपूर्ण लगता है। मुझे लगता है कि आप log4j.xml में गुणों को हल करने के लिए जेबॉस पर झुका हुआ है, है ना? यह अभी हमारे लिए काम नहीं कर सकता है, क्योंकि हमारी log4j.properties बाहरी निर्देशिका में है, जेबॉस के माध्यम से लोड नहीं है। फिर भी हम जेबॉस के तहत हमारी कॉन्फ़िगरेशन माइग्रेट करने की योजना बना रहे हैं, इसलिए जब हम jboss-log4j.xml में हमारी Log4j कॉन्फ़िगरेशन माइग्रेट कर चुके हैं तो यह एकदम सही समाधान हो सकता है ... –

+0

@ पीटर: अफसोस की बात है, नहीं, मुझे नहीं पता कि ' प्रतिलिपि बनाने के लिए फ़ाइल का उपयोग किए बिना कॉपी-संसाधन '। उल्लिखित विवरणों के आधार पर, मैंने हालांकि एक एंट्रन कार्यान्वयन जोड़ा है। अभी भी कुछ डुप्लिकेशन है (यही कारण है कि मैं शुरुआत में 'लूप' का उपयोग करना चाहता था) लेकिन यह अभी भी संक्षिप्त है। निजी तौर पर, मैं इस उपयोग के मामले के लिए एंट्रून दृष्टिकोण पसंद करता हूं। सिस्टम गुणों के संबंध में, हाँ यह जेबॉस द्वारा प्रेरित कुछ है (जिसे मैंने सफलतापूर्वक एक बड़े वेबलॉग क्लस्टर पर उपयोग किया था)। मैंने सोचा कि यह इस विकल्प का उल्लेख करने लायक था। –

0

यदि बहुत से लक्ष्य कॉन्फ़िगरेशन की प्रतिलिपि बनाने की आवश्यकता है, तो आप एंटी मैक्रोडेफ़ के साथ मेवेन-एंट्रून-प्लगइन का उपयोग कर सकते हैं।

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
     <execution> 
     <id>copy-resources-all-nodes</id> 
     <phase>process-resources</phase> 
     <configuration> 
      <tasks> 
      <macrodef name="copyConfigFile"> 
       <attribute name="node"/> 

       <sequential> 
        <copy file="src/main/resources/log4j.properties" 
         toFile="target/antrun/[email protected]{node}.properties"> 
         <filterset> 
         <!-- put the node-specific config in property files node1.properties etc --> 
         <filtersfile file="config/@{node}.properties"/> 
         </filterset> 
        </copy> 
       </sequential> 
      </macrodef> 

      <copyConfigFile node="node1"/> 
      <copyConfigFile node="node2"/> 
      <copyConfigFile node="node3"/> 
      ... 

      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

तुम सच में लक्ष्य विन्यास का एक बहुत है, तो आप भी चींटी-योगदान लक्ष्य विन्यास की एक सूची से अधिक पुनरावृति करने के लिए इस्तेमाल कर सकते हैं।

इस here

3

कैसे करना है हालांकि यह थोड़ा पुराना है एक उदाहरण नहीं है, मैं हाल ही में धागा में आए और एक अद्यतन समाधान इटरेटर-Maven-प्लगइन का उपयोग कर का प्रस्ताव करना चाहते हैं। यहां एक सिंहावलोकन पाया गया है: http://khmarbaise.github.io/iterator-maven-plugin/

आप अपना लक्ष्य कैसे पूरा कर सकते हैं इसका एक विशिष्ट उदाहरण एक प्रतिलिपि प्लगइन और फ़िल्टर सक्षम के साथ इटरेटर प्लगइन को गठबंधन करना होगा। यदि आपके पास अन्य दृष्टिकोण हैं जो इस दृष्टिकोण के साथ अद्वितीय नोड हैं, तो फ़िल्टर में उपयोग करने के लिए आप कस्टम प्रॉपर्टी फ़ाइल भी जोड़ सकते हैं।

<plugin> 

    <groupId>com.soebes.maven.plugins</groupId> 
    <artifactId>iterator-maven-plugin</artifactId> 
    <version>0.3</version> 

    <executions> 
     <execution> 
      <id>configure-log-properties</id> 
      <phase>validate</phase> 
      <goals> 
       <goal>iterator</goal> 
      </goals> 
      <configuration> 
       <iteratorName>log.file.postfix</iteratorName> 
       <content>1,2,3,4,5</content> 
       <pluginExecutors> 

        <pluginExecutor> 
         <plugin> 
          <artifactId>maven-resources-plugin</artifactId> 
          <version>2.7</version> 
         </plugin> 

         <goal>copy-resources</goal> 

         <configuration> 
          <outputDirectory>${project.build.directory}/nodes/${log.file.postfix}</outputDirectory> 

          <resources> 
           <resource> 
            <directory>src/main/resources</directory> 
            <includes> 
             <include>log4j.properties</include> 
            </includes> 
            <filtering>true</filtering> 
           </resource> 
          </resources> 
         </configuration> 

        </pluginExecutor> 
       </pluginExecutors> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
संबंधित मुद्दे