Web应用程序,简单的日志系统解决方案
创始人
2024-03-15 04:15:58

一、简介

今天介绍一下,当你的程序没有日志系统时,如何快速方便查看当前程序日志的解决方案。如果你的程序有日志系统,可以不看本篇博客哈。本文实例是使用 C# 讲解,当然实现的核心思想适用于其他语言开发的系统。

二、解决方案

这里介绍 DotNet Core 与 DotNet Framework 两种平台的解决方案,这里只讲了核心代码,实际使用可以根据自己的实际情况,加一些限制或者安全效验。

2.1 DotNet Core

如下,新建一个 CustomerService 程序,日志在项目的 Logs 文件夹下
在这里插入图片描述

2.1.1 日志列表

创建一个 LogController Web API,并创建一个 FileList 的 API,这个 API 主要读取日志文件列表,并拼接成 HTML 返回给浏览器

[ApiController]
[Route("[controller]")]
public class LogController : ControllerBase
{private readonly string _logPath = "Logs";[HttpGet][Route(nameof(FileList))]public async Task FileList(){string path = Directory.GetCurrentDirectory() + $"\\{_logPath}";DirectoryInfo directoryInfo = new DirectoryInfo(path);var files = directoryInfo?.GetFiles()?.OrderByDescending(x => x.LastWriteTime);if (files == null){string msg = "not log file";var msgBytes = Encoding.UTF8.GetBytes(msg);Response.ContentType = "text/plain";await Response.Body.WriteAsync(msgBytes, 0, msgBytes.Length);}else{StringBuilder html = new StringBuilder();foreach (var file in files){html.AppendLine($"

{file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")}  _logPath}\\{file.Name}\">{file.Name}  {file.Length / 1048576.0000} MB

");}var htmlBytes = Encoding.UTF8.GetBytes(html.ToString());Response.ContentType = "text/html";await Response.Body.WriteAsync(htmlBytes, 0, htmlBytes.Length);}} }

如下,是 FileList API 接口返回的结果,列出来的日志文列表,并给予文件名称超链接,如下
在这里插入图片描述

2.1.2 日志内容

创建一个新的 FileContent API,这个 API 实现的是 “文件名称超链接” 部分的功能,主要读取指定的日志文件内容,并返回给浏览器

[HttpGet]
[Route(nameof(FileContent))]
public async Task FileContent(string filePath)
{filePath = Directory.GetCurrentDirectory() + filePath;string fileContent = string.Empty;using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)){using (var sr = new StreamReader(fs, Encoding.UTF8)){fileContent = sr?.ReadToEnd();}}var htmlBytes = Encoding.UTF8.GetBytes(fileContent);Response.ContentType = "text/plain";await Response.Body.WriteAsync(htmlBytes, 0, htmlBytes.Length);
}

在这里插入图片描述
如下,FileContent API 返回了一个 txt 日志文件的内容,这里随便模拟日志写了点文本
在这里插入图片描述

2.2 DotNet Framework

前面讲了 DotNet Core 为什么还要说下 DotNet Framework 呢,因为两个平台的一些实现 API 不一样,但实现思路与核心都是一样的。

如下,新建一个 OrderService 程序,日志在项目的 App_Data\Logs 文件夹下
在这里插入图片描述

2.2.1 日志列表

创建一个 LogController Web API,并创建一个 FileList 的 API,这个 API 主要读取日志文件列表,并拼接成 HTML 返回给浏览器

[RoutePrefix("Log")]
public class LogController : ApiController
{private readonly string _logPath = "App_Data\\Logs";[HttpGet][Route(nameof(FileList))]public HttpResponseMessage FileList(){var response = new HttpResponseMessage(HttpStatusCode.OK);string path = HostingEnvironment.MapPath(@"~/") + _logPath;DirectoryInfo directoryInfo = new DirectoryInfo(path);var files = directoryInfo?.GetFiles()?.OrderByDescending(x => x.LastWriteTime);if (files == null){response.Content = new StringContent("not log file", Encoding.UTF8, "text/plain");return response;}StringBuilder html = new StringBuilder();foreach (var file in files){html.AppendLine($"

{file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")}  _logPath}\\{file.Name}\">{file.Name}  {file.Length / 1048576.0000} MB

");}response.Content = new StringContent(html.ToString(), Encoding.UTF8, "text/html");return response;}

如下,是 FileList API 接口返回的结果,列出来的日志文列表,并给予文件名称超链接,如下
在这里插入图片描述

2.2.2 日志内容

创建一个新的 FileContent API,这个 API 实现的是 “文件名称超链接” 部分的功能,主要读取指定的日志文件内容,并返回给浏览器

[HttpGet]
[Route(nameof(FileContent))]
public HttpResponseMessage FileContent(string filePath)
{filePath = HostingEnvironment.MapPath(@"~/") + filePath;string content = string.Empty;using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)){using (var sr = new StreamReader(fs, Encoding.UTF8)){content = sr?.ReadToEnd();}}var response = new HttpResponseMessage(HttpStatusCode.OK);response.Content = new StringContent(content, Encoding.UTF8, "text/plain");return response;
}

在这里插入图片描述
如下,FileContent API 返回了一个 txt 日志文件的内容,这里随便模拟日志写了点文本
在这里插入图片描述

四、源码

下面连接,包含了 DotNet Core 与 DotNet Framework 实现日志解决方案的全部代码,需要的自行下载
https://download.csdn.net/download/weixin_46785144/87235310

相关内容

热门资讯

应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...