【问题标题】:Parsing a Log (text file) with colors in C#在 C# 中使用颜色解析日志(文本文件)
【发布时间】:2016-05-07 15:16:34
【问题描述】:

我正在创建一个对色盲友好的日志阅读器,它将解析默认颜色为蓝色的日志文件(文本文件)。当一行包含“错误:”时,它应该将颜色设置为橙色。听起来很简单,但我编写的代码似乎没有检测到该行包含“错误:”。这是我的代码:

        // 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 时出错

Orel Eraki 让我走上了正确的道路,但我不确定他为什么使用类或命名空间来处理要打印的行。类中将没有任何内容。所以我尝试了以下操作,因为这是 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();
        }
    }
}

Orel 的概念,这无疑是我没有显示整个 .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 并不容易实现。

更新:只是试图在一个新项目中使用 Orel 的代码只是为了测试它,因为它在尝试将它实现到我的项目中时所做的相同,不会给任何东西着色。都是黑字。

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;
            }
        }
    }
}

【问题讨论】:

  • 您能否提供文件中的示例错误行?
  • 如果你在你的代码中放置了一个断点,它是没有进入if块,还是进入了那个块,但是当一切正常时,添加的项目没有正确的颜色完毕?如果它没有进入区块,请获取line1 的值并将其发布为a edit to your question 也请使用WinformsWPF 更新您的问题标签。
  • 可能是因为" ERROR: ";中的空格?
  • 是的,它是一个 winform,我按照您的要求进行了更新..
  • 还没有完全解决..

标签: c# winforms visual-studio file.readalllines


【解决方案1】:

默认绘制方法不会为您执行此操作,您需要进行一些调整才能使其正常工作。

步骤:

  1. 将您的 ListBox DrawMode 属性标记为 OwnerDrawFixed
  2. 将新的DrawItem事件添加到ListBox并双击它(它将生成正确的事件方法。
  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;
}

【讨论】:

  • 注意this.listBox1.Items[i].ForeColor 仅适用于 WPF,不适用于 Winforms,因为 winforms 版本上的 Items 集合不是强类型集合。
  • 另请注意,您不需要添加ii1 已经被用作计数器,你可以直接说this.listBox1.Items[i1].ForeColor = color;
  • @ScottChamberlain,是的,他没有提到,我应该添加一个 Winform 版本吗?
  • @Sylverac,是的,后来注意到了,修复了。
  • 你真的不应该使用i1,代码只有在循环开始时i1匹配listBox1.Items.Count时才有效。正确的做法是使用Add 返回的int (i1 = this.listBox1.Items.Add(line1)) 然后去掉i1++
猜你喜欢
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 2012-10-17
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多