2013-08-08 5 views
6

मेरा एक प्रोजेक्ट ईएआर फ़ाइल के रूप में पैक किया जाता है जिसमें एसएलएफ 4 जे एपीआई (1.7.5) के साथ-साथ लॉगबैक लाइब्रेरी इसके कार्यान्वयन (logback-core 1.0.13 और logback-classic 1.0.13) के रूप में पैक किया जाता है।SLF4J - बाइंडिंग्स को उसी एप्लिकेशन सर्वर पर अन्य अनुप्रयोगों द्वारा अधिलेखित किया जाता है

जब मैं (प्रोजेक्ट) अपनी परियोजना को तैनात करता हूं SLF4J के लॉगरफ़ैक्ट्री को संभावित बाध्यकारी के रूप में लॉगबैक मिल जाता है और सही लॉगर (यानी लॉगबैक) का उपयोग किया जाता है।

अब मेरे पास एक संसाधन कनेक्टर (activemq-rar-5.8.0.rar) है जो मेरी अपनी ईएआर फ़ाइल से पहले तैनात है (क्योंकि ईएआर फाइलों को आरएआर की आवश्यकता होती है)। दुर्भाग्य से इस आरएआर में अपना स्वयं का एसएलएफ 4 जे कार्यान्वयन है (slf4j-api-1.6.6.jarslf4j-log4j12-1.6.6.jarlog4j-1.2.17.jar)। आरएआर फाइलें log4j कार्यान्वयन का उपयोग करती हैं।

जब मैं अपनी ईएआर फ़ाइल को तैनात करता हूं तो मेरे एप्लिकेशन के कोड के अंदर लॉगरफ़ैक्टरी अचानक लॉग 4j कार्यान्वयन (org.slf4j.impl.Log4jLoggerAdapter) का उपयोग करता है - भले ही मुझे क्लासपाथ को आरएआर से अलग किया जाए।

यह मामला प्रतीत नहीं होता है - तो मैं गलत क्या कर रहा हूं (आरएआर लॉग 4j का उपयोग करना चाहिए, मेरे ईएआर को लॉगबैक का उपयोग करना चाहिए)?


अद्यतन 1: It doesn't look as if I am alone, लेकिन दुर्भाग्य से एक जवाब याद आ रही है ..


अद्यतन 2:

this तालिका के अनुसार, ग्लासफिश से पहले कनेक्टर मॉड्यूल को लोड करता है ईएआर/युद्ध libs (जो लोड करने के लिए अंतिम libs हैं)।


अद्यतन 3:

मैं "बाइंडिंग" ठीक करने में कामयाब रहे: यदि मैं slf4j-api-1.7.5.jar और logback कार्यान्वयन (logback-core-1.0.13.jar और logback-classic-1.0.13.jar), logback उपयोग किया जाएगा डाल ग्लासफिश में domains/<myDomain>/lib फ़ोल्डर के अंदर लॉगिंग कार्यान्वयन के रूप में (अपडेट 2 देखें - "सामान्य क्लासलोडर" "कनेक्टर क्लासलोडर" से पहले आता है)।

दुर्भाग्यवश मेरी कॉन्फ़िगरेशन फ़ाइलें अब WAR/EAR के अंदर नहीं हैं - जिसे बाद में एक अलग क्लासलोडर ("आर्काइव क्लासलोडर") द्वारा लोड किया जाएगा।

तो यह वास्तव में मेरे लिए एक समाधान नहीं है क्योंकि मैं लॉगबैक कॉन्फ़िगरेशन फ़ाइलों को ईएआर/डब्ल्यूएआर के अंदर रखना चाहता हूं (क्योंकि प्रत्येक एप्लिकेशन एक अलग कॉन्फ़िगरेशन का उपयोग करता है)।


तरह का संबंध

stupidSheep

+0

पैकेज निर्भरता में log4j क्यों? कंटेनर लॉगिंग कॉन्फ़िगरेशन की देखभाल नहीं कर सकता है और इम्प्लायर प्रदान कर सकता है? – roby

+0

