将错误信息记录到Windows日志中

时间:2022-09-17 07:26:25

任何一个系统都不可能一劳永逸,一直没有错误的运行下去,一个优秀的系统的出错处理也一定是优秀的,而一个好的程序员也一定会很观注可能出错的地方,并作出相应的容错处理。C#中的try catch其实已经为我们省了不少事情,本文并不是并不是对如何做出错处理进行论述的,而是给出一种收集出错信息,并将出错信息存储到Windows日志中的方案。

一、处理代码:

using  System;
using  System.Collections.Generic;
using  System.Web;
using  System.Diagnostics;

///   <summary>
///  功能:错误日志类,将错误信息按指定事件日志名记录在系统日志
///   </summary>
public   static   class  Error
{
    
///   <summary>
    
///  记录日志
    
///   </summary>
    
///   <param name="sourceName"> 日志资源名,如:Town </param>
    
///   <param name="message"> 错误信息 </param>
     public   static   void  Log( string  sourceName,  string  message)
    {
        EventLog eventLog 
=   null ;

        
//  确定日志是否存在
         if  ( ! (EventLog.SourceExists(sourceName)))
        {
            EventLog.CreateEventSource(sourceName, sourceName 
+   " Log " );
        }

        
if  (eventLog  ==   null )
        {
            eventLog 
=   new  EventLog(sourceName  +   " Log " );
            eventLog.Source 
=  sourceName;
        }

        
//  记录日志信息
        eventLog.WriteEntry(message, System.Diagnostics.EventLogEntryType.Error);
    }
}

注意:因为系统日志的操作是有权限控制的,所以我们还要把对系统日志操作的权限赋给ASP.net用户,方法如下:“开始->运行”,输入命令“regedt32”,找到“System->CurrentControlSet->Services->Eventlog“,选择“安全->权限->添加”,然后找到本机的“ASP.Net”用户,加进来并且给读取权限就好了,加进来后目录中会多一个“ASP.net_wp account“


二、调用方法

try
{
    ……
}

catch  (Exception ex)
{
    ErrorMessage.Log(
" Town " , ex.ToString());
    
return   false ;
}

 

三、一点说明
系统出错后,会自动将出错信息记录到系统日志中,你可以在“开始->程序->管理工具->事件查看器”中发现一个新的项目“TownLog”,这便是记录出错信息的,如下图所示。

 

相关转载:如何将网页错误信息写入事件日志

        将网页产生的错误信息保存到系统的事件日志中,那么网站错误信息的查看和维护时间的选择就比较灵活。下面介绍如何实现:

System.Diagnostics命名空间提供了写入Windows事件日志的类。使用时须先导入。

EventLog类提供了检测或创建日志的静态方法,被实例化后可以使用编程的方式写入日志项。一般情况下将程序代码放在Global.asax的Application_Error事件中,这样能够实现每当应用程序发生异常时便可将错误信息写入应用程序日志。

 

实现代码:

void  Application_Error( object  sender, EventArgs e)
    {
        
// 在出现未处理的错误时运行的代码

        
// 定义写入日志的信息
         string  Message  =   " \n\nURL:\n http://localhost/ "   +   " \n\nSTACK TRACE:n  "   +  Server.GetLastError().Message  +   " \n\nSTACK TRACE:n "   +  Server.GetLastError().StackTrace;

        
// 如果事件日志不存在,则在此创建
         string  LogName  =   " Application " ;
        
if  ( ! System.Diagnostics.EventLog.SourceExists(LogName))
        {
            System.Diagnostics.EventLog.CreateEventSource(LogName, LogName);
        }

        
// 插入事件日志
        System.Diagnostics.EventLog Log  =   new  System.Diagnostics.EventLog();
        Log.Source 
=  LogName;
        Log.WriteEntry(Message, System.Diagnostics.EventLogEntryType.Error);
    }

    
void  Session_Start( object  sender, EventArgs e) 
    {
        
// 在新会话启动时运行的代码

    }

注意:因为系统日志的操作是有权限控制的,所以我们还要把对系统日志操作的权限赋给ASP.net用户,方法如下:

1、打开“控制面板”→ “管理工具” →”计算机管理“→”系统工具“→”本地用户和组“→”用户“

2、双击ASP.NET用户,在弹出的ASP.NET属性窗口中,选择“隶属于”选项卡并添加“Administration”用户,单击确定按钮。

“开始->运行”,输入命令“regedt32”,找到“System->CurrentControlSet->Services->Eventlog“,选择“安全->权限->添加”,然后找到本机的“ASP.Net”用户,加进来并且给读取权限就好了,加进来后目录中会多一个“ASP.net_wp account“

 

PS:

在Win2003系统中我是这样解决ASP.NET 不能写系统日志的:

在注册表: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\EventLog 增加User的完全操纵权限