Правильно читать журналы логов
Цитата: Руслан от 12.12.2021, 15:39Добрый день всем и хорошего настроения.
Возникла задача по работе с лог файлами.
В моём случае сами лог файлы маленькие и в принципе можно было бы конечно не заморачиваться, но что если лог файл большого размера от 100Mb до 10Gb (к сожалению бывают такие нерадивые разработчики допускающие подобное.), не загружать же всё это в память чтобы прочитать последние строки с дальнейшей обработки эти данных как в этом примере который я сделал изначально прежде чем задаться вопросом оптимизации, решая задачу в лоб.Нарисовал такой код на коленке без заморочек ООП для теста.
1. Создать Class Watcher чтобы отслеживать событие изменения файла.
[spoiler title=""]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; } } } }[/spoiler]
2. Создать Class для чтения самого файла.
[spoiler title=""]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); // С этими данными дальше условно уже можно работать. } } }[/spoiler]
Ну и соответственно простое использование.
[spoiler title=""]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(); } } }[/spoiler]
После я озадачился найти другое решение, как вариант читать файл с конца при его изменении.
Думал даже может быть как-то можно отловить поток процесса который пишет этот лог файл. )))
Нагуглил одно решение, но беда в том что я не могу понять как работает предложенное решение.
Хорошо бы урок от Хачатура по данному вопросу, подобные задачи довольно частые. Ну это уже будет наглость. =)
Добрый день всем и хорошего настроения.
Возникла задача по работе с лог файлами.
В моём случае сами лог файлы маленькие и в принципе можно было бы конечно не заморачиваться, но что если лог файл большого размера от 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();
}
}
}
После я озадачился найти другое решение, как вариант читать файл с конца при его изменении.
Думал даже может быть как-то можно отловить поток процесса который пишет этот лог файл. )))
Нагуглил одно решение, но беда в том что я не могу понять как работает предложенное решение.
Хорошо бы урок от Хачатура по данному вопросу, подобные задачи довольно частые. Ну это уже будет наглость. =)