2016-01-29 3 views
1

Я создаю читатель журнала, который будет Color Blind Friendly, который будет анализировать файл журнала (текстовый файл) с по умолчанию синим цветом. Когда строка содержит «ОШИБКА:», она должна установить цвет «Оранжевый». Звучит достаточно просто, но код, который я взломал, похоже, не обнаруживает, что строка содержит «ERROR:». Вот мой код:Разбор журнала (текстовый файл) с цветами в C#

 // Network Log 
     string errorText1 = " ERROR: "; 
     var i1 = 0; 
     // From Bottom To Top 
     var lines1 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\network.log").Reverse().Skip(1); 

     foreach (string line1 in lines1) 
     { 
      // Catch ERROR: And Color Orange Else Blue 
      if (line1.Contains(errorText1)) 
      { 
       listBox1.ForeColor = Color.FromArgb(230, 159, 0); 
       this.listBox1.Items.Add(line1); 
      } 
      else 
      { 
       listBox1.ForeColor = Color.FromArgb(0, 114, 178); 
       this.listBox1.Items.Add(line1); 
      } 
      i1++; 
      if (i1 >= logLength) break; 
     } 

Спасибо за любую помощь по этому вопросу ..

Пример строки лога с ошибкой:

I20160128: 051414 ERROR: [Сеть]: Ошибка подключения к: weather-station.org:24556

Орел Эраки повел меня по правильному пути, похоже, но я не уверен, почему он использовал класс или пространство имен для обработки строки для печати. В класс нечего было бы положить. Так что я попробовал последующие, так как это является частью Form_Load класса:.

 // Network Log 
     string errorText1 = " ERROR: "; 
     var i1 = 0; 
     // From Bottom To Top 
     var lines1 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\network.log").Reverse().Skip(1); 

     foreach (string line1 in lines1) 
     { 
      var color = Color.FromArgb(0, 114, 178); // Blue 
      if (line1.Contains(errorText1)) 
      { 
       color = Color.FromArgb(230, 159, 0); // Orange 
      } 
      this.listBox1.ForeColor = color; // Apply Color 
      this.listBox1.Items.Add(line1); 

      i1++; 
      if (i1 >= logLength) break; 
     } 

