2012-09-13 8 views
9

मैंने log4j.Logger का उपयोग किया और मैंने FileAppender का उपयोग कर फ़ाइल में लॉग मान लिखा है।स्ट्रिंग सरणी में लॉगजर मान कैसे प्राप्त करें

अब मैं टेक्स्टरेरा में लॉग मान दिखाना चाहता हूं। मैं स्ट्रिंग्स की सरणी में लॉगर मान कैसे असाइन कर सकता हूं?

+0

क्या आप चाहते शो करते हैं? स्टैकट्रैस? या त्रुटि संदेश? – Jaiwo99

+0

मैं स्तर दिखाना चाहता हूं। टीआरएसीई – praba

+2

मुझे प्रत्यक्ष तरीका नहीं दिख रहा है और यदि आप अपने आवेदन में दिखाना चाहते हैं, तो आप फ़ाइल को पढ़ सकते हैं और इसे वहां दिखा सकते हैं –

उत्तर

13

आप अपने Logger पर एक अतिरिक्त Appender जोड़ सकते हैं। एक WriterAppender का प्रयोग करें एक StringWriter लिखने के लिए तो आप StringWriter#toString()

उदाहरण संहिता के मूल्य के लिए अपनी TextArea की सामग्री को बदल:

public static void main(String[] args) { 
    Logger logger = Logger.getLogger("logger"); 
    Layout layout = new PatternLayout(); 
    StringWriter stringWriter = new StringWriter(); 
    WriterAppender writerAppender = new WriterAppender(layout, stringWriter); 
    logger.addAppender(writerAppender); 
    TextArea textArea = new TextArea(); 

    logger.error("test"); 
    //if(stringWriter changed){// compare to old TextArea-content? 
     textArea.setText(stringWriter.toString()); 
    //} 
    //System.out.println(stringWriter.toString()); 
    } 

आप एक स्मार्ट तरीका है अपने TextArea अद्यतन LogLevel पर निर्भर करता है खोजने की जरूरत है और अगर की सामग्री बदल गई है।

अद्यतन: एक तुलनात्मक समाधान here प्रस्तुत किया गया है।

+2

+1 अच्छा समाधान –

+0

स्ट्रिंगवाइटर खाली मान देता है। यह काम नहीं कर रहा है। कई सुझाव या समाधान – praba

+1

आपको हमें अपना कोड पेश करने की आवश्यकता है। मेरा उदाहरण ठीक काम कर रहा है। – Simulant

3

मैं एक कक्षा लिखूंगा जो org.apache.log4j.AppenderSkeleton और (जैसा कि एपीआई सुझाव देता है) append(org.apache.log4j.spi.LoggingEvent) विधि को ओवरराइड करता है। LoggingEvent के साथ आपको वह स्ट्रिंग बनाने के लिए आवश्यक जानकारी मिलती है जिसे आप दिखाना चाहते हैं। साथ ही आप उन स्ट्रिंग्स को सहेजने के लिए कहां नियंत्रित कर सकते हैं। आप उन्हें एक स्ट्रिंग सरणी में रखना चाहते थे - कोई समस्या नहीं। यदि आप केवल अंतिम एन लॉगिंग घटनाओं को याद रखना चाहते हैं, तो आप एक कतार का उपयोग कर सकते हैं।

यहाँ मेरी कोड (पारित कर एक साधारण परीक्षण):

import java.util.ArrayDeque; 
import java.util.Collection; 
import java.util.Collections; 

import org.apache.log4j.AppenderSkeleton; 
import org.apache.log4j.spi.LoggingEvent; 


public class StringArrayAppender extends AppenderSkeleton{ 

    private Collection<String> log; 

    private int size; 

    public StringArrayAppender(int size) { 
     this.log = new ArrayDeque<String>(size); 
     this.size = size; 
    } 

    public String[] getLog() { 
     return log.toArray(new String[0]); 
    } 

    @Override 
    protected void append(LoggingEvent event) { 
     // Generate message 
     StringBuilder sb = new StringBuilder(); 
     sb.append(event.getTimeStamp()).append(": "); 
     sb.append(event.getLevel().toString()).append(": "); 
     sb.append(event.getRenderedMessage().toString()); 
     // add it to queue 
     if(log.size() == size) { 
      ((ArrayDeque<String>) log).removeFirst(); 
     } 
     log.add(sb.toString()); 
    } 

    @Override 
    public void close() { 
     log = Collections.unmodifiableCollection(log); 
    } 

    @Override 
    public boolean requiresLayout() { 
     return false; 
    } 
} 
संबंधित मुद्दे