web-dev-qa-db-fra.com

Comment écrire un fichier journal en c #?

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.

28
user2725580

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.

42
evpo

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)
        {
        }
    }
}
35

Utilisez File.AppendAllText à la place:

File.AppendAllText(filePath + "log.txt", log);
13
matth
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

11
RandyMohan

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

6
Sergey Ryzhov

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)
                {
                }
            }
        }
5
Masoud Siahkali

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);
        }
    }
}
3
moldypenguins
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

3
Monika

Il y a 2 façons faciles

1
Dinesh Kumar P

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
Ilya