Comment pourrais-je é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 le fais:
log += "stringToBeLogged";
Comme vous pouvez le supposer, le journal de chaîne ne cesse de croître au fur et à mesure de l'exécution du programme. (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 que ce serait lourd d'écrire le fichier entier encore et encore à chaque fois que quelque chose est ajouté au journal.
Du point de vue des performances, 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 dans un autre emplacement en mémoire. Je recommanderais plutôt d'utiliser StringBuilder:
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 pour accéder à votre objet sb
.
Une autre chose à considérer est ce qui arrive aux entrées de journal qui ont été ajoutées au cours des 20 dernières secondes de l'exécution. Vous voudrez probablement vider votre chaîne dans le fichier juste avant la fermeture de l'application.
créer une classe créer un objet globalement et appeler cela
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 File.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();
}
Voir le lien: blogspot.in
Un outil très pratique pour la journalisation est http://logging.Apache.org/log4net/
Vous pouvez également faire 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)
{
}
}
}
tel que publié par @randymohan, avec à l'aide de déclarations à 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();
}
Lien de référence:
http://www.codeproject.com/Questions/163337/How-to-write-in-log-Files-in-C
Il y a 2 façons faciles
C'est ajouter une nouvelle chaîne dans le fichier
using (var file = new StreamWriter(filePath + "log.txt", true))
{
file.WriteLine(log);
file.Close();
}