首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

構建 ASP.NET MVC4+EF5+EasyUI+Unity2.x 後台管理系統(11):系統日誌與例外處理基礎建設 - 資料模型與資料表設計

     編輯:關於ASP.NET

系統上線後,操作審計與錯誤診斷是維運的雙核心需求。本篇奠基日誌與例外處理機制:設計資料庫日誌表、建立 EF 實體模型、引入虛擬用戶上下文,為後續的日誌記錄、例外捕獲、全域錯誤處理鋪路。

為什麼需要系統日誌?

  • 合規審計:滿足資安法規、ISO 27001、SOX 等合規要求
  • 問題診斷:快速定位生產環境 Bug,還原使用者操作路徑
  • 效能分析:統計高頻操作模組、識別效能瓶頸
  • 安全監控:偵測異常登入、權限嘗試、資料異常存取
  • 業務洞察:分析使用者行為模式,優化產品體驗

虛擬用戶上下文:開發期暫時方案

在權限系統完成前,先建立臨時用戶模型供日誌記錄使用:

// App.Models/Sys/AccountModel.cs
namespace App.Models.Sys {
    public class AccountModel {
        public string Id { get; set; }
        public string TrueName { get; set; }
    }
}

在 HomeController 或 AccountController 初始化:

public ActionResult Index() {
    // 模擬登入用戶(正式環境由驗證系統提供)
    var account = new AccountModel { Id = "admin", TrueName = "系統管理員" };
    Session["Account"] = account;
    return View();
}

資料庫日誌表設計:SysLog

USE [YourDB]
GO

CREATE TABLE [dbo].[SysLog] (
    [Id] [varchar](50) NOT NULL PRIMARY KEY,           -- GUID 主鍵
    [Operator] [varchar](50) NULL,                     -- 操作人帳號/姓名
    [Message] [varchar](500) NULL,                     -- 操作詳情/例外堆疊
    [Result] [varchar](20) NULL,                       -- 結果:Success/Fail/Exception
    [Type] [varchar](20) NULL,                         -- 類型:Create/Edit/Delete/Query/Login/Error
    [Module] [varchar](20) NULL,                       -- 業務模組:SysSample/SysUser/SysRole...
    [CreateTime] [datetime] NULL                       -- 操作時間
) ON [PRIMARY]
GO

-- 索引優化常見查詢
CREATE INDEX IX_SysLog_CreateTime ON SysLog(CreateTime DESC);
CREATE INDEX IX_SysLog_Operator ON SysLog(Operator);
CREATE INDEX IX_SysLog_Module_Type ON SysLog(Module, Type);

EF 實體模型:SysLogModel

// App.Models/Sys/SysLogModel.cs
using System;
using System.ComponentModel.DataAnnotations;

namespace App.Models.Sys {
    public class SysLogModel {
        [Display(Name = "ID")]
        public string Id { get; set; }
        
        [Display(Name = "操作人")]
        public string Operator { get; set; }
        
        [Display(Name = "訊息")]
        public string Message { get; set; }
        
        [Display(Name = "結果")]
        public string Result { get; set; }
        
        [Display(Name = "類型")]
        public string Type { get; set; }
        
        [Display(Name = "模組")]
        public string Module { get; set; }
        
        [Display(Name = "建立時間")]
        public DateTime? CreateTime { get; set; }
    }
}

日誌記錄策略設計

層級記錄時機記錄內容範例
ControllerAction 執行前/後操作類型、參數、結果、耗時Create、Edit、Delete、Export
Service/BLL業務規則驗證失敗違反規則詳情、相關實體 ID庫存不足、權限不足、狀態衝突
Repository/DAL資料庫例外、DeadlockSQL 指令、參數、堆疊追蹤Connection Timeout、PK Violation
Global.asax未處理例外、404、500完整例外物件、請求 URL、用戶代理NullReference、SqlException

日誌記錄原則

  1. 分級記錄:Info(一般操作)、Warn(業務異常)、Error(系統例外)、Fatal(系統崩潰)
  2. 關鍵資訊完整:誰、何時、何地、做什麼、結果如何、耗時多少
  3. 敏感資料脫敏:密碼、信用卡、身分證字號等不可明文寫入日誌
  4. 非同步寫入:高併發場景下採用佇列 + 背景工作寫入,避免阻塞請求執行緒
  5. 結構化日誌:採用 JSON 格式,便於 ELK/Splunk 等日誌平台索引分析

介面契約定義

// App.IBLL/Sys/ISysLogBLL.cs
namespace App.IBLL.Sys {
    public interface ISysLogBLL {
        int Create(SysLogModel entity);
        IQueryable GetList(string operatorName, string module, string type, DateTime? startTime, DateTime? endTime, int page, int rows);
        int GetTotalCount(string operatorName, string module, string type, DateTime? startTime, DateTime? endTime);
        // 可選:統計分析方法
        Dictionary GetModuleOperationStats(DateTime start, DateTime end);
        Dictionary GetErrorTrend(int days);
    }
}

後續規劃預告

接下來三講將完整實作:

  1. 第 12 講:通用工具類 ResultHelper、日誌處理器 LogHandler、Controller 整合實戰
  2. 第 13 講:Application_Error 全域例外處理、自訂錯誤頁面、web.config 配置
  3. 第 14 講:日誌查詢介面、統計儀表板、匯出功能、清理策略

扎實的日誌基礎設施是系統可觀測性的基石,投入前期設計成本,將在後期維運中獲得百倍回報。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved