it-swarm.com.de

Wie schreibe ich eine Protokolldatei in c #?

Wie würde ich eine Protokolldatei in c # schreiben?

Momentan habe ich einen Timer mit dieser Anweisung, der alle 20 Sekunden tickt:

File.WriteAllText(filePath+"log.txt", log);

Für alles, was ich eingeloggt haben möchte, mache ich Folgendes:

log += "stringToBeLogged";

Wie Sie davon ausgehen können, wächst das Zeichenfolgenprotokoll während der Ausführung des Programms stetig. (Ich weiß nicht einmal, ob es eine maximale Zeichenanzahl pro Zeichenfolge gibt?)

Ich gehe davon aus, dass es dafür bessere Möglichkeiten geben muss. Ich dachte nur, dass es schwierig wäre, die gesamte Datei immer wieder zu schreiben, wenn dem Protokoll etwas hinzugefügt wird.

28
user2725580

Aus Sicht der Leistung ist Ihre Lösung nicht optimal. Jedes Mal, wenn Sie einen weiteren Protokolleintrag mit + = hinzufügen, wird die gesamte Zeichenfolge an eine andere Stelle im Speicher kopiert. Ich würde empfehlen, stattdessen StringBuilder zu verwenden:

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();

Übrigens wird Ihr Timer-Ereignis wahrscheinlich auf einem anderen Thread ausgeführt. Daher möchten Sie möglicherweise einen Mutex verwenden, wenn Sie auf Ihr sb -Objekt zugreifen.

Zu berücksichtigen ist auch, was mit den Protokolleinträgen geschieht, die innerhalb der letzten 20 Sekunden nach der Ausführung hinzugefügt wurden. Sie möchten Ihren String wahrscheinlich in die Datei schreiben, bevor die App beendet wird.

42
evpo

erstelle eine Klasse erstelle ein Objekt global und rufe dies auf

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

Verwenden Sie stattdessen File.AppendAllText :

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();
    }   

Siehe Link: blogspot.in

11
RandyMohan

Sehr bequemes Tool für die Protokollierung ist http://logging.Apache.org/log4net/

Sie können auch etwas aus sich machen, das weniger (mehr) mächtig ist. Sie können http://msdn.Microsoft.com/ru-ru/library/system.io.filestream (v = vs.110). Aspx verwenden

6
Sergey Ryzhov

Fügen Sie das Protokoll zur Datei mit der statischen Klasse hinzu

 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

wie von @randymohan gepostet, stattdessen mit Anweisungen

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();
}

Siehe Link:

http://www.codeproject.com/Questions/163337/How-to-write-in-log-Files-in-C

3
Monika

Es gibt zwei einfache Möglichkeiten

1
Dinesh Kumar P

Hiermit wird der Datei eine neue Zeichenfolge hinzugefügt

using (var file = new StreamWriter(filePath + "log.txt", true))
        {
            file.WriteLine(log);
            file.Close();
        }
0
Ilya