मैं लॉगबैक के साथ काम करता हूं और मेरे पास कई लॉगर हैं। मैंने एक कस्टम एपेंडर बनाया है:

public class LogListenerAppender extends AppenderBase<ILoggingEvent> {

    private List<LogListener> listeners;

    public LogListenerAppender() {
        listeners = new ArrayList<>();
    }

    public void addListener(LogListener listener){
        listeners.add(listener);
        System.out.println("Current listener: " + listeners.size());
    }

    /**
     * Send the LogEvent to all Listeners
     * @param eventObject the LogEventObject
     */
    @Override
    protected void append(ILoggingEvent eventObject) {
        for(LogListener listener : listeners){
            listener.receiveLogMessage(eventObject);
        }
    }
}

यह एपेंडर लॉग संदेशों को पकड़ने के लिए श्रोताओं को लॉगर में जोड़ना है।

अब मेरी logback.xml फ़ाइल में, मैंने एपेंडर को लिस्टनर के रूप में बनाया है

<!--Custom Listener Appender-->
<appender name="LISTENER" class="path.to.LogListenerAppender"/>

और कुछ लकड़हारा:

<logger name="TestLogger">
    <appender-ref ref="LISTENER" />
</logger>

<logger name="MainLogger">
    <appender-ref ref="LISTENER" />
</logger>

कोड में मैं लॉगलिस्टर को लॉगर में जोड़ता हूं:

public static void main(String[] args){
    Logger testLogger = LoggerFactory.getLogger("TestLogger");
    Logger mainLogger = LoggerFactory.getLogger("MainLogger");

    addListenerToLogger(testLogger, new LogListener(Level.TRACE) {
        @Override
        public void log(String message, long timestamp) {
            System.out.println("TEST LOG: " + message);
        }
    });
    addListenerToLogger(mainLogger, new LogListener(Level.TRACE) {
        @Override
        public void log(String message, long timestamp) {
            System.out.println("MAIN LOG: " + message);
        }
    });
    testLogger.info("Hello");
}

private static void addListenerToLogger(Logger logger, LogListener loglistener){
    ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) logger;
    LogListenerAppender appender = (LogListenerAppender)log.getAppender("LISTENER");
    appender.addListener(loglistener);
}

वांछित आउटपुट है:

टेस्ट लॉग: नमस्कार

लेकिन आउटपुट है:

परीक्षण लॉग: नमस्कार
मुख्य लॉग: नमस्कार

और System.out.println("Current listener: " + listeners.size()); LogListenerAppender 2 प्रिंट करता है।

मेरी समस्या अब यह है कि लॉगबैक सभी लॉगर के लिए LogListenerAppender के समान उदाहरण का उपयोग करता है जो <appender-ref ref="LISTENER"/> का उपयोग करता है।

लेकिन मुझे प्रत्येक लॉगर के लिए एक नया LogListenerAppender चाहिए। मैं लॉगबैक को कैसे कॉन्फ़िगर कर सकता हूं कि वह हर बार एक नया इंस्टेंस बनाता है?

मेरा विचार प्रत्येक लॉगर के लिए एपेंडर बनाना है जैसे:

<appender name="LISTENER1" class="path.to.LogListenerAppender"/>
<appender name="LISTENER2" class="path.to.LogListenerAppender"/>
//etc...
<logger name="TestLogger">
    <appender-ref ref="LISTENER1" />
</logger>

<logger name="MainLogger">
    <appender-ref ref="LISTENER2" />
</logger>
//etc...

लेकिन मुझे आशा है कि यह एक आसान तरीका मौजूद है

0
Morchul 19 फरवरी 2019, 13:41

1 उत्तर

सबसे बढ़िया उत्तर

आप यहां देख सकते हैं कि यह आपके कोड में क्यों हो रहा है:

LogListenerAppender एपेंडर = (LogListenerAppender)log.getAppender("LISTENER");

आपके कोड को "LISTENER" संदर्भ के साथ टैग की गई मेमोरी में आपके द्वारा बनाए गए किसी भी एपेंडर को बस मिलता है। श्रोताओं की उस सूची में सब कुछ श्रोता के साथ टैग किए गए एपेंडर से किसी भी घटना को सुनेगा।

शायद अपने ऐड श्रोता विधि में एक स्ट्रिंग जोड़ने का प्रयास करें जैसे:

private static void addListenerToLogger(Logger logger, LogListener loglistener, String appenderRef){
    ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) logger;
    LogListenerAppender appender = (LogListenerAppender)log.getAppender(appenderRef);
    appender.addListener(loglistener);
}

इस तरह आप उपयुक्त एपेंडर रेफरी (यानी "LISTENER1") को उपयुक्त एपेंडर को पुनः प्राप्त करने की विधि में पास कर सकते हैं।

उपयुक्त रेफरी को भी चुनना सार्थक होगा अर्थात;

<logger name="TestLogger">
    <appender-ref ref="TEST" />
</logger>

<logger name="MainLogger">
    <appender-ref ref="MAIN" />
</logger>

पठनीयता और रखरखाव के लिए, लेकिन यह एक तकनीकी निर्णय से अधिक शैली पसंद है

0
Roderick Lenz 19 फरवरी 2019, 14:05