dreevo Ответов: 1

Печать последней добавленной строки в файл журнала


У меня есть лог-файл, который я должен отслеживать в режиме реального времени с помощью signalr. Я использую метод сопоставления с удаленным методом и подход FileSystemEventHandler следующим образом : это метод, который наблюдает за файлом журнала.

public void Progress_Log(SchemaUpdate imp)
{
    // Preparing remote mapping
    string strCmdText;
    strCmdText = "/C net use /delete k: /y";
    System.Diagnostics.Process.Start("CMD.exe", strCmdText);
    Thread.Sleep(500);
    strCmdText = @"/C net use K: \\xx\e$\test\dumps\Create /user:xx xxxx";
    System.Diagnostics.Process.Start("CMD.exe", strCmdText);
    var watch = new FileSystemWatcher
    {
        Path = @"\\TN1ORC21\e$\test\dumps\Create",
        Filter = "output.txt"
    };
    //watch.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite; //more options
    watch.Changed += new FileSystemEventHandler(OnChanged);
    watch.EnableRaisingEvents = true;
}


Как только в файл добавляется новая строка вызывается метод onChanged :

public void OnChanged(object source, FileSystemEventArgs e)
{
    using StreamReader r = new StreamReader(System.IO.File.Open(@"k:\" + e.Name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
    string line;
    while (!r.EndOfStream)
    {
        line = r.ReadLine();
        if (r.Peek() == -1)
        {
            HubContext.Clients.All.SendAsync("ReceiveMessage", "Log", line);
            // THIS BASICALLY SENDS THE LINE TO THE HUB THEN TO THE CLIENT (BROWSER)
        }
    }
}


Что я уже пробовал:

Проблема в том, что он не печатает все новые добавленные строки и пропускает много строк, которые мне нужно увидеть, и, например, для файла из 200 строк я получу максимум 7 строк. Я понял, что моя проблема заключается в цикле while метода onChanged, но я не могу понять, как это исправить.

1 Ответов

Рейтинг:
1

Garth J Lancaster

Что ж.. Я бы не стал использовать событие FileSystemEventHandler OnChanged, чтобы попытаться добавить каждую строку/группу строк - там слишком много буферизации и т. д., И посмотрите здесь Класса filesystemwatcher.Измененное Событие (System.IO) | Microsoft Docs[^] о количестве событий, которые могут быть вызваны - JSOP программист здесь, в CodeProject, продемонстрировал это красиво в коде, первый из его случаев в этой статье FileSystemWatcher - чистый хаос (Часть 1 из 2)[^]

Вот что я делал в прошлом
1) я использовал событие FileSystemEventHandler OnChanged, чтобы сказать, когда "внешний процесс" начал запись в файл журнала.
2) затем у меня был эквивалент "хвоста", написанного на c#, который я использовал для сканирования строк лог-файла
3) хвост (и процесс) остановится, когда будут найдены необходимые данные или внешний процесс, указанный в файле журнала, который он закончил (есть и другие способы обработки этого)

Я нашел хвостовую реализацию C# , которую использовал в качестве модели для своей собственной ...


dreevo

Не могли бы вы помочь мне реализовать это ?