235 lines
6.8 KiB
C#
235 lines
6.8 KiB
C#
|
|
using System.IO.MemoryMappedFiles;
|
||
|
|
using System.Text;
|
||
|
|
|
||
|
|
namespace SharedComponents
|
||
|
|
{
|
||
|
|
public class LiveLogCache
|
||
|
|
{
|
||
|
|
/*// Staticka instancia pre singleton
|
||
|
|
private static readonly LiveLogCache _instance = new LiveLogCache();
|
||
|
|
|
||
|
|
// Uzamykaci objekt pre bezpecny pristup z viacerych vlakien
|
||
|
|
private static readonly object _lock = new object();
|
||
|
|
|
||
|
|
// Zoznam na ukladanie logov
|
||
|
|
private readonly List<string> _logs = new List<string>();
|
||
|
|
|
||
|
|
// Udalost pre notifikaciu pri zmene logov
|
||
|
|
public event Action<string> LogAdded;
|
||
|
|
|
||
|
|
// Sukromny konstruktor (singleton pattern)
|
||
|
|
private LiveLogCache() { }
|
||
|
|
|
||
|
|
// Metoda na ziskanie poctu logov
|
||
|
|
public int GetCount()
|
||
|
|
{
|
||
|
|
return _logs.Count;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Staticka metoda na ziskanie instancie
|
||
|
|
public static LiveLogCache Instance
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
lock (_lock)
|
||
|
|
{
|
||
|
|
return _instance;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Verejna vlastnost na ziskanie logov
|
||
|
|
public IReadOnlyList<string> Logs
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
lock (_lock)
|
||
|
|
{
|
||
|
|
return _logs.AsReadOnly();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Metoda na pridanie logu
|
||
|
|
public void AddLog(string log)
|
||
|
|
{
|
||
|
|
// Ziskanie aktualneho casu v pozadovanom formate
|
||
|
|
string timeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:");
|
||
|
|
|
||
|
|
// Vytvorenie noveho logu s casovou peciatkou na zaciatku
|
||
|
|
string logWithTimeStamp = $"{timeStamp} {log}";
|
||
|
|
|
||
|
|
// Pridanie logu do zoznamu
|
||
|
|
lock (_lock)
|
||
|
|
{
|
||
|
|
_logs.Add(logWithTimeStamp);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Spustenie udalosti pre notifikaciu
|
||
|
|
LogAdded?.Invoke(logWithTimeStamp);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Metoda na vycistenie logov
|
||
|
|
public void ClearLogs()
|
||
|
|
{
|
||
|
|
lock (_lock)
|
||
|
|
{
|
||
|
|
_logs.Clear();
|
||
|
|
}
|
||
|
|
|
||
|
|
// Volitelne: Spusti udalost, ak by sme chceli notifikovat aj o vymazani logov
|
||
|
|
LogAdded?.Invoke("Logs were cleared.");
|
||
|
|
}
|
||
|
|
|
||
|
|
// Ziskanie vsetkych logov
|
||
|
|
public List<string> GetAllLogs()
|
||
|
|
{
|
||
|
|
return new List<string>(_logs); // Vratime kopiu logov
|
||
|
|
}
|
||
|
|
|
||
|
|
// Ziskanie logov medzi urcitou poziciou (s upravenym indexovanim)
|
||
|
|
public List<string> GetLogs(int startIndex, int count)
|
||
|
|
{
|
||
|
|
// Zabezpeci, ze indexy nebudu mimo rozsahu
|
||
|
|
return _logs.Skip(startIndex).Take(count).ToList();
|
||
|
|
}*/
|
||
|
|
|
||
|
|
// Zlepseny kod, ktory umoznuje pracu s MemoryMappedFile, namiesto len priestoru vo virtualnej pamati, navyse je tento subor velkostne obmedzeny na 1MB
|
||
|
|
|
||
|
|
// Staticka instancia pre singleton
|
||
|
|
private static readonly LiveLogCache _instance = new LiveLogCache(true);
|
||
|
|
|
||
|
|
// Uzamykaci objekt pre bezpecny pristup z viacerych vlakien
|
||
|
|
private static readonly object _lock = new object();
|
||
|
|
|
||
|
|
// Zoznam na ukladanie logov
|
||
|
|
private readonly List<string> _logs = new List<string>();
|
||
|
|
|
||
|
|
// Udalost pre notifikaciu pri zmene logov
|
||
|
|
public event Action<string> LogAdded;
|
||
|
|
|
||
|
|
// Memory-mapped file
|
||
|
|
private MemoryMappedFile _mmf;
|
||
|
|
private MemoryMappedViewAccessor _accessor;
|
||
|
|
private const int MaxLogSize = 1024 * 1024; // 1MB
|
||
|
|
|
||
|
|
// Sukromny konstruktor (singleton pattern)
|
||
|
|
private LiveLogCache(bool itsLogsCreator)
|
||
|
|
{
|
||
|
|
if (itsLogsCreator == true)
|
||
|
|
{
|
||
|
|
_mmf = MemoryMappedFile.CreateOrOpen("LiveLogCacheMMF", MaxLogSize);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
_mmf = MemoryMappedFile.OpenExisting("LiveLogCacheMMF");
|
||
|
|
}
|
||
|
|
|
||
|
|
_accessor = _mmf.CreateViewAccessor();
|
||
|
|
}
|
||
|
|
|
||
|
|
// Metoda na ziskanie poctu logov
|
||
|
|
public int GetCount()
|
||
|
|
{
|
||
|
|
return _logs.Count;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Staticka metoda na ziskanie instancie
|
||
|
|
public static LiveLogCache Instance
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
lock (_lock)
|
||
|
|
{
|
||
|
|
return _instance;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Verejna vlastnost na ziskanie logov
|
||
|
|
public IReadOnlyList<string> Logs
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
lock (_lock)
|
||
|
|
{
|
||
|
|
return _logs.AsReadOnly();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Metoda na pridanie logu
|
||
|
|
public void AddLog(string log)
|
||
|
|
{
|
||
|
|
// Ziskanie aktualneho casu v pozadovanom formate
|
||
|
|
string timeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:");
|
||
|
|
|
||
|
|
// Vytvorenie noveho logu s casovou peciatkou na zaciatku
|
||
|
|
string logWithTimeStamp = $"{timeStamp} {log}";
|
||
|
|
|
||
|
|
// Pridanie logu do zoznamu
|
||
|
|
lock (_lock)
|
||
|
|
{
|
||
|
|
_logs.Add(logWithTimeStamp);
|
||
|
|
WriteLogToMemoryMappedFile(logWithTimeStamp);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Spustenie udalosti pre notifikaciu
|
||
|
|
LogAdded?.Invoke(logWithTimeStamp);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Metoda na vycistenie logov
|
||
|
|
public void ClearLogs()
|
||
|
|
{
|
||
|
|
lock (_lock)
|
||
|
|
{
|
||
|
|
_logs.Clear();
|
||
|
|
ClearMemoryMappedFile();
|
||
|
|
}
|
||
|
|
|
||
|
|
// Volitelne: Spusti udalost, ak by sme chceli notifikovat aj o vymazani logov
|
||
|
|
LogAdded?.Invoke("Logs were cleared.");
|
||
|
|
}
|
||
|
|
|
||
|
|
// Ziskanie vsetkych logov
|
||
|
|
public List<string> GetAllLogs()
|
||
|
|
{
|
||
|
|
return new List<string>(_logs); // Vratime kopiu logov
|
||
|
|
}
|
||
|
|
|
||
|
|
// Ziskanie logov medzi urcitou poziciou (s upravenym indexovanim)
|
||
|
|
public List<string> GetLogs(int startIndex, int count)
|
||
|
|
{
|
||
|
|
// Zabezpeci, ze indexy nebudu mimo rozsahu
|
||
|
|
return _logs.Skip(startIndex).Take(count).ToList();
|
||
|
|
}
|
||
|
|
|
||
|
|
// Metoda na naplnenie ListView
|
||
|
|
/*public void PopulateListView(ListView listView)
|
||
|
|
{
|
||
|
|
listView.Items.Clear();
|
||
|
|
lock (_lock)
|
||
|
|
{
|
||
|
|
foreach (var log in _logs)
|
||
|
|
{
|
||
|
|
listView.Items.Add(new ListView Item(log));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}*/
|
||
|
|
|
||
|
|
// Write log to memory-mapped file
|
||
|
|
private void WriteLogToMemoryMappedFile(string log)
|
||
|
|
{
|
||
|
|
byte[] logBytes = Encoding.UTF8.GetBytes(log + Environment.NewLine);
|
||
|
|
_accessor.WriteArray(0, logBytes, 0, logBytes.Length);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Clear memory-mapped file
|
||
|
|
private void ClearMemoryMappedFile()
|
||
|
|
{
|
||
|
|
byte[] emptyBytes = new byte[MaxLogSize];
|
||
|
|
_accessor.WriteArray(0, emptyBytes, 0, emptyBytes.Length);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|