मैं लॉग 4j को अपने आप पर निर्भरता के रूप में पैक नहीं करता हूं। यह अपाचे ActiveMQ (http://activemq.apache.org/maven/5.8.0/activemq-rar/dependencies.html) द्वारा सिद्ध आरएआर (संसाधन एडाप्टर) में है। ये जेएआर फाइल कुछ लॉग कॉन्फ़िगरेशन फ़ाइलों के साथ आरएआर के अंदर हैं। – stupidSheep

उत्तर

1

मैं अंत में एक स्वीकार्य समाधान पता लगा।

ग्लासफ़िश ईएआर/वार से पहले कनेक्टर मॉड्यूल लोड करता है, "अपडेट 2" देखें। एसएलएफ 4 जे कार्यान्वयन प्रदान करके कनेक्टर मॉड्यूल लोड होने से पहले, मेरे प्रदत्त एसएलएफ 4 जे कार्यान्वयन का उपयोग किया जाता है।

ऐसा करने के लिए मैंने निम्नलिखित JARS को निर्देशिका domains/<myDomain>/lib पर कॉपी किया है (देखें "अपडेट 3")।

  • logback-core-1.0.13.jar
  • logback-classic-1.0.13.jar
  • slf4j-api-1.7.5.jar

दुर्भाग्य logback के रूप में मैं पैक, अपने स्वयं के विन्यास फाइल (logback.xml) अब और है, जो classpath पर होना चाहिए (जो यह है भी नहीं मिला यह एक जार के अंदर)।

समाधान लॉगबैक को मैन्युअल रूप से कॉन्फ़िगर करना है। मैंने निम्नलिखित सीडीआई निर्माता का उपयोग करके ऐसा किया है:

package com.example; 

import ch.qos.logback.classic.LoggerContext; 
import ch.qos.logback.classic.joran.JoranConfigurator; 
import ch.qos.logback.core.joran.spi.JoranException; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import javax.annotation.PostConstruct; 
import javax.enterprise.context.ApplicationScoped; 
import javax.enterprise.inject.Produces; 
import javax.enterprise.inject.spi.InjectionPoint; 

@ApplicationScoped 
public class LoggerProducer { 
    @PostConstruct 
    public void initialize() { 
     // The following is logback specific. Unfortunately logback doesn't find its XML configuration 
     // as the logback implementation gets loaded by a different ClassLoader than this code. 
     // See http://docs.oracle.com/cd/E19226-01/820-7695/6niugesfp/index.html#indexterm-28 
     LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
     JoranConfigurator joranConfigurator = new JoranConfigurator(); 
     joranConfigurator.setContext(lc); 
     lc.reset(); 

     try { 
      // The logback configuration is now being loaded from the classpath (by the "Archive Classloader") 
      joranConfigurator.doConfigure(this.getClass().getClassLoader().getResource("logback.xml")); 
     } catch (JoranException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Produces 
    @ApplicationLogger 
    Logger createLogger(InjectionPoint injectionPoint) { 
     return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass()); 
    } 
} 

यह लॉगबैक कॉन्फ़िगर करेगा। कृपया ध्यान दें कि मैंने ऐसा करने के लिए लॉगबैक विशिष्ट कोड का उपयोग किया है, इसलिए यदि आप SLF4J कार्यान्वयन को बदलते हैं तो आपको LoggerProducer भी बदलना होगा।

मुझे लगता है कि लॉगबैक को इसकी कॉन्फ़िगरेशन फ़ाइल नहीं मिलती है क्योंकि "सामान्य क्लासलोडर" के पास इसके क्लासपाथ पर ईएआर/डब्ल्यूआर नहीं है। लेकिन बाद में, जब एप्लिकेशन लोड हो जाता है, तो "आर्काइव क्लासलोडर" में logback.xml है जो इसके क्लासपाथ पर है (जैसा कि यह ईएआर/डब्ल्यूएआर फ़ाइल द्वारा प्रदान किया गया है), इसलिए सबकुछ ठीक होने पर लॉगबैक को कॉन्फ़िगर करना संभव है।

भले ही बेवकूफ

+0

यह पता चला है कि यह काम नहीं करता है। लोड होने वाला अंतिम एप्लिकेशन लॉगर कॉन्फ़िगरेशन को ओवरराइड करेगा। – stupidSheep

+0

पूरी तरह से तैयार की गई नौकरी। – Sam

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