场景描述
公司会接一些小项目开发,部署到客户方后,不方便进行debug
项目以webapi服务为主
实现思路
通过静态类和队列将最近发生的一些内容缓存起来
通过接口轮询读取,也可以做一个前端页面进行显示
代码
using System.Collections.Concurrent;
namespace Code
{
/// <summary>
/// debug
/// 通过接口由前端读取
/// 实现前端debug
/// </summary>
public static class DeBug
{
/// <summary>
/// 多线程安全队列
/// </summary>
public static ConcurrentQueue<DeBugInfo> Queue { get; set; }
static DeBug()
{
Queue = new ConcurrentQueue<DeBugInfo>();
}
/// <summary>
/// 添加,异步
/// </summary>
/// <param name="content">内容</param>
/// <param name="outlog">是否同时在控制台输出,默认否</param>
public static async Task Add(string content,bool outlog=false)
{
if (string.IsNullOrEmpty(content)) return;
var info = new DeBugInfo()
{
content = content,
time = DateTime.Now
};
if (outlog)
{
//同步控制台输出
Console.WriteLine($"{info.time.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
Console.WriteLine($"{info.content}");
Console.WriteLine();
Console.WriteLine();
}
Queue.Enqueue(info);
//每次入队后都判断队列长度是否超过限制
//每次出队3条,确保不会因为意外情况导致队列超过限制
if (Queue.Count > 2000)
{
Queue.TryDequeue(out DeBugInfo a);
Queue.TryDequeue(out DeBugInfo b);
Queue.TryDequeue(out DeBugInfo c);
}
}
/// <summary>
/// 清空队列
/// </summary>
public static void Clear()
{
Queue.Clear();
}
/// <summary>
/// 获取列表
/// </summary>
/// <returns></returns>
public static List<DeBugInfo> GetList()
{
return Queue.OrderByDescending(x => x.time).ToList();
}
/// <summary>
/// 获取列表
/// </summary>
/// <param name="action">对队列的每一项进行处理,比如加高亮,替换字符串等操作</param>
/// <returns></returns>
public static List<DeBugInfo> GetList(Action<DeBugInfo> action)
{
var list=Queue.OrderByDescending(x => x.time).ToList();
foreach (var item in list)
{
action(item);
}
return list;
}
}
public class DeBugInfo
{
public string? content { get; set; }
public DateTime time { get; set; }
}
}
添加/入队
//对象需要转成字符串进
DeBug.Add("6666666666");
//DeBug.Add("6666666666", true);//同步在控制台进行输出
读取列表
DeBug.GetList()