X-AdminABP框架開發-系統日志

  網站正常運行中有時出現異常在所難免,查看系統運行日志分析問題并能夠根據錯誤信息快速解決問題尤為重要,ABP對于系統運行日志這塊已經做了很好的處理,默認采用的Log4Net已經足夠滿足開發過程中的需要了(當然有需要的話也可以更換為其它日志組件)。

  ABP官網地址:https://aspnetboilerplate.com/

?

一、日志文件

  ABP框架默認使用了Log4Net日志組件,日志記錄在txt文件中,也可以替換成其它日志組件諸如Nlog,方便將日志文件信息直接記錄到數據庫中,具體情形使用具體組件。

  

  當一個文件達到了在Log4Net配置中設置好的文件大小上限時,在文件名后按照數字倒排后開始繼續增加文件。

  

  當需要查看錯誤信息時,直接在日期最近的文件中找出錯誤信息即可,但是這個過程比較繁瑣,還需要從日志文件中去查看,并且日志文件中雖然做了分類,哪些是正常信息,哪些是錯誤信息,但是不太直觀,因此,可以考慮直接將日志文件在頁面中呈現,對信息進一步加工,方便直接查看。

?  

  參考了AbpZero中的部分代碼并根據實際需要進行整合,開始在頁面中設計日志展示層。?

?

二、頁面展示日志信息

1、系統日志服務應屬于整個系統中相對其他業務模塊獨立的一部分,因此,首先在應用層中新建一個Logging文件夾并創建一個日志應用層服務接口與其實現。在接口中聲明兩個方法,直接查看當前最近的日志文件中的日志信息以及從服務器下載所有的日志文件。

/// <summary>
/// 網站運行日志應用層服務
/// </summary>
public interface IWebSiteLogAppService : IApplicationService
{/// <summary>/// 獲取最近的一個日志文件/// </summary>/// <returns></returns>
    GetLatestWebLogsOutput GetLatestWebLogs();/// <summary>/// 下載所有的日志文件/// </summary>/// <returns></returns>
    FileDto DownloadWebLogs();
}

?  首先考慮直接獲取最近的日志文件信息,直接讀取即可,遵循的規則是讀取指定文件夾下指定文件后綴名更改日期為最大的文件然后從中讀取日志信息,并返回到前端。

public GetLatestWebLogsOutput GetLatestWebLogs()
{var directory = new DirectoryInfo(AppConsts.LogFilePath);if (!directory.Exists){return new GetLatestWebLogsOutput{LatestWebLogLines = new List<string>()};}var lastLogFile = directory.GetFiles("*.txt", SearchOption.AllDirectories).OrderByDescending(f => f.LastWriteTime).FirstOrDefault();if (lastLogFile == null){return new GetLatestWebLogsOutput();}var lines = AppFileHelper.ReadLines(lastLogFile.FullName).Reverse().Take(1000).ToList();var logLineCount = 0;var lineCount = 0;foreach (var line in lines){if (line.StartsWith("DEBUG") ||line.StartsWith("INFO") ||line.StartsWith("WARN") ||line.StartsWith("ERROR") ||line.StartsWith("FATAL"))logLineCount++;lineCount++;if (logLineCount == 100) break;}return new GetLatestWebLogsOutput{LatestWebLogLines = lines.Take(lineCount).Reverse().ToList()};
}

??

2、在前端處理日志信息,Mvc層中新增一個控制器,并寫一個方法調用日志服務獲取最近的日志文件信息,并處理好權限問題及頁面左側菜單的展示。

/// <summary>
/// 系統維護控制器
/// </summary>
[AbpMvcAuthorize]
public class MaintenanceController : SurroundControllerBase
{private readonly IWebSiteLogAppService _webSiteLogAppService;public MaintenanceController(IWebSiteLogAppService webSiteLogAppService){_webSiteLogAppService = webSiteLogAppService;}/// <summary>/// 首頁/// </summary>/// <returns></returns>public IActionResult Index(){return View();}/// <summary>/// 獲取最近日志信息/// </summary>/// <returns></returns>public JsonResult GetLatestWebLogs(){var getLatestWebLogsOutput = _webSiteLogAppService.GetLatestWebLogs();return Json(getLatestWebLogsOutput);}
}

?  增加一個視圖文件并開始編寫前端代碼獲取日志文件,利用abp前端封裝好的ajax請求快速的獲取日志文件,然后通過layui中提供的徽章進行加工處理,如此一來,通過顏色快速區分哪些是錯誤信息,哪些信息權重更大,更值得關注,此處引用了一個lodash.js,該js中提供了許多的輔助方法。

function getFormattedLogs(logLines) {var resultHtml = '';$.each(logLines, function (index, logLine) {resultHtml += '<span>' + _.escape(logLine).replace('DEBUG', '<span class="layui-badge layui-bg-gray">DEBUG</span>').replace('INFO', '<span class="layui-badge layui-bg-green">INFO</span>').replace('WARN', '<span class="layui-badge layui-bg-orange">WARN</span>').replace('ERROR', '<span class="layui-badge">ERROR</span>').replace('FATAL', '<span class="layui-badge">FATAL</span>') + '</span><br/>';});return resultHtml;
}

