用EventLog类读取和写入系统日志

3 篇文章 0 订阅

作为商业应用程序,尤其是WEB下的应用程序,安全问题是第一位的。这里所说的安全包括两个方面,一是系统本身的安全,也就是系统本身的强壮性,另一方面是系统在使用时,用户的误操作,或恶意破坏时引起的安全问题。 
   
  本文并不想介绍系统全方面的问题,如果你有兴趣的可以去查阅相关资料。这里,我想要介绍的是如何在系统发生错误,或者遭到破坏时,如何把相关信息记录下来。比如,当有人试图非法登录的时候,如何记录下时间,他所在机器的IP等一系列信息,以便管理员采取相关的措施。 
   
  有两种方式可供选择,一是将相关信息写入指定的数据库的表中。另一种方法就是写入系统日志文件里。将信息写入数据库,在.NET环境下,需要实例化许多对象,如SqlConnection ,SqlCommand 等,还要进行数据库的连接等工作,仅仅是为了插入一条记录。相对来说,这种方式比较消耗系统资源,如果,系统本身就没有数据库支持,那么这种方法根本不可行。本文要介绍的是第二种方式,将信息写入系统日志。 
   
  在.NET的System.Diagnostics命名空间里提供了几个类,专门用来操作系统日志。 
   
  一:向日志里写入信息 
   
  首先,我们要引用System.Diagnostics命名空间。然后,我们来实例化EventLog类,我们的大部分工作都是用这个类来完成。 
 EventLog sample=new EventLog(); 
  该类提供的WriteEntry方法,让我们将信息写入系统日志,一般是写入应用程序日志里。方法的定义如下 
 public void WriteEntry( 
   string source, 
   string message, 
   EventLogEntryType type, 
   Int eventID, 
   short category, 
   byte[] rawData 
  );


  例如:  

EventLog.WriteEntr("sourcei","message",EventLogEntryType.Warning ,11,21); 


  介绍一下该方法参数的含意。 
   
  1) Source 表示记录的来源,字符串型 
   
  2) Message 表示记录的相关信息,字符串型 
   
  3) Type 表示记录类型,是枚举类型,有以下选项 
   
  ü Error 错误 
   
  ü Warning 警告 
   
  ü Information 信息 
   
  ü SuccessAudit 成功审核 
   
  ü FailureAudit 失败审核 
   
  4) EventID 表示事件ID号,整型 
   
  5) Category 表示事件的分类,短整型 
   
  6) RawData 记录和事件相关的二进制信息,字节数组 
   
  试一下,在事件查看器的应用程序日志里,你会看到刚插入的记录。 
   
   
   
  二:从日志里读取信息 
   
  从日志里读取信息,我们需要使用的是EventLog的Entries方法,该方法返回的是一个集合类EventLogEntryCollection的实例,在该集合类中储存的是EventLogEntry类的实例,该类中存储了日志里各记录的信息。我们可以用以下的程序来返回日志信息。 
   
  首先,我们要实例化一个EventLog类 
EventLog sample=new EventLog(); 
  和写入信息不同的是,我们在这需要指定我们从那个日志里读记录 
   
sample.Log="Application"; 
 
  我们指定的是应用程序日志,当然,我们可以选择别的日志,比如系统日志System,还有安全日志Security 
   
  声明一个EventLogEntryCollection类并给它赋值 
 EventLogEntryCollection myCollection=sample.Entries;

  这样,应用程序日志里的信息都存放在了myCollection对象中,我们可以来读取其中的信息。 
   
  我们用foreach语句来访问myCollection中的所有EventLogEntry对象 
foreach(EventLogEntry test in myCollection) 
   
   { 
   
   Console.WriteLine(test.Message,test.Source,test.EventID); 
   
   } 
  这样,你就可以在屏幕上看到日志里的一些信息,当然,你还可以访问EventLogEntry对象的其他属性来获取你所需要的信息。 
   
  本文只是简要介绍了一下如何读写系统的日志文件的方法,有很多细节并没有详细介绍,比如,如何读写别人机器的日志,如何出错处理等,有兴趣的化可以参考MSDN


using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;


namespace Log
{
    class LogWirter
    {
        /// <summary>
        /// 事件源名称
        /// </summary>
        private string eventSourceName;
        EventLogEntryType eventLogType;
        public LogWirter()
        {
            eventSourceName = "test";
            eventLogType = EventLogEntryType.Error;
        }


        /// <summary>
        /// 消息事件源名称
        /// </summary>
        public string EventSourceName
        {
            set { eventSourceName = value; }
        }


        /// <summary>
        /// 消息事件类型
        /// </summary>
        public EventLogEntryType EventLogType
        {
            set { eventLogType = value; }
        }


        /// <summary>
        /// 写入系统日志
        /// </summary>
        /// <param name="message">事件内容</param>
        public void LogEvent(string message)
        {
            if (!EventLog.SourceExists(eventSourceName))
            {
                EventLog.CreateEventSource(eventSourceName, "Application");
            }
            EventLog.WriteEntry(eventSourceName, message, EventLogEntryType.Error);
        }
    }
用C#语言编写了一个系统日志方法,请看以下示例:

public void WriteEventLog(string argMessage,string argType,int argID,short argCategory, byte[] argRawData)
   { 
   string strMessage = ""; 
   if (argMessage != null)
    {
     strMessage = argMessage;
    }
    EventLogEntryType enEntryType = EventLogEntryType.Error;
    if ((argType == null) || (argType.Length <= 0))
    {
     enEntryType = EventLogEntryType.Error;
    }
    else
    {
     if (argType.Substring(0, 1) == "I")
     {
      enEntryType = EventLogEntryType.Information;
     }
     else
     {
      if (argType.Substring(0, 1) == "W")
      {
       enEntryType = EventLogEntryType.Warning;
      }
     }
    }


   EventLog eventLog = new EventLog("Application");
    eventLog.Source = "xxx系统";
   lock(eventLog)
    {
     if(m_EventLogFlg==false)
     {
      eventLog.WriteEntry(strMessage, enEntryType, argID, argCategory, argRawData);
     }
    }
   }



转自:http://jinyingboke.blog.163.com/blog/static/99308485201022814542452/


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值