Click here to Skip to main content
Click here to Skip to main content

Live Log Viewer

By , 23 Apr 2012
Rate this:
Please Sign up or sign in to vote.

Introduction 

As a member of an IT Helpdesk team I am constantly trawling through logs trying to find out "what went wrong?". This is especially time-consuming when troubleshooting issues with Windows Services and background applications. With some applications and services producing large (50MB+) log files I often find myself moving or renaming the old log files so I can get a small, easy-to-read file that displays the most recent entries since the service/application was restarted.

This tool eliminates these problems by monitoring the file and displaying any text that is written to it on-the-fly. It uses a custom WinForms TabPage control, called LogTabPage with a nested LogWatcher class that inherits FileSystemWatcher. The FileSystemWatcher class provides the functions for monitoring the file for changes and I simply use a FileStream/StreamReader combination to read the text and append it to a TextBox.    

   

LogTabPage Class 

The LogTabPage class is a custom TabPage that contains a single RichTextBox and a nested LogWatcher class to monitor the log file. It contains code for creating the LogWatcher and appending text to the RichTextBox. 

 class LogTabPage : TabPage
    {
        //The textbox where the log will be displayed
        internal RichTextBox TextBox = new RichTextBox();
        //The LogWatcher that monitors the file
        internal LogWatcher Watcher;

        //Constructor for the LogTabPage
        public LogTabPage(string FileName, string Suffix)
        {
            //Display the filename on the Tab
            this.Text = Path.GetFileName(string.Format("{0} {1}", FileName, Suffix));

            //Configure the TextBox
            TextBox.Dock = DockStyle.Fill;
            TextBox.BackColor = Color.White;
            TextBox.ReadOnly = true;

            //Add the TextBox to the LogTabPage
            this.Controls.Add(TextBox);

            //Create the LogWatcher
            CreateWatcher(FileName);
        }

        private void CreateWatcher(string FileName)
        {
            Watcher = new LogWatcher(FileName);

            //Set the directory of the file to monitor 
            Watcher.Path = Path.GetDirectoryName(FileName);

            //Raise events when the LastWrite or Size attribute is changed
            Watcher.NotifyFilter = (NotifyFilters.LastWrite | NotifyFilters.Size);

            //Filter out events for only this file
            Watcher.Filter = Path.GetFileName(FileName);

            //Subscribe to the event
            Watcher.TextChanged += new LogWatcher.LogWatcherEventHandler(Watcher_Changed);

            //Enable the event
            Watcher.EnableRaisingEvents = true;
        }

        //Occurs when the file is changed
        void Watcher_Changed(object sender, LogWatcherEventArgs e)
        {
            //Invoke the AppendText method if required
            if (TextBox.InvokeRequired) this.Invoke(new Action(delegate() { AppendText(e.Contents); }));
            else AppendText(e.Contents);
        }

        private void AppendText(string Text)
        {
            //Append the new text to the TextBox
            TextBox.Text += Text;

            //If the Frozen function isn't enabled then scroll to the bottom of the TextBox
            if (!MainForm.Frozen)
            {
                TextBox.SelectionStart = TextBox.Text.Length;
                TextBox.SelectionLength = 0;
                TextBox.ScrollToCaret();
            }
        }  

LogWatcher Class 

The LogWatcher Class is an extension of the FileSystemWatcher class that includes methods for reading the text from the file and an event for when the text is changed. 

 internal class LogWatcher : FileSystemWatcher
    {
        //The name of the file to monitor
        internal string FileName;

        //The FileStream for reading the text from the file
        FileStream Stream;
        //The StreamReader for reading the text from the FileStream
        StreamReader Reader;

        //Constructor for the LogWatcher class
        public LogWatcher(string FileName)
        {
            //Subscribe to the Changed event of the base FileSystemWatcher class
            this.Changed += OnChanged;

            //Set the filename of the file to watch
            this.FileName = FileName;

            //Create the FileStream and StreamReader object for the file
            Stream = new System.IO.FileStream(FileName,FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            Reader = new System.IO.StreamReader(Stream);
            
            //Set the position of the stream to the end of the file
            Stream.Position =  Stream.Length;
        }

        //Occurs when the file is changed
        public void OnChanged(object o, FileSystemEventArgs e)
        {
            //Read the new text from the file
            string Contents = Reader.ReadToEnd();

            //Fire the TextChanged event
            LogWatcherEventArgs args = new LogWatcherEventArgs(Contents);
            if (TextChanged != null) TextChanged(this, args);
        }

        public delegate void LogWatcherEventHandler(object sender, LogWatcherEventArgs e);

        //Event that is fired when the file is changed
        public event LogWatcherEventHandler TextChanged;
    }
	

History

I originally created the application in VB.NET with little knowledge of .NET. I have since re-written it in C#. 

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Alex Wiese
Help desk / Support
Australia Australia
No Biography provided

Comments and Discussions

 
QuestionAlternative PinmemberSarafian23-Apr-12 20:30 
QuestionFile System Watcher PinmemberTheAlas23-Apr-12 4:35 
AnswerRe: File System Watcher PinmemberBassam Saoud23-Apr-12 6:45 
GeneralRe: File System Watcher PinmemberAlex Wiese23-Apr-12 18:01 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140415.2 | Last Updated 23 Apr 2012
Article Copyright 2012 by Alex Wiese
Everything else Copyright © CodeProject, 1999-2014
Terms of Use
Layout: fixed | fluid