?  通過刷新按鈕獲取最近的日志信息。

  

三、下載日志文件

?  也可以直接下載日志文件去分析,當然,從使用頻率講,這個功能的權重遠低于直接頁面查看,但是細想一下,如果說一個異常發生,沒有及時去頁面中查看,那么就得去成堆的日志中翻找,反而凸顯其作用了。

public FileDto DownloadWebLogs()
{var logFiles = GetAllLogFiles();var zipFileDto = new FileDto("WebSiteLogs.zip", MimeTypeNames.ApplicationZip);using (var outputZipFileStream = new MemoryStream()){using (var zipStream = new ZipArchive(outputZipFileStream, ZipArchiveMode.Create)){foreach (var logFile in logFiles){var entry = zipStream.CreateEntry(logFile.Name);using (var entryStream = entry.Open()){using (var fs = new FileStream(logFile.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan)){fs.CopyTo(entryStream);entryStream.Flush();}}}}_tempFileCacheManager.SetFile(zipFileDto.FileToken, outputZipFileStream.ToArray());}return zipFileDto;
}private List<FileInfo> GetAllLogFiles()
{var directory = new DirectoryInfo(AppConsts.LogFilePath);return directory.GetFiles("*.*", SearchOption.TopDirectoryOnly).ToList();
}

?  將日志文件全部讀取出來,然后打包存儲在緩存中,前端點擊下載按鈕時后臺返回壓縮包的標識信息供前端直接下載,此處在控制器中加入一個文件管理的控制器,來作為系統中大部分文件下載的渠道。

var waitIndex = parent.layer.load(2);
abp.ajax({type:"Get",url: "@Url.Action("DownloadWebLogs", "Maintenance")",abpHandleError: false
}).done(function (file) {location.href = '@Url.Action("DownloadTempFile", "File")' + abp.utils.formatString("?fileToken={0}&fileType={1}&fileName={2}", file.fileToken, file.fileType, file.fileName);
}).fail(function (jqXHR) {parent.layer.msg(jqXHR.message, { icon: 5 });
}).always(function () {parent.layer.close(waitIndex);
});

  點擊日志下載,瀏覽器開始執行下載任務。?  

  

  至此,系統日志的頁面查看就完成了,對于加入諸如查詢等更加豐富的功能,可以再進行擴展,也可以考慮直接使用已有的組件更方便的呈現的日志信息而無需手動實現,諸如LogDashBoard等,可以很快速的接入到系統中。?

  代碼地址:https://gitee.com/530521314/Partner.Surround.git

?

2019-08-03,望技術有成后能回來看見自己的腳步

轉載于:https://www.cnblogs.com/CKExp/p/11290808.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248314.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248314.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248314.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[Swift]LeetCode826. 安排工作以達到最大收益 | Most Profit Assigning Work

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號&#xff1a;山青詠芝&#xff08;shanqingyongzhi&#xff09;?博客園地址&#xff1a;山青詠芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;?GitHub地址&a…

H5第四天(1)

boostrap框架介紹 核心知識點 boostrap框架柵格系統[重點,不是難點]基本的全局樣式 學習目標 能夠使用boostrap框架中的基本樣式能夠使用柵格系統完成阿里百秀案例 boostrap框架 介紹 https://www.bootcss.com/ Bootstrap 是最受歡迎的 HTML、CSS 和 JS 框架&#xff0c;用…

javascript基礎入門知識點整理

學習目標:- 掌握編程的基本思維- 掌握編程的基本語法 typora-copy-images-to: mediaJavaScript基礎 HTML和CSS 京東 課前娛樂 眾人皆笑我瘋癲,我笑爾等看不穿 課前說明 目標&#xff1a;掌握編程的基本思想掌握JavaScript的基礎語法,使用常見API(備注)完成相應案例及練習和作業…

學習筆記-canny邊緣檢測

Canny邊緣檢測 聲明&#xff1a;閱讀本文需要了解線性代數里面的點乘&#xff08;圖像卷積的原理&#xff09;&#xff0c;高等數學里的二元函數的梯度&#xff0c;極大值定義&#xff0c;了解概率論里的二維高斯分布 1.canny邊緣檢測原理和簡介 2.實現步驟 3.總結 一、 Canny邊…

H5第四天(2)

Bootstrap框架 Bootstrap框架 為什么要學Bootstrap框架 Bootstrap框架: 為我們提供了用來實現響應式開發的公共資源 總結: Bootstrap框架用來實現響應式布局Bootstrap框架中重點學什么 Bootstrap框架提供了很多豐富的網頁開發資源,代碼有上萬行代碼.1. 重點學習框架中提供的基…

javascript高級實戰學習

學習目標:- 理解面向對象開發思想- 掌握 JavaScript 面向對象開發相關模式- 掌握在 JavaScript 中使用正則表達式- typora-copy-images-to mediaJavaScript 高級 課程介紹 課程大綱 在線地址&#xff1a;JavaScript 高級 目標 理解面向對象開發思想 掌握 JavaScript 面向對象…

H5C3筆記微整合

