【问题标题】:How to keep logs in C#?如何在 C# 中保存日志?
【发布时间】:2009-08-13 11:09:50
【问题描述】:

这是一个用 C# 编写的 WinForm。 假设我在我选择的目录中生成一个随机命名的文本文件。当第一次单击按钮时,我将文本框中包含的数据写入该文本文件。如果用户想对文本框中的不同数据做同样的事情,那么单击按钮应该将新数据写入文本文件而不会丢失旧数据。这就像保留日志,这可能吗?

我的代码是这样的:

private readonly Random setere = new Random(); 
    private const string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    private string RandomString() 
    { 
        char[] buffer = new char[5]; 
        for (int i = 0; i < 5; i++) 
        { 
            buffer[i] = chars[setere.Next(chars.Length)]; 
        } 
        return new string(buffer); 
    }




    private void button1_Click(object sender, EventArgs e)
    {


        DialogResult dia = MessageBox.Show("Wanna continue?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);


        if (dia == DialogResult.Yes)
        {
            StreamWriter wFile = new StreamWriter("C:\\Users\\Ece\\Documents\\Testings\\" + RandomString() + ".txt");
            wFile.WriteLine("Name Surname:" + text1.Text + text2.Text);
            wFile.WriteLine("Other:" + text3.Text + text4.Text);
            wFile.WriteLine("Money:" + textBox1.Text + " TL.");
            wFile.WriteLine("*************************************");
            wFile.Close();



        }
        else 
        {

            return;
        }


    }

【问题讨论】:

    标签: c# logging


    【解决方案1】:

    您可以附加到文件中的文本。

    File.AppendText

    using (StreamWriter sw = File.AppendText(pathofFile)) 
            {
                sw.WriteLine("This");
                sw.WriteLine("is Extra");
                sw.WriteLine("Text");
            }
    

    其中 pathofFile 是要附加到的文件的路径。

    【讨论】:

      【解决方案2】:

      看看使用这样的东西:

      StreamWriter fw = new StreamWriter(@"C:\Logs\MyFile.txt",true);
      fw.WriteLine("Some Message" + Environment.Newline);
      fw.Flush();
      fw.Close();
      

      希望对您有所帮助。更多信息请见MSDN StreamWriter

      更新:删除旧示例

      此外,如果您尝试创建唯一文件,您可以使用 Path.GetRandomFileName() 再次来自 MSDN 书籍:

      GetRandomFileName 方法返回一个 加密性强,随机 可以用作任一字符串 文件夹名或文件名。

      更新在下面添加了一个 Logger 类示例

      向您的项目添加一个新类并添加以下行(这是 3.0 类型语法,因此如果创建 2.0 版本,您可能需要进行调整)

      using System;
      using System.IO;
      
      namespace LogProvider
      {
          //
          // Example Logger Class
          //
          public class Logging
          {
              public static string LogDir { get; set; }
              public static string LogFile { get; set; }
              private static readonly Random setere = new Random();
              private const string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
      
              public Logging() {
                  LogDir = null;
                  LogFile = null;
              }
      
              public static string RandomFileName()
              {
                  char[] buffer = new char[5];
                  for (int i = 0; i < 5; i++)
                  {
                      buffer[i] = chars[setere.Next(chars.Length)];
                  }
                  return new string(buffer);
              }
      
      
              public static void AddLog(String msg)
              {
                  String tstamp = Convert.ToString(DateTime.Now.Day) + "/" +
                                  Convert.ToString(DateTime.Now.Month) + "/" +
                                  Convert.ToString(DateTime.Now.Year) + " " +
                                  Convert.ToString(DateTime.Now.Hour) + ":" +
                                  Convert.ToString(DateTime.Now.Minute) + ":" +
                                  Convert.ToString(DateTime.Now.Second);
      
                  if(LogDir == null || LogFile == null) 
                  {
                     throw new ArgumentException("Null arguments supplied");
                  }
      
                  String logFile = LogDir + "\\" + LogFile;
                  String rmsg = tstamp + "," + msg;
      
                  StreamWriter sw = new StreamWriter(logFile, true);
                  sw.WriteLine(rmsg);
                  sw.Flush();
                  sw.Close();
              }
          }
      }
      

      将此添加到您的表单加载事件中

      LogProvider.Logging.LogDir = "C:\\Users\\Ece\\Documents\\Testings";
      LogProvider.Logging.LogFile = LogProvider.Logging.RandomFileName();
      

      现在调整你的按钮点击事件如下:

      DialogResult dia = MessageBox.Show("Wanna continue?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
      if (dia == DialogResult.Yes)
      {
          StringBuilder logMsg = new StringBuilder();
          logMsg.Append("Name Surname:" + text1.Text + text2.Text + Environment.NewLine);
          logMsg.Append("Other:" + text3.Text + text4.Text + Environment.NewLine);
          logMsg.Append("Money:" + textBox1.Text + " TL." + Environment.NewLine);
          logMsg.Append("*************************************" + Environment.NewLine);
          LogProvider.Logging.AddLog(logMsg.ToString());
      } else
      {
          return;
      }
      

      现在您应该在应用程序运行的整个过程中只创建一个文件,并且每次单击按钮时都会记录到该文件。

      【讨论】:

      • 我没有使用 GetRandomFileName,因为我需要自己编写一个方法。我也没有得到 TRUE 更改的内容,它仍然创建多个文件而不是写入一个文本文件。
      • 那是因为您创建文件名的方式。如果您只关注 1 个文件,则仅在第一次创建一个唯一文件。
      【解决方案3】:

      您可能想看看log4net 和 RollingFileAppender

      【讨论】:

        【解决方案4】:

        当然。只需打开文件以追加类似System.IO.File.AppendText

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-03
          • 2016-05-11
          • 2015-02-04
          • 2021-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多