如何在不使用第三方库的情况下登录C#?

如何在不使用第三方库的情况下登录C#?,c#,.net,winforms,performance,logging,C#,.net,Winforms,Performance,Logging,我希望在我的应用程序中实现日志记录,但不希望使用任何外部框架,如log4net 所以我想对一个文件做一些类似DOS的操作。最有效的方法是什么 有没有一种方法可以在不使用外部框架的情况下记录未处理的异常 我宁愿不在外面用 像log4j.net这样的框架 为什么??Log4net可能会满足您的大部分需求。 例如,请检查此类: Log4net有很好的文档记录,web上有上千种资源和用例。公共void Logger(字符串行) { //将字符串写入文件。启用追加模式,以便日志 //将行附加到test.t

我希望在我的应用程序中实现日志记录,但不希望使用任何外部框架,如log4net

所以我想对一个文件做一些类似DOS的操作。最有效的方法是什么

有没有一种方法可以在不使用外部框架的情况下记录未处理的异常

我宁愿不在外面用 像log4j.net这样的框架

为什么??Log4net可能会满足您的大部分需求。 例如,请检查此类:

Log4net有很好的文档记录,web上有上千种资源和用例。

公共void Logger(字符串行)
{
//将字符串写入文件。启用追加模式,以便日志
//将行附加到test.txt,而不是擦除内容并写入日志
使用(System.IO.StreamWriter file=new System.IO.StreamWriter(“c:\\test.txt”,true))
{
文件写入线(行);
}
}

要了解更多信息,我过去常常编写自己的错误日志,直到发现错误。我从来没有像ELMAH那样完美地记录过电子邮件部分。

您可以直接写入事件日志。检查以下链接:

这是来自MSDN的样本:

using System;
using System.Diagnostics;
using System.Threading;

class MySample{

    public static void Main(){

        // Create the source, if it does not already exist.
        if(!EventLog.SourceExists("MySource"))
        {
             //An event log source should not be created and immediately used.
             //There is a latency time to enable the source, it should be created
             //prior to executing the application that uses the source.
             //Execute this sample a second time to use the new source.
            EventLog.CreateEventSource("MySource", "MyNewLog");
            Console.WriteLine("CreatedEventSource");
            Console.WriteLine("Exiting, execute the application a second time to use the source.");
            // The source is created.  Exit the application to allow it to be registered.
            return;
        }

        // Create an EventLog instance and assign its source.
        EventLog myLog = new EventLog();
        myLog.Source = "MySource";

        // Write an informational entry to the event log.    
        myLog.WriteEntry("Writing to event log.");

    }
}

如果您想保持接近.NET请签出企业库日志记录应用程序块。看。或进行快速入门教程检查。我使用了企业库中的验证应用程序块,它非常适合我的需要,并且非常容易在项目中“继承”(安装并引用它!)

如果您想要自定义错误日志,您可以轻松编写自己的代码。我会给你一个我的一个项目的片段

public void SaveLogFile(object method, Exception exception)
{
    string location = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\FolderName\";
    try
    {
        //Opens a new file stream which allows asynchronous reading and writing
        using (StreamWriter sw = new StreamWriter(new FileStream(location + @"log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite)))
        {
            //Writes the method name with the exception and writes the exception underneath
            sw.WriteLine(String.Format("{0} ({1}) - Method: {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), method.ToString()));
            sw.WriteLine(exception.ToString()); sw.WriteLine("");
        }
    }
    catch (IOException)
    {
        if (!File.Exists(location + @"log.txt"))
        {
            File.Create(location + @"log.txt");
        }
    }
}
然后,要真正写入错误日志,只需写入(
q
是捕获的异常)


如果您正在寻找一种真正简单的方法来记录日志,那么您可以使用这一行程序。如果文件不存在,则创建该文件

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");


原因是我从未在.net中使用过任何外部libs,所以我首先需要学习如何使用;)只需添加对项目的引用并放置一些xml配置,这非常简单。谷歌log4net教程,选择最适合你的。使用Nuget。使用外部图书馆将成为一种乐趣为什么会有这么多人投票?问题指出OP不想使用外部框架,并明确提到不需要Log4net。当然这应该是评论,而不是回答?@Ryanfasescotland你是对的,也许它不适合OP,但请不要忘记这是一个公共网站。由于问题的标题仅说明“如何登录c#”,像我这样对使用任何库都很在行的人也会在这里登陆,并发现这个答案很有用。事实上,这条线索是我在谷歌搜索“c#logging”时的第一个结果。我会看看它,我的理由请查看我的empi的评论。ELMAH非常直截了当,一点都不好笑,你可以直接把它放到你的网络配置中,在其中添加几行代码,它就可以正常工作了。此外,就你需要知道你的应用程序何时即将/开始崩溃而言,我发现elmah比其他大多数应用程序都好,因为它能够发送电子邮件,因此,只要服务器处于运行状态,您就会收到来自elmah的错误电子邮件。您知道,当文件尚不存在时,您将错过第一个条目吗?您应该在文件上使用
using
,但因为它是本地的,所以方法很快就会被禁用。同时请记住,当
file.WriteLine(行)时
抛出异常,代码永远不会命中
file.Close()。使用
using
等同于
尝试{//using block}最后{//Dispose}
。这意味着即使
using
块中的代码抛出异常,也会释放对象,如果在日志记录完成之前再次调用此方法会怎么样?您将引发一个错误-进程无法访问文件“C:\test.txt”,因为另一个进程正在使用该文件。有人知道这个问题吗?在不同的课堂上使用相同的事件日志的最佳实践是什么?在构造函数中将其作为参数传递?从某个单例类静态访问它?或者更好?这个解决方案的问题是它增加了IO操作。因此,不建议将其用于日志批处理算法operations@RamiYampolsky,我不明白你的意思。@dan gph如果你实现了一些执行大量CPU操作的代码,如果在这段代码中进行日志记录,那么你“浪费”了一些用于日志记录的时间,而不是你试图实现的实际算法。所以你更喜欢在尽可能短的时间内“浪费”时间。执行上面示例中的IO操作非常长,因此,如果代码中有大量日志命令,那么整个执行过程可能会慢1000倍左右@RamiYampolsky,我刚刚让代码循环了100000次,花了10秒。这就是每秒10000个日志条目,即每个条目0.01微秒。如果您在1秒内记录了10件事情,则需要0.1微秒。所以不,这一点开销都不多。@dangph我的答案与不同的用例相关。为了简单起见,尝试执行100000次循环以进行一些计算,只需执行sum+=i,然后执行日志。无论是否使用日志,都可以尝试使用内置日志。
以下是+的列表。网络上有很多手册,[或者Jeff Atwood的这本手册](我觉得企业库比log4net更好。如果您只需要简单的控制台日志记录,System.Diagnostics.Tracing可能适合您。Trace可以像console(Trace.WriteLine)一样使用。
System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");