傳統布局&#xff08;寬度百分比設置&#xff09; 伸縮布局&#xff08;flex&#xff09; 自適應布局&#xff08;lessrem媒體查詢&#xff09; 1、less的使用 2、rem的使用 我的理解&#xff1a; 1、假如想把ui 給的圖片設置在網頁上&#xff0c;給網頁設置個份額值為 x 2、…

如何開發出優秀的APICloud應用

APICloud定制平臺項目實施規范APICloud應用優化策略Top30如何開發出運行體驗良好、高性能的App如何開發出客戶滿意、能夠順利交付的App1. 引擎或模塊問題&#xff1a; 遇到應用層無法解決的問題&#xff0c;如果能確定需要引擎和模塊支持的&#xff0c;不要自己想辦法繞過去&am…

收破爛怎么入行

收破爛分為幾個環節。1、回收&#xff08;回收利用、消息傳遞&#xff0c;消息處理&#xff09;2、集中處理&#xff08;垃圾分類&#xff0c;垃圾測試&#xff0c;垃圾投入使用&#xff0c;成品&#xff09;3、應用&#xff08;垃圾回收再應用&#xff0c;提供給需要資源的單位…

javaScript第一天(2)

javaScript基礎 1. javaScript的由來【了解】 為什么會出現js 早期出現js的原因就是為了解決一個問題: 用戶和瀏覽器(網頁)進行交互其他了解: 系統程序員Brendan Eich 設計了js語言, js語言1借鑒C語言的基本語法; (2)借鑒Java語言的數據類型和內存管理; (3)借鑒Scheme語言&…

WC2018 通道

好久以前開的坑&#xff0e; 到今天才填上&#xff0e; 首先考慮隊第一顆樹邊分&#xff0c;然后分成兩個集合\(L,R\)&#xff0c;在第二棵樹上建出虛樹&#xff0c;在每個路徑\(lca\)處統計答案&#xff0c;維護點集的直徑只有正權很好維護&#xff0e; #include <bits/std…

javaScript第一天(1)

01-JavaScript基礎 核心知識點 javaScript書寫位置javaScript變量javaScript數據類型javaScript數據類型轉換javaScript運算符 今日學習目標 能夠定義一個變量并完成變量的賦值能夠說出每一種具體的數據類型能夠數據類型之間的相互轉化能夠掌握各種運算符的作用 序言 Java…

javaScript第二天(1)

02-JavaScript基礎 1.核心知識點 運算符分支語句 【重點】斷點調試 [查看程序邏輯的一個技能] 2.今日學習目標 能夠掌握js中相關的運算符 能夠掌握理解算數運算符使用及特點能夠掌握賦值運算符的使用及特點能夠掌握一元運算符的使用及特點能夠掌握比較運算符的特點,理解等于…

第四周總結

第四周作業 這次作業屬于哪個課程C語言程序設計這個作業要求在哪里第四周作業我的課程目標全部學會這個作業在那個具體方面幫助我實現目標深入了解二維數組參考文獻教科書一&#xff0c;基礎作業 程序填空題5-1 輸入一個正整數 n (1≤n≤10)和n 階方陣a的元素&#xff0c;如果方…

2019春季學期第四周作業

2019春季學期第四周作業 這個作業屬于那個課程C語言程序設計Ⅰ這次作業要求在哪里2019春季學期第四周作業我在這個課程的目標是我希望能夠更加掌握循環和排序參考文獻無選擇法排序 本題要求將給定的n個整數從大到小排序后輸出。輸入格式&#xff1a; 輸入第一行給出一個不超過1…

javaScript第二天(2)

02JavaScript基礎隨堂筆記 01.運算符[☆] 知識點-算數運算符 作用就是進行 加, 減, 乘, 除 , 取余運算的 算數運算符的重點是通過算數運算和可以實現類型轉換 加號可以實現數據類型轉換: 一個數字和一個空字串相加最后的結果就是字符串減號也可以實現數據類型轉換乘法符號也可…

MFC中的基本知識

轉載于:https://www.cnblogs.com/o8le/archive/2012/05/21/2512178.html

Python中字符串操作函數string.split('str1')和string.join(ls)

Python中的字符串操作函數split 和 join能夠實現字符串和列表之間的簡單轉換&#xff0c; 使用 .split()可以將字符串中特定部分以多個字符的形式&#xff0c;存儲成列表 1 def split(self, *args, **kwargs): # real signature unknown2 """3 …

javaScript第三天(1)

03-JavaScript基礎 1.核心知識點 分支語句 【重點】斷點調試 [查看程序邏輯的一個技能]循環語句[重點 ☆☆☆] 2.今日學習目標 能夠掌握條件判斷分支語句能夠掌握switch分支語句能夠掌握三元表達式分支語句能夠掌握循環語句 條件判斷&#xff08;分支&#xff09; 語法 //…

關于單鏈表的頭插法和尾插法

#include<stdio.h>#include<stdlib.h> typedef struct Node { // 定義的鏈表類型 int data; struct Node *next; }LNode , *Linklist; void print(Linklist L){ //這是一個將鏈表數據輸出的函數 Linklist temL; whi…