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.

24
demandé sur demonplus 2013-11-25 08:55:57

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.

33
répondu evpo 2018-08-29 07:16:01

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)
        {
        }
    }
}
29
répondu Aravind 2016-12-18 22:02:40

Utilisez Le Fichier .AppendAllText à la place:

File.AppendAllText(filePath + "log.txt", log);
12
répondu matth 2013-11-25 04:57:40
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

10
répondu RandyMohan 2016-07-20 07:04:31

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

5
répondu Sergey Ryzhov 2013-11-25 05:00:03

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)
                {
                }
            }
        }
3
répondu Masoud Siahkali 2016-08-08 05:56:42

Il y a 2 façons simples

2
répondu Dinesh Kumar P 2014-12-09 10:31:16

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);
        }
    }
}
2
répondu moldypenguins 2018-09-17 22:32:00
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

1
répondu Monika 2013-11-25 04:57:58

C'est ajouter une nouvelle chaîne dans le fichier

using (var file = new StreamWriter(filePath + "log.txt", true))
        {
            file.WriteLine(log);
            file.Close();
        }
0
répondu Ilya 2013-11-25 05:00:30