Однако это не получилось .. :(

Снова спасибо за мозговой атаки и за любую помощь, чтобы решить эту проблему

UPDATE ПОЛНЫЙ код следующим образом:

Оригинал:

using System; 
using System.IO; 
using System.Drawing; 
using System.Linq; 
using System.Windows.Forms; 

namespace WWIV5TelnetServer 
{ 
    public partial class LogForm : Form 
    { 
     public LogForm() 
     { 
      InitializeComponent(); 
     } 

     private void LogForm_Load(object sender, EventArgs e) 
     { 
      // Default Number Of Lines Per Log 
      int logLength = Int32.Parse(logLines.Text); 

      // Network Log 
      string errorText1 = " ERROR: "; 
      var i1 = 0; 
      // From Bottom To Top 
      var lines1 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\network.log").Reverse().Skip(1); 

      foreach (string line1 in lines1) 
      { 
       // Catch ERROR: And Color Orange Else Blue 
       if (line1.Contains(errorText1)) 
       { 
        listBox1.ForeColor = Color.FromArgb(230, 159, 0); 
        this.listBox1.Items.Add(line1); 
       } 
       else 
       { 
        listBox1.ForeColor = Color.FromArgb(0, 114, 178); 
        this.listBox1.Items.Add(line1); 
       } 
       i1++; 
       if (i1 >= logLength) break; 
      } 

      // Networkb Log 
      string errorText2 = " ERROR: "; 
      var i2 = 0; 
      // From Bottom To Top 
      var lines2 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\networkb.log").Reverse().Skip(1); 

      foreach (string line2 in lines2) 
      { 
       this.listBox2.Items.Add(line2); 
       i1++; 
       if (i2 >= logLength) break; 
      } 

      foreach (string line2 in lines2) 
      { 
       // Catch ERROR: And Color Orange Else Blue 
       if (line2.Contains(errorText2)) 
       { 
        listBox2.ForeColor = Color.FromArgb(230, 159, 0); 
        this.listBox2.Items.Add(line2); 
       } 
       else 
       { 
        listBox2.ForeColor = Color.FromArgb(0, 114, 178); 
        this.listBox2.Items.Add(line2); 
       } 
       i2++; 
       if (i2 >= logLength) break; 
      } 

      // Net.log 
      string errorText3 = " ERROR: "; 
      var i3 = 0; 
      // From Bottom To Top 
      var lines3 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\gfiles\NET.LOG"); 

      foreach (string line3 in lines3) 
      { 
       // Default Color Blue 
       listBox3.ForeColor = Color.FromArgb(0, 114, 178); 

       // Catch ERROR: And Color Orange Else Blue 
       if (line3.Contains(errorText3)) 
       { 
        listBox3.ForeColor = Color.FromArgb(230, 159, 0); 
       } 
       this.listBox3.Items.Add(line3); 
       i3++; 
       if (i3 >= logLength) break; 
      } 

      // Change Log 
      var lines4 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\changelog.txt"); 

      foreach (string line4 in lines4) 
      { 
       // Default Color Black 
       listBox4.ForeColor = Color.Black; 

       this.listBox4.Items.Add(line4); 
      } 

      // What's New 
      var lines5 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\whatsnew.txt"); 

      foreach (string line5 in lines5) 
      { 
       // Default Color Black 
       listBox5.ForeColor = Color.Black; 

       this.listBox5.Items.Add(line5); 
      } 
     } 

     private void exitButton_Click(object sender, EventArgs e) 
     { 
      Close(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Refresh(); 
     } 
    } 
} 

Концепция Орла, который без сомнения, моя вина не показывая весь .cs:

using System; 
using System.IO; 
using System.Drawing; 
using System.Linq; 
using System.Windows.Forms; 

namespace WWIV5TelnetServer 
{ 
    public partial class LogForm : Form 
    { 
     public LogForm() 
     { 
      InitializeComponent(); 
     } 

     private Brush GetMessageBrush(string message) 
     { 
      var brush = Brushes.Green; // Default 
      if (message.Contains("ERROR:")) 
      { 
       brush = Brushes.Red; 
      } 
      return brush; 
     } 

     private void listBox2_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      if (e.Index > -1) 
      { 
       string item = listBox2.Items[e.Index].ToString(); 
       if (item != null) 
       { 
        var brush = GetMessageBrush(item); 
        e.Graphics.DrawString(item, e.Font, brush, e.Bounds.X, e.Bounds.Y, StringFormat.GenericDefault); 
       } 
       e.DrawFocusRectangle(); 
      } 
     } 

     private void LogForm_Load(object sender, EventArgs e) 
     { 
      // Default Number Of Lines Per Log 
      int logLength = Int32.Parse(logLines.Text); 

      // Network Log 
      string errorText1 = " ERROR: "; 
      var i1 = 0; 
      // From Bottom To Top 
      var lines1 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\network.log").Reverse().Skip(1); 

      foreach (string line1 in lines1) 
      { 
       // Catch ERROR: And Color Orange Else Blue 
       if (line1.Contains(errorText1)) 
       { 
        listBox1.ForeColor = Color.FromArgb(230, 159, 0); 
        this.listBox1.Items.Add(line1); 
       } 
       else 
       { 
        listBox1.ForeColor = Color.FromArgb(0, 114, 178); 
        this.listBox1.Items.Add(line1); 
       } 
       i1++; 
       if (i1 >= logLength) break; 
      } 

      // Networkb Log 
      //string errorText2 = " ERROR: "; 
      var i2 = 0; 
      // From Bottom To Top 
      var lines2 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\networkb.log").Reverse().Skip(1); 

      foreach (string line2 in lines2) 
      { 
       this.listBox2.Items.Add(line2); 
       i1++; 
       if (i2 >= logLength) break; 
      } 
      /*foreach (string line2 in lines2) 
      { 
       var color = Color.FromArgb(0, 114, 178); 
       if (line2.Contains(errorText2)) 
       { 
        color = Color.FromArgb(230, 159, 0); 
       } 
       this.listBox2.ForeColor = color; 
       this.listBox2.Items.Add(line2); 

       i2++; 
       if (i2 >= logLength) break; 
      } 
      foreach (string line2 in lines2) 
      { 
       // Catch ERROR: And Color Orange Else Blue 
       if (line2.Contains(errorText2)) 
       { 
        listBox2.ForeColor = Color.FromArgb(230, 159, 0); 
        this.listBox2.Items.Add(line2); 
       } 
       else 
       { 
        listBox2.ForeColor = Color.FromArgb(0, 114, 178); 
        this.listBox2.Items.Add(line2); 
       } 
       i2++; 
       if (i2 >= logLength) break; 
      }*/ 

      // Net.log 
      string errorText3 = " ERROR: "; 
      var i3 = 0; 
      // From Bottom To Top 
      var lines3 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\gfiles\NET.LOG"); 

      foreach (string line3 in lines3) 
      { 
       // Default Color Blue 
       listBox3.ForeColor = Color.FromArgb(0, 114, 178); 

       // Catch ERROR: And Color Orange Else Blue 
       if (line3.Contains(errorText3)) 
       { 
        listBox3.ForeColor = Color.FromArgb(230, 159, 0); 
       } 
       this.listBox3.Items.Add(line3); 
       i3++; 
       if (i3 >= logLength) break; 
      } 

      // Change Log 
      var lines4 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\changelog.txt"); 

      foreach (string line4 in lines4) 
      { 
       // Default Color Black 
       listBox4.ForeColor = Color.Black; 

       this.listBox4.Items.Add(line4); 
      } 

      // What's New 
      var lines5 = File.ReadAllLines(Properties.Settings.Default.homeDirectory + @"\whatsnew.txt"); 

      foreach (string line5 in lines5) 
      { 
       // Default Color Black 
       listBox5.ForeColor = Color.Black; 

       this.listBox5.Items.Add(line5); 
      } 
     } 

     private void exitButton_Click(object sender, EventArgs e) 
     { 
      Close(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Refresh(); 
     } 
    } 
} 

ПРИМЕЧАНИЕ: Как вы можете видеть в оригинале, я попробовал отдельный случай для обработки кодирования цвета. Позволяет просто придерживаться одного журнала, чтобы затем реализовать его во всех журналах, которым требуется цветовая кодировка. (т.е. listBox1)

Надеюсь, что это поможет очистить беспорядок. Жаль, что объект Draw не проще реализовать.

UPDATE: Просто пытаюсь использовать код Ореля в новом проекте, чтобы проверить его, потому что он делал то же самое, что пытался реализовать его в моем, ничего не окрашивает. Это черный текст.

+1

Можете ли вы предоставить образец строки ошибки из файла? – Aaron

+0

Это вы поставили точку останова в своем коде, так как это не происходит в блоке 'if' или идет в этот блок, но добавленный элемент не имеет правильного цвета, когда все будет сделано? Если он не входит в блок, возьмите значение 'line1' и опубликуйте его как [редактирование на свой вопрос] (http://stackoverflow.com/posts/35092115/edit). Также обновите теги вашего вопроса с помощью 'Winforms' или' WPF'. –

+0

Возможно, из-за пробелов в '" ERROR: ";'? – andeart

ответ

4

Метод нитрида по умолчанию не делает этого для вас, вам нужно будет сделать небольшую корректировку, чтобы заставить его работать.

Шаги:

  1. Всех ваш ListBox DrawMode собственности как OwnerDrawFixed.
  2. Добавить в списокBox новое событие DrawItem и дважды щелкнуть по нему (он будет генерировать правильный метод события.
  3. Заменить текущее событие генерируется код, со следующим

DrawItem обработчик события

private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    if (e.Index > -1) 
    { 
     string item = listBox1.Items[e.Index].ToString(); 
     if (item != null) 
     { 
      var brush = GetMessageBrush(item); 
      e.Graphics.DrawString(item, e.Font, brush, e.Bounds.X, e.Bounds.Y, StringFormat.GenericDefault); 
     } 
     e.DrawFocusRectangle(); 
    } 
} 

Также добавьте следующий метод и обычаи его, как вы хотите:

private Brush GetMessageBrush(string message) 
{ 
    var brush = Brushes.Green; // Default 
    if (message.Contains("ERROR")) 
    { 
     brush = Brushes.Red; 
    } 
    return brush; 
} 

Теперь вашему новому добавочному коду не нужно обрабатывать элементы чертежа

foreach (string line in lines1) 
{ 
    this.listBox1.Items.Add(line); 
    i1++; 
    if (i1 >= logLength) break; 
} 
+0

Заметьте 'this.listBox1.Items [i] .ForeColor' будет работать только для WPF, он не будет работать для Winforms, потому что коллекция' Items' в версии winforms не является строго типизированной коллекцией. –

+0

Также обратите внимание, что вам не нужно добавлять 'i'. 'i1' уже использовался как счетчик, вы могли бы просто сказать' this.listBox1.Items [i1] .ForeColor = color; ' –

+0

@ScottChamberlain, Yup, он не упомянул, должен ли я добавить версию Winform? –