Разбор журнала (текстового файла) с цветами в C#
Я создаю программу чтения журнала, которая будет Color Blind Friendly, которая будет анализировать файл журнала (текстовый файл) с цветом по умолчанию синий. Если строка содержит "ОШИБКА:", она должна установить оранжевый цвет. Звучит достаточно просто, но код, который я написал, похоже, не обнаруживает, что в строке содержится "ОШИБКА:". Вот мой код:
// 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 ОШИБКА: [сеть]: Ошибка подключения к: 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;
}
Однако это тоже не сработало..:(
Еще раз спасибо за мозговой штурм и за любую помощь в решении этой проблемы.
ОБНОВЛЕНИЕ ПОЛНЫЙ КОД, КАК СЛЕДУЕТ
Оригинал:
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 Object не так легко реализовать.
ОБНОВЛЕНИЕ: просто попытка использовать код Орла в новом проекте только для того, чтобы проверить его, потому что он делал то же самое, пытаясь внедрить его в мой, ничего не окрашивает. Это все черный текст.
using System;
using System.IO;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace TextTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
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;
}
private void Form1_Load(object sender, EventArgs e)
{
//string errorText1 = " ERROR: ";
int logLength = 1000;
var i1 = 0;
// From Bottom To Top
var lines1 = File.ReadAllLines(@"networkb.log").Reverse().Skip(1);
foreach (string line in lines1)
{
this.listBox1.Items.Add(line);
i1++;
if (i1 >= logLength) break;
}
}
}
}
1 ответ
Метод рисования по умолчанию не делает этого за вас, вам нужно сделать несколько настроек, чтобы он работал.
шаги:
- Пометьте свойство ListBox DrawMode как OwnerDrawFixed.
- Добавьте в ListBox новое событие DrawItem и дважды щелкните его (это создаст правильный метод события).
- Замените текущий сгенерированный код события следующим
Обработчик события 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;
}