J'ai une application qui fonctionne sur un PC panneau autonome dans un kiosque (C # / WPF). Il effectue des opérations de journalisation typiques dans un fichier texte. Le PC a une quantité limitée d'espace disque pour stocker ces journaux au fur et à mesure de leur croissance. p>
Ce que je dois faire, c'est être capable de spécifier la taille maximale qu'un fichier journal est autorisé à être. Si, lorsque vous essayez d'écrire sur le journal, la taille maximale est dépassée, de nouvelles données seront écrites à la fin du journal et que les données les plus anciennes seront purgées du début. P>
Obtenir la taille du fichier n'est pas un problème, mais y a-t-il des techniques de manipulation de fichiers typiques pour conserver un fichier sous une certaine taille? P>
6 Réponses :
Une technique pour gérer cela consiste à avoir deux fichiers journaux qui sont la moitié de la taille maximale chacune. Vous faites simplement pivoter entre les deux lorsque vous atteignez la taille maximale de chaque fichier. La rotation d'un fichier entraîne la dépollution avec un nouveau fichier. P>
Un cadre de journalisation tel que Log4net a cette fonctionnalité intégrée. P>
Il n'y a pas de moyen facile de dépouiller les données du début du fichier. Donc, vous avez plusieurs options: p>
Grand résumé des options viables.
OS Linux: Découvrez la logrotate - http: // www.cyberciti.biz/faq/how-do-i-rotate-log-files/ p>
Windows OS: Essayez de googling Windows Logrotate. Par exemple: http://blog.arithm.com/2008 / 02/07 / Windows-Log-File-Rotation / P>
essayez d'utiliser log4net p>
Je n'utiliserais pas cela pour un fichier destiné à être fini à 1 még et ce n'est pas terriblement efficace, mais cela fonctionne bien si vous avez besoin de résoudre un problème pesky du moment où vous avez besoin d'un fichier journal que vous ne pouvez pas facilement maintenir. Assurez-vous que le fichier journal existe avant de l'utiliser si ... ou vous pouvez ajouter du code pour cela ainsi que la vérification de l'emplacement existant, etc.
// This is how to call it private void buttonLog_Click(object sender, EventArgs e) { c_Log.writeToFile(textBoxMessages.Text, "../../log.log", 1); } public static class c_Log { static int iMaxLogLength = 15000; // Probably should be bigger, say 200,000 static int iTrimmedLogLength = -1000; // minimum of how much of the old log to leave static public void writeToFile(string strNewLogMessage, string strFile, int iLogLevel) { try { FileInfo fi = new FileInfo(strFile); Byte[] bytesSavedFromEndOfOldLog = null; if (fi.Length > iMaxLogLength) // if the log file length is already too long { using (BinaryReader br = new BinaryReader(File.Open(strFile, FileMode.Open))) { // Seek to our required position of what you want saved. br.BaseStream.Seek(iTrimmedLogLength, SeekOrigin.End); // Read what you want to save and hang onto it. bytesSavedFromEndOfOldLog = br.ReadBytes((-1 * iTrimmedLogLength)); } } byte[] newLine = System.Text.ASCIIEncoding.ASCII.GetBytes(Environment.NewLine); FileStream fs = null; // If the log file is less than the max length, just open it at the end to write there if (fi.Length < iMaxLogLength) fs = new FileStream(strFile, FileMode.Append, FileAccess.Write, FileShare.Read); else // If the log file is more than the max length, just open it empty fs = new FileStream(strFile, FileMode.Create, FileAccess.Write, FileShare.Read); using (fs) { // If you are trimming the file length, write what you saved. if (bytesSavedFromEndOfOldLog != null) { Byte[] lineBreak = Encoding.ASCII.GetBytes("### " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " *** *** *** Old Log Start Position *** *** *** *** ###"); fs.Write(newLine, 0, newLine.Length); fs.Write(newLine, 0, newLine.Length); fs.Write(lineBreak, 0, lineBreak.Length); fs.Write(newLine, 0, newLine.Length); fs.Write(bytesSavedFromEndOfOldLog, 0, bytesSavedFromEndOfOldLog.Length); fs.Write(newLine, 0, newLine.Length); } Byte[] sendBytes = Encoding.ASCII.GetBytes(strNewLogMessage); // Append your last log message. fs.Write(sendBytes, 0, sendBytes.Length); fs.Write(newLine, 0, newLine.Length); } } catch (Exception ex) { ; // Nothing to do... //writeEvent("writeToFile() Failed to write to logfile : " + ex.Message + "...", 5); } } }
Je voulais aussi une solution simple, mais je ne voulais pas ajouter une autre dépendance, donc j'ai fait une méthode simple. Cela a tout ce dont vous avez besoin que la partie de compression de l'ancien fichier à un zip, que vous pouvez trouver ici: Créez un fichier zip dans la mémoire à partir d'octets (texte avec codage arbitraire) J'ai cela dans le cadre de l'initialisation / Section de la réinitialisation de ma demande, il est donc possible de courir quelques fois par jour. p>