Web应用程序,简单的日志系统解决方案

news2024/11/15 23:48:16

一、简介

今天介绍一下,当你的程序没有日志系统时,如何快速方便查看当前程序日志的解决方案。如果你的程序有日志系统,可以不看本篇博客哈。本文实例是使用 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($"<p><span>{file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")}</span>&nbsp;&nbsp;<a target=\"_blank\" href=\"\\Log\\FileContent?filePath=\\{_logPath}\\{file.Name}\">{file.Name}</a>&nbsp;&nbsp;<span>{file.Length / 1048576.0000} MB</span></p>");
            }
            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($"<p><span>{file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")}</span>&nbsp;&nbsp;<a target=\"_blank\" href=\"\\Log\\FileContent?filePath=\\{_logPath}\\{file.Name}\">{file.Name}</a>&nbsp;&nbsp;<span>{file.Length / 1048576.0000} MB</span></p>");
        }
        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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nexus搭建测试dockermavennpm仓库

JAVA下载 https://www.oracle.com/java/technologies/downloads/archive/ https://login.oracle.com/mysso/signon.jsp QQq951699. [rootvm1 ~]# mkdir -p /data [rootvm1 ~]# mv jdk-8u221-linux-i586.tar.gz /data [rootvm1 ~]# cd /data;tar xf jdk-8u221-linux-i586.tar.g…

222页8万字智慧园区IOC平台运维管理平台解决方案

目 录 第一章 项目概述 7 1.1 园区格局的变化 7 1.1.1 传统安防面临的不足与挑战 7 1.1.2 园区安防未来的发展趋势 7 1.2 需求分析 8 1.2.1 平台集成化 8 1.2.2 数据可视化 8 1.2.3 管控全面化 8 1.2.4 覆盖高清化 9 1.2.5 指挥简易化 9 1.2.6 建设智能化 9 1.3 建设思路 9 1.3…

基于物联网设计的自反馈深紫外杀菌消毒系统(STM32F407)

一、前言 目前常态化防控病毒有很多种,其中主要是人工喷洒消毒液这种消毒方式,这种消毒效果无法得到量化,同时还可能存在喷洒盲区,也会对公民的呼吸道产生刺激,腐蚀损坏公共设施,而对于室内公共空间的消毒的要求会更高,基于这样的状况,人工喷洒消毒液这种方式肯定不太…

[附源码]JAVA毕业设计教学成果管理平台(系统+LW)

[附源码]JAVA毕业设计教学成果管理平台&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

C语言——利用矩阵LU分解法求逆、行列式

本章介绍了LU分解法&#xff0c;以及如何利用LU分解法求逆、行列式&#xff0c;针对每个公式、原理、代码进行了详细介绍&#xff0c;希望可以给大家带来帮助。 目录 LU分解法 概念 确定L、U矩阵 LU分解法的意义 程序设计 LUP求逆 1&#xff09;代码 2&#xff09;代…

uniapp 监听通知栏消息插件(支持白名单、黑名单、过滤) Ba-NotifyListener

简介&#xff08;下载地址&#xff09; Ba-NotifyListener 是一款实时监听通知栏消息的uniapp插件。支持白名单、黑名单&#xff1b;支持监听消息移除&#xff1b;支持自定义过滤条件&#xff08;如短信验证码&#xff09;等。 支持监听所有通知栏消息&#xff08;包含id、ti…

springboot整合layui排坑

参考&#xff1a;thymeleaflayui加载页面渲染时TemplateProcessingException: Could not parse as expression: "_yaoshengting的博客-CSDN博客 目录 1.table渲染问题 2.解决方式 1.将clos后的[[ ]]分成四行写 2.加上 th:inline"none 1.table渲染问题 源代码&…

[附源码]Python计算机毕业设计Django拉勾教育课程管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

spark shuffle·读写流程 和 rdd持久化

