2016-05-06 5 views
1

Problem:eine Log-Datei neu anordnen, basierend auf Schlüsselwörter

ich regelmäßig mit großen Log-Dateien arbeiten, und ich möchte einige relevante Daten organisieren, die zusammen sporadisch über die Datei geschrieben werden ist, um möglicherweise Probleme leichter zu verfolgen.

Beispiel von Daten in die Protokolldatei geschrieben:

1. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
2. 2016-05-05 15:07:54,993 DEBUG (default task-16) ==> More stuff written on this line. 
3. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 
4. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
5. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
6. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
7. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
8. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 
9. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
10. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
11. 2016-05-05 15:07:54,993 DEBUG (default task-6) ==> More stuff written on this line. 
12. 2016-05-05 15:07:54,993 DEBUG (default task-3) ==> More stuff written on this line. 
13. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 
14. 2016-05-05 15:07:54,993 DEBUG (default task-14) ==> More stuff written on this line. 
15. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 

Ich habe natürlich für die Gruppierung im Zusammenhang Linien zusammen zu verwenden (default aufgaben- NUMBER) als meine Kennung gewählt.

Ich habe meine UI gebaut und die Idee ist, würde ich einen Extrakt aus der Quellprotokolldatei greifen und dann diese in eine jTextArea innerhalb meiner Java-Anwendung einfügen, klicken Sie auf eine Schaltfläche und mag alle zugehörigen Aufgabennummern mag NUMBER) werden zusammen gruppiert. (Zuerst eine einfache println der gruppierten Daten zu meiner IDE dieser Daten wäre natürlich perfekt)

Ich arbeite derzeit an der Methode, die den gesamten Text in die jTextArea eingefügt und durch sie funktioniert, erstellte Zeichenfolge Array, dass ich später erweitern können eine beliebige Anzahl von Aufgaben Zahlen zu finden, die zur Zeit hebt es alle Zahlen es findet, (nicht sicher, ob ich auf dem richtigen Weg bin aber):

import java.awt.Color; 
import javax.swing.JTextArea; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.Document; 

public class ArrangeLogic { 

    public void groupLogFile(JTextArea theLogs) { 

     String[] myStringArray = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35"}; 

     for (int i = 0; i < myStringArray.length - 1; i++) { 

      String element = myStringArray[i]; 
      String nextElement = myStringArray[i + 1]; 

      String defaultTaskOdd = ("(default task-" + element + ")"); 
      String defaultTaskEven = ("(default task-" + nextElement + ")"); 
      System.out.println(defaultTaskOdd); 
      System.out.println(defaultTaskEven); 

      try { 
       Document document = theLogs.getDocument(); 

       for (int index = 0; index + defaultTaskOdd.length() < document.getLength(); index++) { 
        String match = document.getText(index, defaultTaskOdd.length()); 

        if (defaultTaskOdd.equals(match)) { 

         javax.swing.text.DefaultHighlighter.DefaultHighlightPainter highlightPainter 
           = new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW); 
         theLogs.getHighlighter().addHighlight(index, index + defaultTaskOdd.length(), 
           highlightPainter); 

        } 
       } 

       for (int index = 0; index + defaultTaskEven.length() < document.getLength(); index++) { 
        String match = document.getText(index, defaultTaskEven.length()); 

        if (defaultTaskEven.equals(match)) { 

         javax.swing.text.DefaultHighlighter.DefaultHighlightPainter highlightPainter 
           = new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW); 
         theLogs.getHighlighter().addHighlight(index, index + defaultTaskEven.length(), 
           highlightPainter); 

        } 
       } 

      } catch (BadLocationException ex) { 
      } 

     } 

    } 
} 

ich um mit mehreren gespielt haben Ideen für den ganzen Tag (ja, ich bin ein sehr Neuling Entwickler), wie Sie alle Linien durchlaufen und gruppieren sie zusammen, ohne Glück, so dass ich dachte, ich würde um einen Rat bitten. Jede Hilfe oder Vorschläge würde sehr geschätzt werden. Vielen Dank.

(EDIT)

Erwartete Ausgabe (Zeilennummern sind nicht wichtig):

1. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
5. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
10. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
15. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 

2. 2016-05-05 15:07:54,993 DEBUG (default task-16) ==> More stuff written on this line. 

3. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 
8. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 
13. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 

4. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
6. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
7. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
9. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 

11. 2016-05-05 15:07:54,993 DEBUG (default task-6) ==> More stuff written on this line. 

12. 2016-05-05 15:07:54,993 DEBUG (default task-3) ==> More stuff written on this line. 

14. 2016-05-05 15:07:54,993 DEBUG (default task-14) ==> More stuff written on this line. 
+0

So möchten Sie die Liste der Standard-Task-Nummern bekommen? – Cukic0d

+0

Ich brauche die gesamte Zeile, ich werde das zu meinem ursprünglichen Beitrag hinzufügen, danke! – BernardV

+0

Sorry, ich bin mir nicht sicher, ob ich es verstanden habe ... Sie müssen die gesamte Zeile abhängig von der Standard-Aufgabennummer abrufen? – Cukic0d

Antwort

1

Nun, Sie tun es nicht den guten Weg.

Anstatt eine Schleife innerhalb einer Schleife zu verwenden, die langsam ist, sollten Sie definitiv eine Regex verwenden. Dann empfehlen i Sie einen Scanner zu verwenden, jede Zeile einzeln zu bekommen ...

Hier ist ein Arbeitscode explanated, wie ich das Problem gelöst, können Sie für sich selbst hinzufügen, die Hervorhebung Sache ...

public static void groupLogFile(JTextArea theLogs) { 
    //This is used to get each line one by one 
    Scanner sc = new Scanner(theLogs.getText()); 

    //We are using a HashMap to store the lines in function of the task numbers 
    HashMap<Integer, List<String>> map = new HashMap<Integer, List<String>>(); 

    //We are now reading each line one by one 
    while (sc.hasNextLine()) { 
     String line = sc.nextLine(); 
     //With this regex we get at group 2 the task number 
     Pattern pattern = Pattern.compile("(\\(default task-(\\d+)\\))"); 
     Matcher matcher = pattern.matcher(line); 
     if (matcher.find()) { 
      //Task number 
      int task_number = Integer.parseInt(matcher.group(2)); 
      //We get other lines with same task number (if exist) 
      List<String> get; 
      if(map.containsKey(task_number)){ 
       get = map.get(task_number); 
      } else { 
       get = new LinkedList<String>(); 
      } 
      get.add(line); 
      //We update the list 
      map.put(task_number, get); 
     } 
    } 
    sc.close(); 

    //Ordering the map by task number 
    Comparator<Integer> comparator = new Comparator<Integer>() { 
      public int compare(Integer o1, Integer o2) { 
       return o1.compareTo(o2); 
      } 
    }; 
    TreeMap<Integer, List<String>> ordered = new TreeMap<Integer, List<String>>(comparator); 
    ordered.putAll(map); 

    //Print results 
    for(Entry<Integer, List<String>> e : ordered.entrySet()){ 
     for(String s : e.getValue()) 
      System.out.println(s); 
    } 
} 
+0

Vielen Dank für Ihre Hilfe zu diesem Thema, ich werde versuchen, um zu diesem Problem so schnell wie möglich zurück, und melden Sie sich zurück, wenn ich es richtig mache. – BernardV

+0

Aus irgendeinem Grunde ist mein IDE nicht glücklich mit: 'HashMap > Karte = new HashMap >();' – BernardV

+0

* EDIT * leider fixiert war ich Import falsch :) Java. awt.List anstelle von java.util.List – BernardV

0

Vielleicht können Sie für default task-x überprüfen und die x erhalten, analysieren sie in eine int und fügen die Linie zu myStringArray[x-1] = myStringArray[x-1] + "\n" + theLine; und entfernen Sie dann die erste Zeile aus der Zeichenfolge.

0

Danke für die Hilfe auf die Antwort Cukic0d! Für den Fall, will jeder sehen, wie die Ergebnisse der JTextArea statt println drucken:

//Clear theLogs (what was pasted into the UI)  
     theLogs.setText(""); 

//Print results   
     ordered.entrySet().stream().forEach((e) -> { 
      e.getValue().stream().map((s) -> { 
      //System.out.println(s); 
       return s; 
      }).forEach((s) -> { 
       theLogs.append(s+"\n"); 
      }); 
     }); 
Verwandte Themen