动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   .Net → 阅读文章

 使用ASP.NET 顯示事件日誌紀錄

作者来源: 
阅读 1481 人次 , 2006-3-29 4:33:00 

在 windows 2000 (或 nt) 的事件日誌對管理者來說可說是最重要的訊息來源,因為所有的發生的事件都會紀錄在那裡 ─ 從成功到嚴重性的失敗。由於是如此的重要,那麼要是能夠透過 web 來使用,可不是更能突顯嗎?

大家應該對事件檢視器不會陌生,在這篇文章我將說明如何使用 asp.net 和 .net framework sdk 能夠完美地仿效列出日誌。為了讓讀者作為練習,我先保留對於網頁呈現詳細紀錄細節的建置。

使用這篇文章的原始碼在你的 webserver 上必須安裝 microsoft .net framework sdk。 同時我也假設讀者對 c# 程式有一定程度的認識。

暴力手段法

為了能更迅速且又不是那麼的乾淨俐落手段,我們可以好好利用過去對 asp 的知識來產生一系列事件。(即使是 table,雖然這個範例並不是要做 table)。程式的名稱也就是這個玩意的名稱: simple.aspx.

<% @page language="c#" %>
<% @import namespace="system.diagnostics" %>
<%
eventlog alog = new eventlog();
alog.log = "system";
alog.machinename = ".";  // local machine
string strimage = "";  // icon for the event

response.write("<p>there are  " + alog.entries.count + 
         " entries in the system event log.</p>");
		   
foreach (eventlogentry entry in alog.entries) 
{
  switch (entry.entrytype)
  {
    case eventlogentrytype.warning:
      strimage = "warning.png";
      break;
    case eventlogentrytype.error:
      strimage = "error.png";
      break;
    default:
      strimage = "info.png";
      break;
  }
  response.write("<img src=\"" + strimage + "\">&nbsp;|&nbsp;");
  response.write(entry.timegenerated.tostring() + "&nbsp;|&nbsp;");
  response.write(entry.source + "&nbsp;|&nbsp;");
  response.write(entry.eventid.tostring() + "<br>\r\n");
}
%>

事件日誌的類別可以在這個名稱空間找到 system.diagnostics,必須將它放在網頁開始的地方。打開日誌本身就是很直接: 產生新的 eventlog 物件, 指明 logmachinename ("." 是本地端的機器)。然後我們就準備讀取事件日誌。

我們使用 foreach 迴圈來完成這個工作。為使呈現不會那麼的缺乏創意,我在每一個紀錄錢都放一個正確的圖案,列出的紀錄與檢視器一般的順序相反: 過去的紀錄會列為最優先。

使用 datagrid 更完美

在 asp.net 中有許多的創新,特別是在資料的展示,而且更棒的是資料並不一定要來自資料庫中。對 datagrid web control 也是如此,也就如其名稱一樣,從資料中產生 table (grid)。唯一需求視資料來源必須是支援 icollection 介面 ─ 也就是使用 eventlog 的集合 entries

以下的原始碼 (speccolsonly.aspx) 說明了使用 datagrid 是如此的簡單:

<% @page language="c#" %>
<% @import namespace="system.diagnostics" %>
<script language="c#" runat="server">
void page_load(object sender, eventargs e) 
{
  eventlog alog = new eventlog();
  alog.log = "system";
  alog.machinename = ".";
  
  loggrid.datasource = alog.entries;
  loggrid.databind();
}
</script>

datagrid 控制項 (接下來的程式) 只包含格式化的指令,沒有其他。grid 是藉由 page_load 事件來填補進去,就這樣打開了事件日誌,然後分配 entries (紀錄) 作為 datagrid 的 datasource 屬性。隨著呼叫 databind 資料就湧進了 table 中 ─ 但是我們只用到欄位,如下複製圖像所示:

這樣的限制完成工作都是在 datagrid 本身的標籤 (speccolsonly.aspx 包含完整程式碼):

<form runat="server">
<asp:datagrid id="loggrid" runat="server"
    bordercolor="black"
    borderwidth="1"
    gridlines="both"
    cellpadding="3"
    cellspacing="0"
    font-name="verdana"
    font-size="8pt"
    headerstyle-backcolor="#aaaadd"
    autogeneratecolumns="false">
    <columns>
      <asp:boundcolumn headertext="tof" datafield="entrytype" />
      <asp:boundcolumn headertext="date/time" datafield="timegenerated"/>
      <asp:boundcolumn headertext="source" datafield="source"/>
      <asp:boundcolumn headertext="event id" datafield="eventid"/>
    </columns>
