【问题标题】:Error Logging in C# WebsiteC# 网站中的错误日志记录
【发布时间】:2013-01-10 20:54:48
【问题描述】:

我计划编写类似于this 的错误日志记录:

public static void WriteError(string errorMessage)
    {
        try
        {
            string path = "~/Error/" + DateTime.Today.ToString("dd-mm-yy") + ".txt";
            if (!File.Exists(System.Web.HttpContext.Current.Server.MapPath(path)))
            {
                File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).Close();
            }
            using (StreamWriter w = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path)))
            {
                w.WriteLine("\r\nLog Entry : ");
                w.WriteLine("{0}", DateTime.Now.ToString(CultureInfo.InvariantCulture));
                string err = "Error in: " + System.Web.HttpContext.Current.Request.Url.ToString() +
                              ". Error Message:" + errorMessage;
                w.WriteLine(err);
                w.WriteLine("__________________________");
                w.Flush();
                w.Close();
            }
        }
        catch (Exception ex)
        {
            WriteError(ex.Message);
        }

    }

我的问题是:既然是网站,我会同时拥有多个用户。在那种情况下,如果多个用户同时遇到异常并尝试写入同一个文件,它会再次给我一个异常对吗?在这种情况下,如何为同时用户正确实现错误日志记录?或者这会起作用吗?

提前致谢。

【问题讨论】:

  • 记录错误的好主意,尝试推出自己的日志框架的糟糕主意。如答案中所述,请查看 log4net - 超级易于使用,并且通过配置设置调整日志记录非常灵活。此外,它还为记录警告和其他信息提供了强大的支持,而不仅仅是错误。

标签: c# asp.net .net logging error-handling


【解决方案1】:

我建议您使用已建立的日志记录框架,例如 NLoglog4net。我过去在很多项目中都使用过 log4net,它完美地处理了这种情况。

编辑:

正如进一步的评论,以及处理来自多个线程的日志消息,log4net 还允许您管理日志文件的增长量,并通过RollingFileAppender 提供内置的滚动日志机制。

【讨论】:

  • 谢谢,我会仔细检查建议的框架并选择一个!
【解决方案2】:

除了使用 NLog 或其他日志库之外,您锁定这种情况的方式是使用互斥锁。我建议mutex,而不是lock(),因为它可以捕获所有可能引发错误的池/线程。

在 MSDN 上有关于 mutex 的详细信息和示例:

http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx

一个简单的例子

public static void WriteError(string errorMessage)
{
    var mut = new Mutex(true, "LogMutexName");

    try
    {   
        // Wait until it is safe to enter.
        mut.WaitOne();

        // here you open write close your file
    }
    finally
    {
        // Release the Mutex.
        mut.ReleaseMutex();
    }   
}

【讨论】:

  • 我很可能会使用 log4net,但很高兴知道如何自己克服这个特殊问题!谢谢!
猜你喜欢
  • 2013-06-30
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2020-03-19
  • 2013-04-22
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多