1.对比mapreduce和spark mapreduce里 map的第3条就是说&#xff0c;比如我存了很多条数据&#xff0c;如果一条一条写进磁盘&#xff0c;肯定有很多次IO&#xff0c;我先归并到一个缓存里面再溢写磁盘。 spark与其的差别就是用map代替了buffer&#xff0c;因为map存的key唯一&…

[附源码]JAVA毕业设计教学辅助系统(系统+LW)

[附源码]JAVA毕业设计教学辅助系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

[附源码]计算机毕业设计springboo酒店客房管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【小5聊】使用div+css布局绘制32支球队比赛对阵图,拭目以待冠军花落谁家

虽然不是狂爱足球爱好者&#xff0c;但多少会有关注下&#xff0c;像梅西和C罗是经常听到的 可能是没有我们队的原因&#xff0c;关注会比较少&#xff0c;只看个结果&#xff0c;所以 趁着这次机会&#xff0c;通过js前端技术divcss布局方式绘制本次世界杯足球比赛对阵图 2022…

Android 腾讯位置服务地图简单使用

文章目录概述腾讯位置服务地图SDK兼容性创建工程获取Appkey配置AppKey配置工程代码混淆权限配置地图基础地图地图类型个性化地图3D建筑行政区划出现的问题及解决源码概述 ​ 本文参考腾讯位置服务官方文档&#xff1a;Android地图SDK | 腾讯位置服务 (qq.com) ​ 腾讯位置服…

【数据结构与算法】一套链表 OJ 带你轻松玩转链表

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;数据结构 ✨刷题专栏&#xff1a;基础算法 链 表 OJ&#x1f3f3;️一. 移除链表元素&#x1f3f4;二.反转链表&#x1f3c1;三.链表的中间结点&#x1f6a9;四.链表中倒数第k个结点&#x1f3f3;️‍&#x1f308;五.合并…

华为阿里等技术专家15年开发经验总结:SSM整合开发实战文档

前言 都说程序员工资高、待遇好&#xff0c; 2022 金九银十到了&#xff0c;你的小目标是 30K、40K&#xff0c;还是 16薪的 20K&#xff1f;作为一名 Java 开发工程师&#xff0c;当能力可以满足公司业务需求时&#xff0c;拿到超预期的 Offer 并不算难。然而&#xff0c;提升…

Spring基础篇:事务开发

Spring整合持久层 Spring技术为什么要与持久层技术进行整合&#xff1f; 1、JavaEE开发过程中我们需要持久才能进行数据库的访问操作。 2、JDBC Hibernate MyBatis进行持久层过程中存在大量的代码冗余。 3、Spring基于模板设计模式对这些持久层技术呢作出了封装。 ps注释&…

[附源码]计算机毕业设计疫情期间小学生作业线上管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Android App】在线直播之搭建WebRTC的服务端(图文解释 简单易懂)

有问题或需要源码请点赞关注收藏后评论区留言私信~~~ 一、WebRTC的系统架构 WebRTC&#xff08;网页即时通信&#xff09;是一个支持浏览器之间实时音视频对话的新型技术&#xff0c;WebRTC体系由应用于实时通信的编程接口和一组通信协议组成&#xff0c;已成为互联网流媒体通…

(八) 共享模型之管程【ReentrantLock】

相对于 synchronized 具备如下特定&#xff1a; &#xff08;1&#xff09;可中断 &#xff08;2&#xff09;可以设置超市时间 &#xff08;3&#xff09;可以设置为公平锁 &#xff08;4&#xff09;支持多个条件变量 与 synchronized 一样&#xff0c;都支持可重入 基本语法…

回归预测 | MATLAB实现基于RF随机森林的用水量预测(多因素、多指标)

回归预测 | MATLAB实现基于RF随机森林的用水量预测(多因素、多指标) 目录 回归预测 | MATLAB实现基于RF随机森林的用水量预测(多因素、多指标)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 将随机森林回归原理应用到了预测领域,构建了基于随机森林的预测模型,…