</asp:datagrid>
</form>

首要的步驟就是設定 autogeneratecolumns 屬性為 false,這樣一來可避免自動顯示所有屬性。現在我們藉可以指明我們所要的欄位。

我使用了四個繫結欄位 (繫結到資料來源),headertext 會呈現在最上一列,而在 datafield 中會讀取屬性來填入所給予的欄位中。

範例中我故意將欄位的設定用得簡單一點。還有許多的欄位型態,而當你開始會使用格式化來把玩欄位時,對設計者來說倒是可以讓你 "瘋狂似的" 好好玩一玩呢!你可以在 quickstart tutorial 找到更多的範例。

 

datagrid 中使用分頁

為了完成工作,我使用另一個 datagrid 特色,db 程式設計師應該都很熟識 ─ 分頁。datagrid 的好處就是分頁幾乎不會用到任何的程式碼,看起來就像這樣:

這一次我將整個原始碼 paging.aspx 放進文章中方便閱讀:

<% @page language="c#" %>
<% @import namespace="system.diagnostics" %>
<script language="c#" runat="server">
void page_load(object sender, eventargs e) 
{
  bindgrid();
}

void loggrid_change(object sender, datagridpagechangedeventargs e) 
{
  // set currentpageindex to the page the user clicked.
  loggrid.currentpageindex = e.newpageindex;

  // rebind the data. 
  bindgrid();
}
 
void bindgrid() 
{
  eventlog alog = new eventlog();
  alog.log = "system";
  alog.machinename = ".";
  
  loggrid.datasource = alog.entries;
  loggrid.databind();
}
</script>
<body bgcolor="#ffffff">

<h3>system event log</h3>

<form runat="server">
<asp:datagrid id="loggrid" runat="server"
    allowpaging="true"
    pagesize="10"
    pagerstyle-mode="numericpages"
    pagerstyle-horizontalalign="right"
    pagerstyle-nextpagetext="next"
    pagerstyle-prevpagetext="prev"
    onpageindexchanged="loggrid_change"
    bordercolor="black"
    borderwidth="1"
    gridlines="both"
    cellpadding="3"
    cellspacing="0"
    font-name="verdana"
    font-size="8pt"
    headerstyle-backcolor="#aaaadd"
    autogeneratecolumns="false">
    <columns>
      <asp:boundcolumn headertext="tof" datafield="entrytype" />
      <asp:boundcolumn headertext="date/time" datafield="timegenerated"/>
      <asp:boundcolumn headertext="source" datafield="source"/>
      <asp:boundcolumn headertext="event id" datafield="eventid"/>
    </columns>
</asp:datagrid>
</form>

</body>
</html>

首要的改變可在 datagrid 控制項上找到:

allowpaging="true"
pagesize="10"
pagerstyle-mode="numericpages"
pagerstyle-horizontalalign="right"
pagerstyle-nextpagetext="next"
pagerstyle-prevpagetext="prev"
onpageindexchanged="loggrid_change"

二個最重要的屬性分別在第一列和最後一列: allowpagingonpageindexchanged。 第一列代表分頁,最後一列代表當更換到另一頁時會觸發事件方法。其他的屬性都只是裝飾性質。

由於這個範例我們所使用的是集合而不是資料庫提供的資料,我使用得很簡單: 我只是將資料繫結至 grid 中。為了更好的執行效能 ─ 特別是對資料庫來說 ─ 在這個 "小程式" 中資料會被重新載入。

結論

今天文章真正的目的並不是完全在於事件日誌,而是在說明 datagrid 的使用非常多樣化,而不是僅止於應用程式上資料庫程式設計上的欄位而已。有許多的功能可以使用,然而,要編輯事件日誌紀錄 (唯讀) 就沒有什麼意義,當然也就不能使用了這個功能了。

 本文TagsC#  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:隨心所欲產生圖案
· 下一篇:ASP.net随机数应用实例
· 深入讲解 ASP+ 验证(四)
· ASP.NET创建XML Web服务全接触(14)
· 在.NET中轻松获取系统信息(1) -WMI篇
· 根据数据库生成xml二法
· SOAP Version 1.2中文手冊(5)


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077