Разбор журнала (текстового файла) с цветами в 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 ответ

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

шаги:

  1. Пометьте свойство ListBox DrawMode как OwnerDrawFixed.
  2. Добавьте в ListBox новое событие 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;
}
Другие вопросы по тегам