Я создаю читатель журнала, который будет 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: Просто пытаюсь использовать код Ореля в новом проекте, чтобы проверить его, потому что он делал то же самое, что пытался реализовать его в моем, ничего не окрашивает. Это черный текст.
Можете ли вы предоставить образец строки ошибки из файла? – Aaron
Это вы поставили точку останова в своем коде, так как это не происходит в блоке 'if' или идет в этот блок, но добавленный элемент не имеет правильного цвета, когда все будет сделано? Если он не входит в блок, возьмите значение 'line1' и опубликуйте его как [редактирование на свой вопрос] (http://stackoverflow.com/posts/35092115/edit). Также обновите теги вашего вопроса с помощью 'Winforms' или' WPF'. –
Возможно, из-за пробелов в '" ERROR: ";'? – andeart