c#寫系統日志


作為商業應用程序,尤其是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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM