Comment écrire un fichier journal en c#?
Comment écrire un fichier journal en c#?
Actuellement, j'ai une minuterie avec cette Déclaration qui coche toutes les 20 secondes:
File.WriteAllText(filePath+"log.txt", log);
Pour tout ce que je veux connecté je fais ceci:
log += "stringToBeLogged";
Comme vous pouvez supposer que le journal de chaîne grandit et grandit au fur et à mesure que le programme s'exécute. (Je ne sais même pas s'il y a un maximum de caractères par chaîne?)
Je suppose qu'il doit y avoir de meilleures façons de le faire. je pensais juste qu'il serait lourd d'écrire le fichier entier encore et encore pour chaque temps quelque chose est ajouté au journal.
10 réponses
Du point de vue de la performance, votre solution n'est pas optimale. Chaque fois que vous ajoutez une autre entrée de journal avec+=, la chaîne entière est copiée à un autre endroit en mémoire. Je recommande d'utiliser StringBuilder à la place:
StringBuilder sb = new StringBuilder();
...
sb.Append("log something");
...
// flush every 20 seconds as you do it
File.AppendAllText(filePath+"log.txt", sb.ToString());
sb.Clear();
En passant, votre événement timer est probablement exécuté sur un autre thread. Vous pouvez donc utiliser un mutex lors de l'accès à votre objet sb
.
Une autre chose à considérer est ce qui arrive aux entrées de journal qui ont été ajoutées dans les 20 dernières secondes de la exécution. Vous voulez probablement vider votre chaîne dans le fichier juste avant la sortie de l'application.
Créez une classe créez un objet globalement et appelez ceci
using System.IO;
using System.Reflection;
public class LogWriter
{
private string m_exePath = string.Empty;
public LogWriter(string logMessage)
{
LogWrite(logMessage);
}
public void LogWrite(string logMessage)
{
m_exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
try
{
using (StreamWriter w = File.AppendText(m_exePath + "\\" + "log.txt"))
{
Log(logMessage, w);
}
}
catch (Exception ex)
{
}
}
public void Log(string logMessage, TextWriter txtWriter)
{
try
{
txtWriter.Write("\r\nLog Entry : ");
txtWriter.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),
DateTime.Now.ToLongDateString());
txtWriter.WriteLine(" :");
txtWriter.WriteLine(" :{0}", logMessage);
txtWriter.WriteLine("-------------------------------");
}
catch (Exception ex)
{
}
}
}
Utilisez Le Fichier .AppendAllText à la place:
File.AppendAllText(filePath + "log.txt", log);
public static void WriteLog(string strLog)
{
StreamWriter log;
FileStream fileStream = null;
DirectoryInfo logDirInfo = null;
FileInfo logFileInfo;
string logFilePath = "C:\\Logs\\";
logFilePath = logFilePath + "Log-" + System.DateTime.Today.ToString("MM-dd-yyyy") + "." + "txt";
logFileInfo = new FileInfo(logFilePath);
logDirInfo = new DirectoryInfo(logFileInfo.DirectoryName);
if (!logDirInfo.Exists) logDirInfo.Create();
if (!logFileInfo.Exists)
{
fileStream = logFileInfo.Create();
}
else
{
fileStream = new FileStream(logFilePath, FileMode.Append);
}
log = new StreamWriter(fileStream);
log.WriteLine(strLog);
log.Close();
}
Se Référer Lien: blogspot.dans
Outil Très pratique pour la journalisation est http://logging.apache.org/log4net/
Vous pouvez également rendre quelque chose d'eux-mêmes moins (plus) puissant. Vous pouvez utiliser http://msdn.microsoft.com/ru-ru/library/system.io.filestream (v = vs. 110). Aspx
Ajouter un journal au fichier avec la classe statique
public static class LogWriter
{
private static string m_exePath = string.Empty;
public static void LogWrite(string logMessage)
{
m_exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!File.Exists(m_exePath + "\\" + "log.txt"))
File.Create(m_exePath + "\\" + "log.txt");
try
{
using (StreamWriter w = File.AppendText(m_exePath + "\\" + "log.txt"))
AppendLog(logMessage, w);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private static void AppendLog(string logMessage, TextWriter txtWriter)
{
try
{
txtWriter.Write("\r\nLog Entry : ");
txtWriter.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),DateTime.Now.ToLongDateString());
txtWriter.WriteLine(" :");
txtWriter.WriteLine(" :{0}", logMessage);
txtWriter.WriteLine("-------------------------------");
}
catch (Exception ex)
{
}
}
}
Il y a 2 façons simples
- StreamWriter - http://www.dotnetperls.com/streamwriter
- Log4Net comme Log4j (Java) - http://www.codeproject.com/Articles/140911/log4net-Tutorial
Comme posté par @ randymohan, avec l'utilisation des instructions à la place
public static void WriteLog(string strLog)
{
string logFilePath = @"C:\Logs\Log-" + System.DateTime.Today.ToString("MM-dd-yyyy") + "." + "txt";
FileInfo logFileInfo = new FileInfo(logFilePath);
DirectoryInfo logDirInfo = new DirectoryInfo(logFileInfo.DirectoryName);
if (!logDirInfo.Exists) logDirInfo.Create();
using (FileStream fileStream = new FileStream(logFilePath, FileMode.Append))
{
using (StreamWriter log = new StreamWriter(fileStream))
{
log.WriteLine(strLog);
}
}
}
if(!File.Exists(filename)) //No File? Create
{
fs = File.Create(filename);
fs.Close();
}
if(File.ReadAllBytes().Length >= 100*1024*1024) // (100mB) File to big? Create new
{
string filenamebase = "myLogFile"; //Insert the base form of the log file, the same as the 1st filename without .log at the end
if(filename.contains("-")) //Check if older log contained -x
{
int lognumber = Int32.Parse(filename.substring(filename.lastIndexOf("-")+1, filename.Length-4); //Get old number, Can cause exception if the last digits aren't numbers
lognumber++; //Increment lognumber by 1
filename = filenamebase + "-" + lognumber + ".log"; //Override filename
}
else
{
filename = filenamebase + "-1.log"; //Override filename
}
fs = File.Create(filename);
fs.Close();
}
Se référer lien:
Http://www.codeproject.com/Questions/163337/How-to-write-in-log-Files-in-C
C'est ajouter une nouvelle chaîne dans le fichier
using (var file = new StreamWriter(filePath + "log.txt", true))
{
file.WriteLine(log);
file.Close();
}