Kevin A. Boucher

The Art of .Net

  Home :: Contact :: Syndication  :: Login
  34 Posts :: 6 Stories :: 15 Comments :: 3 Trackbacks

Article Categories

Archives

Post Categories

Image Galleries

Blogs Worth Reading

Developer Tools

Friday, January 27, 2006 #

Quail is a real-time log viewing program that I wrote to support large files with color highlighting and search functionality.  Quail also provides a front end to LogParser enabling SQL query support for your logs.

Update (2/25/2006): Fixed bugs around display issues, key handling, and file reload on log rollover.

Update (5/22/2006): Enhanced highlight feature and added load from non-working directory.

Update (10/1/2006): Launch external commands, and window positioning added.

posted @ 1:25 PM | Feedback (1)

Usually you want to control settings in your application via MetaData instead of hard coding values that may change.  With C# serialization this is so easy that you will gladly place settings in a config file.  Take the following example that I have recently been working on:

XML Config File:

<?xml version="1.0" encoding="utf-8"?>
<Options xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Option>
    <DefaultLogLocation>c:\temp\mtlog.txt</DefaultLogLocation>
    <AutoLoadLog>false</AutoLoadLog>
    <TailTimeout>1000</TailTimeout>
    <MaxBytesToLoad>100000000</MaxBytesToLoad>
    <BackgroundColor>WhiteSmoke</BackgroundColor>
    <FilterColor>Teal</FilterColor>
    <DefaultColor>Black</DefaultColor>
  </Option>
  <HighlightItem>
    <ContainsString>[DEBUG</ContainsString>
    <HighlightColor>Black</HighlightColor>
  </HighlightItem>
  <HighlightItem>
    <ContainsString>[INFO</ContainsString>
    <HighlightColor>Navy</HighlightColor>
  </HighlightItem>
  <HighlightItem>
    <ContainsString>[WARNING</ContainsString>
    <HighlightColor>Orange</HighlightColor>
  </HighlightItem>
  <HighlightItem>
    <ContainsString>[ERROR</ContainsString>
    <HighlightColor>DarkRed</HighlightColor>
  </HighlightItem>
  <HighlightItem>
    <ContainsString>[FATAL</ContainsString>
    <HighlightColor>Red</HighlightColor>
  </HighlightItem>
  <HighlightItem>
    <ContainsString>***</ContainsString>
    <HighlightColor>DarkRed</HighlightColor>
  </HighlightItem>
</Options>

 

C# Class to Read and Save:

using System;
using System.Collections;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace Quail
{
  /// <summary>
  /// Options class which will be serialized.
  /// </summary>
  [XmlRoot("Options")]
  public class MyOptions
  {
    [XmlElement("Option")]
    public Option option;
    private ArrayList mHighlightItems;
    public MyOptions() 
    {
      option = new Option();
      mHighlightItems = new ArrayList();
    }
    [XmlElement("HighlightItem")]
    public HighlightItem[] HighlightItems 
    {
      get 
      {
        HighlightItem[] items = new HighlightItem[ mHighlightItems.Count ];
        mHighlightItems.CopyTo( items );
        return items;
      }
      set 
      {
        if( value == null ) return;
        HighlightItem[] items = (HighlightItem[])value;
        mHighlightItems.Clear();
        foreach( HighlightItem item in items )
          mHighlightItems.Add( item );
      }
    }
    public int AddItem(HighlightItem item) 
    {
      return mHighlightItems.Add( item );
    }
    public bool Save()
    {
      // Serialization
      XmlSerializer s = new XmlSerializer( typeof( MyOptions ) );
      TextWriter w = new StreamWriter( @"options.xml" );
      s.Serialize( w, this );
      w.Close();
      return true;
    }
    public static MyOptions Load()
    {
      // Deserialization
      XmlSerializer s = new XmlSerializer( typeof( MyOptions ) );
      MyOptions opt;
      TextReader r = new StreamReader( @"options.xml" );
      opt = (MyOptions)s.Deserialize( r );
      r.Close();
      return opt;
    }
  }
  public class HighlightItem 
  {
    [XmlElement("ContainsString")] 
    public string ContainsString;
    [XmlElement("HighlightColor")]
    public string HiglightColor;
    public HighlightItem() 
    {
    }
    public HighlightItem(string containsString, string color) 
    {
      ContainsString = containsString;
      HiglightColor = color;
    }
  }
  // Option
  public class Option 
  {
    [XmlElement("DefaultLogLocation")] 
    public string DefaultLogLocation = @"c:\temp\mtlog.txt";
    [XmlElement("AutoLoadLog")] 
    public bool AutoLoadLog = false;
    [XmlElement("TailTimeout")] 
    public int TailTimeout = 1000;
    [XmlElement("MaxBytesToLoad")] 
    public long MaxBytesToLoad = 100000000;
    [XmlElement("BackgroundColor")] 
    public string BackgroundColor = "WhiteSmoke";
    [XmlElement("FilterColor")] 
    public string FilterColor = "Teal";
    [XmlElement("DefaultColor")] 
    public string DefaultColor = "Black";
  
    [XmlElement("BorderColor")] 
    public string BorderColor = "WhiteSmoke";
    public Option() 
    {
    }
  }
}

posted @ 11:25 AM | Feedback (0)