Вы должны войти, чтобы создавать сообщения и темы.

Правильно читать журналы логов

Добрый день всем и хорошего настроения.

Возникла задача по работе с лог файлами.
В моём случае сами лог файлы маленькие и в принципе можно было бы конечно не заморачиваться, но что если лог файл большого размера от 100Mb до 10Gb (к сожалению бывают такие нерадивые разработчики допускающие подобное.), не загружать же всё это в память чтобы прочитать последние строки с дальнейшей обработки эти данных как в этом примере который я сделал изначально прежде чем задаться вопросом оптимизации, решая задачу в лоб.

Нарисовал такой код на коленке без заморочек ООП для теста.
1. Создать Class Watcher чтобы отслеживать событие изменения файла.

Спойлер

using System.IO;

namespace EJHunter
{
    class EJDataWatcher
    {
        FileSystemWatcher fsw;
        public void Run(string path, string filter)
        {
            fsw = new FileSystemWatcher(path, filter);
            fsw.Changed += new FileSystemEventHandler(fsw_Changed);
            fsw.EnableRaisingEvents = true;
        }
        private void fsw_Changed(object sender, FileSystemEventArgs e)
        {
            try
            {
                EJDataReader ejDataReader = new EJDataReader();
                ejDataReader.Run();
                fsw.EnableRaisingEvents = false;
            }
            finally
            {
                fsw.EnableRaisingEvents = true;
            }
        }
    }
}


2. Создать Class для чтения самого файла.
Спойлер

using System;
using System.IO;
using System.Linq;

namespace EJHunter
{
    class EJDataReader
    {
        public void Run()
        {
            string fileDir = @"D:\EJdata";
            string fileName = "EJDATA.LOG";

            var lastLine = File.ReadLines(Path.Combine(fileDir, fileName)).Last();
            Console.WriteLine(lastLine); // С этими данными дальше условно уже можно работать.
        }
    }
}


Ну и соответственно простое использование.
Спойлер

using System;

namespace EJHunter
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileDir = @"D:\EJdata";
            string fileName = "EJDATA.LOG";

            EJDataWatcher ejDataWatcher = new EJDataWatcher();
            ejDataWatcher.Run(fileDir, fileName);
            Console.ReadKey();
        }
    }
}


После я озадачился найти другое решение, как вариант читать файл с конца при его изменении.
Думал даже может быть как-то можно отловить поток процесса который пишет этот лог файл. )))
Нагуглил одно решение, но беда в том что я не могу понять как работает предложенное решение.
Хорошо бы урок от Хачатура по данному вопросу, подобные задачи довольно частые. Ну это уже будет наглость. =)