IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:16.12.2018 10:34

Zdravím mám dotaz. Vytvářím si soubor s logováním. A chtěl bych aby se soubor sám přepisoval tzn. pokud je dosáhnuto nějaké velikosti, tak aby se začátek umazal a připsalo se na konec. Třeba přidám text kde je 5 řádek, tak uberu text kde je 5 řádek

Zkusil jsem: Zkoušel jsem googlit, ale nic moc jsem nenašel možná k tomu přistupuji blbě....

Chci docílit: dobré funkčnosti

 
Odpovědět
16.12.2018 10:34
Avatar
HONZ4
Člen
Avatar
Odpovídá na Petr Kasnal
HONZ4:16.12.2018 18:24

Buďto připisuj data na konec a jednou za čas ten soubor o něco zkrať (tzn. překopíruj část do nového souboru a starý zahoď (můžeš uživateli oznámit, že pokud chce může spustit zkrácení nebo smazání).

A nebo zvol jiný způsob ukládání záznamů (například speciální soubor, ve kterém budou data rotovat - soubor bude obsahovat informaci kde záznamy začínají - šlo by o systém s pevnou délkou záznamů), nebo nějakou databázi. Ale to budeš muset udělat i aplikaci pro zobrazení záznamů.

A nebo ty záznamy ukládej do více souborů 1.txt , 2.txt , 3.txt pokud dosáhneš max velikosti tak jen přepneš na další číslo souboru (když budeš u 3.txt přepneš na 1.txt).

 
Nahoru Odpovědět
16.12.2018 18:24
Avatar
don.jarducius:17.12.2018 7:50

Ahoj,
logování do souboru se provádí většinou tak, že se soubory "číslují" datumem, např. log_2018-12-17.txt. Případně datem a časem kdy vznikly.
Pokud chceš použít "rotaci" dat v souboru, a pracovat s ním na úrovni řádek, můžeš použít:

var Soubor = "log.txt";
var noveLogy = new string[] { "nové řádky logu", "kolik budeš chtít" };
System.IO.File.WriteAllLines(Soubor, System.IO.File.ReadAllLines(Soubor).Skip(noveLogy.Length).Union(noveLogy).ToArray());
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
17.12.2018 7:50
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Odpovídá na don.jarducius
don.jarducius:17.12.2018 7:53

Resp.

var Soubor = "log.txt";
var maxDelka = 50;
var noveLogy = new string[] { "nové řádky logu", "kolik budeš chtít" };
var logs = System.IO.File.ReadAllLines(Soubor);
if (logs.Length + noveLogy.Length > maxDelka)
    logs = logs.Skip(logs.Length + noveLogy.Length - maxDelka).ToArray();
logs = logs.Union(noveLogy).ToArray();
System.IO.File.WriteAllLines(Soubor, logs);
Nahoru Odpovědět
17.12.2018 7:53
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
SebelaMichal
Člen
Avatar
SebelaMichal:17.12.2018 16:32

Ahoj, pokud tvá aplikace používá více vláken, tak bych celé logování asi dal i do

lock(syncObj)
{
//TODO: zápis do logu
}

 
Nahoru Odpovědět
17.12.2018 16:32
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na SebelaMichal
Petr Kasnal:18.12.2018 8:03

Ahoj děkuju za odpověď. don.jarducius děkuju nejspíše todle jsem potřeboval.Zkusím a dám vědět. děkuji
a ano používá to celá aplikace, ještě se zeptám pro zapsání do souboru používám tento zápis:

using (var mutex = new Mutex(false, "Log"))
           {
               mutex.WaitOne();
               File.AppendAllText(_file.FullName, base.Format(name, description, type) + Environment.NewLine);
               mutex.ReleaseMutex();
           }

Je to takhle v pohodě??? Nebo mám také použít to lock?

Editováno 18.12.2018 8:03
 
Nahoru Odpovědět
18.12.2018 8:03
Avatar
SebelaMichal
Člen
Avatar
SebelaMichal:23.12.2018 11:36

Lock už asi není potřeba:

https://stackoverflow.com/…ck-and-mutex

 
Nahoru Odpovědět
23.12.2018 11:36
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:25.12.2018 2:38

Super díky moc. :)

 
Nahoru Odpovědět
25.12.2018 2:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.