1.6 更新日志
Furion
框架升级/发版规则升级前重点关注可能造成【破坏性】的标签类型:、、、
版本号规则:主版本号.次版本号.修订版本号
- 只要【确认】为框架
bug
,则当天修复,当天发版,修订版本号加 1
。 - 只要
.NET SDK
版本更新,则当天升级,当天发版,修订版本号加 1
。 - 如果
.csproj
文件有变更,则当天发版,修订版本号加 1
。 - 如果新增
拓展包
,为了版本号统一,则当天发版,修订版本号加 1
。 - 如果涉及到代码重构,则当天发版,次版本号
加 1
,修订版本号清 0
。 - 如果
.NET SDK
主版本号升级,则当天发版,主版本号加 1
。
如有意外不能当天发版,则会在 Issue
中说明具体发版时间,正常不会超过 3
天。
开通 VIP 服务尊享一对一技术指导
482
1000
v4.9.1(当前版本,.NET8)
版本细节
v4.9.1
版本细节:https://gitee.com/dotnetchina/Furion/issues/I8GHNK 2023.11.15 ~ 2023.12.11 🆕
⭐️ .NET8
升级指南:http://furion.baiqian.ltd/docs/net7-to-net8 ⭐️
-
新特性
-
EFCore
数据库操作EntityNotTenant
和EntityBaseNotTenant
实体基类 4.9.1.11 ⏱️2023.12.04 b62bfb1 - 控制台日志支持启动时同步
ConsoleFormatterExtendOptions
配置 4.9.1.10 ⏱️2023.12.04 a96fe08 - 定时任务支持取消正在运行的作业程序 4.9.1.9 ⏱️2023.12.03 3cc9be0
-
JSON.IsValid(jsonString)
判断JSON
字符串有效性 4.9.1.8 ⏱️2023.11.30 22bc69b -
axios-utils.ts
解析token
信息导出方法 4.9.1.7 ⏱️2023.11.29 ae8c3e8 - 规范化处理自动过滤
SSE
请求、文件请求、图片请求 4.9.1.6 ⏱️2023.11.22 #I8IP6D -
[AppDbContext]
特性支持UseSnakeCaseNaming
属性配置表名使用蛇形命名 4.9.1.5 ⏱️2023.11.20 #I8HGR2 !863 - 时间戳模型绑定器将时间戳转换为
DateTime/DateTimeOffset
类型 4.9.1.5 ⏱️2023.11.20 df3053c -
Newtonsoft.Json
自动将时间戳转换为DateTime/DateTimeOffset
类型 4.9.1.3 ⏱️2023.11.17 78a589d -
System.Text.Json
自动将时间戳转换为DateTime/DateTimeOffset
类型 4.9.1.2 ⏱️2023.11.17 abd5196 -
IRepositoryFactory<TEntity, TDbContextLocator>
仓储功能,解决在Blazor
中使用EFCore
问题 4.9.1.1 ⏱️2023.11.16 4285ec0 文档说明 - 补偿策略模块功能 4.9.1 ⏱️2023.11.15 【源码地址】 dfc63e7
-
-
突破性变化
-
Serilog
拓展包依赖至8.0.0
版本,移除.NET8.0
的IWebHostBuilder.UseSerilogDefault
拓展方法 4.9.1.1 ⏱️2023.11.16 5ab3e43 - 框架底层适配
.NET8.0
正式版 4.9.1 ⏱️2023.11.15 - 框架脚手架适配
.NET8.0
正式版 4.9.1 ⏱️2023.11.15
-
-
问题修复
- 粘土对象转换成
Dictionary
对象不支持递归问题 4.9.1.13 ⏱️2023.12.11 #I8NFT4 -
Scoped.CreateAsync
内部异常上层应用不能捕获问题 4.9.1.12 ⏱️2023.12.08 0a89a43 -
Scoped.CreateUowAsync
内部异常上层应用不能捕获问题 4.9.1.8 ⏱️2023.11.30 3c859e8 - 定时任务设置触发器
Result
后作业执行异常不能重置问题 4.9.1.7 ⏱️2023.11.24 147215f -
JWTEncryption.GetJWTSettings()
独立使用时无法获取自定义配置 4.9.1.4 ⏱️2023.11.18 c045e08
- 粘土对象转换成
-
文档
- 仓储文档、
Db
静态类文档、脚手架文档、.NET7
升级.NET8
文档、JSON
序列化文档、Docker
部署文档、数据库上下文文档、虚拟文件文档、远程请求文档、HttpContext
文档、JSON
静态类文档、定时任务文档、数据库仓储拓展文档、数据库实体文档、规范化文档
- 仓储文档、
-
贡献者
- zuohuaijun (@zuohuaijun) !865
- anliuty (@anliuty) !863
- 风云明月 (@www.fengyunmy.com) !862
v4.8.8(已发布)
版本细节
v4.8.8
版本细节:https://gitee.com/dotnetchina/Furion/issues/I6VF8V 2023.04.13 ~ 2023.11.09 🆕
-
新特性
-
Db.GetNewDbContext()
多个重载方法,实现类似new DbContext()
操作 4.8.8.55 ⏱️2023.11.09 4157629 - 控制台日志
AddConsoleFormatter
服务支持WriteFilter
属性过滤 4.8.8.52 ⏱️2023.11.07 516acb4 - 监听日志
LoggingMonitor
支持打印输出requestHeaders
请求头信息 4.8.8.50 ⏱️2023.10.27 #I8BHM3 - 多语言支持
L.GetDefaultCulture()
获取本地配置默认语言 4.8.8.49 ⏱️2023.10.25 !858 - 定时任务
Http
作业请求头Headers
和作业分组Group
和描述Description
支持 4.8.8.46 ⏱️2023.10.09 #I85Z7S - 定时任务看板列表支持作业分组名排序 4.8.8.43 ⏱️2023.09.14 #I7YQ9V
- 验证特性
[DataValidation]
支持[Display]
和[DisplayName]
特性设置{0}
4.8.8.42 ⏱️2023.09.01 #I7XB3T - 监听日志
LoggingMonitor
支持配置日志输出级别 4.8.8.41 ⏱️2023.08.25 #I7SRTP - 多语言支持
L.GetString(name, culture)
获取指定区域翻译 4.8.8.41 ⏱️2023.08.04 044b0ed - 粘土对象
.ConvertTo
支持自定义值提供器 4.8.8.40 ⏱️2023.08.03 70d5888 - 规范化文档枚举支持
[EnumToNumber]
特性配置生成前端枚举定义代码是字符串值还是整数值类型,默认为字符串值 4.8.8.35 ⏱️2023.07.06 #I7IZ7S - 定时任务作业计划
OnChanged
事件处理 4.8.8.29 ⏱️2023.06.25 e4c4cf1 -
Swagger
分组信息可在任意配置文件中通过[openapi:分组名]
进行配置 4.8.8.26 ⏱️2023.06.20 a70eed3 -
TP.WrapperRectangle
绘制矩形日志模板 4.8.8.25 ⏱️2023.06.14 60ffd76 -
IServiceScope.CreateDefaultHttpContext
拓展方法 4.8.8.24 ⏱️2023.06.07 11a55e1 - 配置模块
IgnoreConfigurationFiles
支持完整的文件通配符 4.8.8.22 ⏱️2023.05.25 #I78ABL - 定时任务支持二级虚拟目录
VisualPath
配置部署 4.8.8.20 ⏱️2023.05.18 #I740IA - 监听日志
LoggingMonitor
支持Razor Pages
4.8.8.16 ⏱️2023.05.15 #I7332C - 定时任务作业处理程序工厂
IJobFactory
支持 4.8.8.13 ⏱️2023.05.08 ad58dd3 -
AES
支持对文件(含超大文件)进行加解密 4.8.8.11 ⏱️2023.05.05 1d2265b - 动态
WebAPI
支持text/plain
格式的Body
参数 4.8.8.9 ⏱️2023.05.04 b49fe50 - 插件化
IDynamicApiRuntimeChangeProvider
接口,可在运行时动态添加WebAPI/Controller
4.8.8.8 ⏱️2023.05.04 322ea59
-
查看变化
在一些特定的需求中,我们需要在运行时动态编译代码,如动态编写 WebAPI
,之后能够在不重启主机服务的情况下即可有效。比如这里动态添加 SomeClass
动态 WebAPI
,然后在 Swagger/路由系统
中立即有效:
using Furion;
using Furion.DynamicApiController;
using Microsoft.AspNetCore.Mvc;
namespace YourProject.Application;
public class PluginApiServices : IDynamicApiController
{
private readonly IDynamicApiRuntimeChangeProvider _provider;
public PluginApiServices(IDynamicApiRuntimeChangeProvider provider)
{
_provider = provider;
}
/// <summary>
/// 动态添加 WebAPI/Controller
/// </summary>
/// <param name="csharpCode"></param>
/// <param name="assemblyName">可自行指定程序集名称</param>
/// <returns></returns>
public string Compile([FromBody] string csharpCode, [FromQuery] string assemblyName = default)
{
// 编译 C# 代码并返回动态程序集
var dynamicAssembly = App.CompileCSharpClassCode(csharpCode, assemblyName);
// 将程序集添加进动态 WebAPI 应用部件
_provider.AddAssembliesWithNotifyChanges(dynamicAssembly);
// 返回动态程序集名称
return dynamicAssembly.GetName().Name;
}
/// <summary>
/// 移除动态程序集 WebAPI/Controller
/// </summary>
public void Remove(string assemblyName)
{
_provider.RemoveAssembliesWithNotifyChanges(assemblyName);
}
}
这时只需要请求 api/plugin-api/compile
接口同时设置请求 Content-Type
为 text/plain
,接下来传入 C# 代码字符串
即可,如:
动态C#代码字符串
using Furion.DynamicApiController;
namespace YourProject.Application;
public class SomeClass : IDynamicApiController
{
public string GetName()
{
return nameof(Furion);
}
}

之后刷新浏览器即可看到最新的 API
:

还可以在运行时动态卸载,使用 DELETE
请求 api/plugin-api
即可。
-
- 定时任务
Schedular.CompileCSharpClassCode(code)
支持动态编译作业处理程序代码 4.8.8.7 ⏱️2023.04.30 fe1e8a1
- 定时任务
-
-
App.CompileCSharpClassCode(code)
动态编译类定义代码 4.8.8.7 ⏱️2023.04.30 fe1e8a1
-
-
- 粘土对象支持结构
struct
对象类型 4.8.8.7 ⏱️2023.04.30 a0fa3aa
- 粘土对象支持结构
-
- 定时任务支持配置
IJob
执行异常FallbackAsync
回退策略 4.8.8.6 ⏱️2023.04.25 7671489
- 定时任务支持配置
-
- 定时任务支持在非
IOC/DI
项目类型中使用 4.8.8.5 ⏱️2023.04.24 #I6YJNB
- 定时任务支持在非
-
-
RSA
支持对超长字符(超245
位)进行分段加解密 4.8.8.2 ⏱️2023.04.19 !788 感谢 @YaChengMu
-
-
-
System.Text.Json
和Newtonsoft.Json
对粘土对象Clay
支持 4.8.8.1 ⏱️2023.04.18 #I6WKRZ
-
-
- 粘土对象可反射转换成特定
IEnumerable<T>
类型:clay.ConvertTo<T>()
4.8.8 ⏱️2023.04.13 5d54a65
- 粘土对象可反射转换成特定
-
-
Serve.IdleHost
支持返回http
和https
协议Web
地址(端口) 4.8.8 ⏱️2023.04.13 fdf7885
-
-
突破性变化
- 定时任务看板
SyncRate
配置,前后端采用最新的SSE
推送技术替代 4.8.8.29 ⏱️2023.06.25 e4c4cf1 - 监听日志
WriteFilter
和ConfigureLogger
的ActionExecutingContext
和ActionExecutedContext
类型为FilterContext
4.8.8.16 ⏱️2023.05.15 #I7332C -
IJsonSerializerProvider
序列化接口,添加Deserialize
反序列化方法 4.8.8.15 ⏱️2023.05.15 !815 感谢 @YaChengMu
- 定时任务看板
查看变化
添加 25-32行
接口方法:
namespace Furion.JsonSerialization;
/// <summary>
/// Json 序列化提供器
/// </summary>
public interface IJsonSerializerProvider
{
/// <summary>
/// 序列化对象
/// </summary>
/// <param name="value"></param>
/// <param name="jsonSerializerOptions"></param>
/// <returns></returns>
string Serialize(object value, object jsonSerializerOptions = default);
/// <summary>
/// 反序列化字符串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json"></param>
/// <param name="jsonSerializerOptions"></param>
/// <returns></returns>
T Deserialize<T>(string json, object jsonSerializerOptions = default);
/// <summary>
/// 反序列化字符串
/// </summary>
/// <param name="json"></param>
/// <param name="returnType"></param>
/// <param name="jsonSerializerOptions"></param>
/// <returns></returns>
object Deserialize(string json, Type returnType, object jsonSerializerOptions = default);
/// <summary>
/// 返回读取全局配置的 JSON 选项
/// </summary>
/// <returns></returns>
object GetSerializerOptions();
}
如果使用 Newtonsoft.Json
则只需添加以下实现即可:
/// <summary>
/// 反序列化字符串
/// </summary>
/// <param name="json"></param>
/// <param name="returnType"></param>
/// <param name="jsonSerializerOptions"></param>
/// <returns></returns>
public object Deserialize(string json, Type returnType, object jsonSerializerOptions = null)
{
return JsonConvert.DeserializeObject(json, returnType, (jsonSerializerOptions ?? GetSerializerOptions()) as JsonSerializerSettings);
}
-
问题修复
- 远程请求获取响应
Cookies
被截断问题 4.8.8.54 ⏱️2023.11.08 #I8EV1Z - 远程请求上传文件在其他编程语言获取文件名存在双引号问题 4.8.8.53 ⏱️2023.11.07 #I8EF1S
- 定时任务高频作业下持久化操作出现阻塞卡问题 4.8.8.51 ⏱️2023.11.06 f1d0b4a
- 定时任务看板中间件
SSE
请求不是长连接导致连接频繁初始化销毁 4.8.8.49 ⏱️2023.10.26 1997f1b - 动态
WebAPI
不能正确移除AppService
命名的Service
问题 4.8.8.47 ⏱️2023.10.10 #I86NL - 审计日志不支持
dynamic/JsonElement
序列化问题 4.8.8.45 ⏱️2023.09.29 #I84SD5 -
Scoped.CreateUowAsync
作用域工作单元异常无法回滚问题 4.8.8.44 ⏱️2023.09.23 #I833I9 - 模板引擎高并发读取缓存模板出现线程占用问题 4.8.8.43 ⏱️2023.09.14 #I80ZKB
- 使用刷新
Token
也能通过鉴权检查严重安全Bug
4.8.8.42 ⏱️2023.08.28 #I7TII4 - 粘土对象不支持枚举类型问题 4.8.8.41 ⏱️2023.08.25 #I7VDDL
- 定时任务因上一版本修改 4e2615b 导致自定义作业触发器异常问题 4.8.8.36 ⏱️2023.07.06 #I7J59D
- 审计日志解析
DateTime
类型参数不是本地时间问题 4.8.8.33 ⏱️2023.06.29 #I7GW32 - 定时任务因上一版本修改 4e2615b 导致
Cron
解析异常问题 4.8.8.32 ⏱️2023.06.28 #I7GQ5I - 定时任务设置额外数据不支持
long/int64
类型参数问题 4.8.8.31 ⏱️2023.06.28 4e2615b - 定时任务休眠毫秒数大于
int.MaxValue
时出现ArgumentOutOfRangeException
4.8.8.27 ⏱️2023.06.21 #I7F6ZT -
Cron
表达式步长解析器错误 4.8.8.25 ⏱️2023.06.14 #I7D9XU - 修复
ExpandoObject.ToDictionary()
转换异常 4.8.8.25 ⏱️2023.06.14 #I7BY0P - 配置友好异常
FriendlyExceptionSettings:DefaultErrorMessage
无效问题 4.8.8.23 ⏱️2023.05.31 #I79LIG -
Swagger
进行分组后Tags
不能进行分组过滤问题 4.8.8.22 ⏱️2023.05.25 #I78A55 - 因 9d8cb82 代码提交导致命名服务解析异常问题 4.8.8.21 ⏱️2023.05.18 #I76JZR
- 因 9d8cb82 代码提交导致服务
AOP
异常拦截问题 4.8.8.17 ⏱️2023.05.15 #I73A8E - 动态
WebAPI
自定义路由模板参数和自动拼接参数冲突问题 4.8.8.15 ⏱️2023.05.15 #I72ZZ2 - 远程请求在被请求端返回非
200
状态码但实际请求已处理也抛异常问题 4.8.8.14 ⏱️2023.05.12 b14a51f -
App.CompileCSharpClassCode(code)
运行时添加匿名程序集编译异常问题 4.8.8.8 ⏱️2023.05.04 322ea59 -
LoggingMonitor
打印泛型类型如果存在多个泛型参数问题 4.8.8.8 ⏱️2023.05.04 8d9cb74 - 脱敏处理如果字典存在重复词导致异常问题 4.8.8.4 ⏱️2023.04.23 #I6Y19K
- 远程请求
Body
参数为粘土对象Clay
类型序列化有误 4.8.8.1 ⏱️2023.04.18 #I6WKRZ -
Serve.IdleHost
获取随机端口的本地地址带$
符号问题 4.8.8 ⏱️2023.04.13 ed6f292
- 远程请求获取响应
-
其他更改
-
[UnitofWork]
支持在Class
中指定,解决Pages
应用警告问题 4.8.8.42 ⏱️2023.09.01 #I7X51E - 取消远程请求
GET/HEAD
不能传递Body
的限制 4.8.8.39 ⏱️2023.08.02 8113460 - 规范化文档枚举生成
json
格式,由int32
改为string
4.8.8.34 ⏱️2023.07.02 #I7HOPR - 规范化文档默认
Title
解析规则,不再自动添加空格 4.8.8.26 ⏱️2023.06.20 24b7a47 - 组件
Component
模式支持[DependsOn]
支持继承 4.8.8.16 ⏱️2023.05.15 #I733RF - 定时任务
GC
回收逻辑,避免高频添加作业导致尾延迟
问题 4.8.8.3 ⏱️2023.04.21 #I6XIV8 - 定时任务日志设计,减少不必要的日志输出 4.8.8.3 ⏱️2023.04.21 #I6XI2L
-
-
文档
-
Jwt
身份验证过程监听文档 - 事件总线
Redis
集成文档 - 粘土对象文档、虚拟文件系统文档、序列化文档、事件总线文档、远程请求文档、数据加密文档、安全授权文档、动态
WebAPI
文档、定时任务文档、JSON
序列化文档、App
静态类文档、规范化文档、配置文档、数据库上下文文档、Db
静态类文档
-
-
贡献者
- Axin (@lfuxin) !858
- 陶泥 (@ncs48620) !848
- handsome_by (@handsomeboyyl) !842
- 拉风的 CC (@LFDCC) !841
- Felix Hoi (@felixhoi) !839
- zetaluoxin (@zetaluoxin) !834
- SongXinXin (@goodsxx) !832 !833
- 阿炬 (@quejuwen) !813
- KaneLeung (@KaneLeung) !808
- 蒋状先生 (@JiangZhuangXianSheng) !806 !853
- NeoLu (@neolu) !804
- 蓝色天空 (@lds2013) !796
- YaChengMu (@YaChengMu) !788 !815
v4.8.7(已发布)
.NET8 Preview.1
发布🚀🎉🔥 2023 年 02 月 22 日,微软发布了 .NET8 首个预览版。
https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-1/
Furion
第一时间完成了适配,v4
版本开始一套代码支持 .NET5-.NET8/N
,支持所有 Furion
版本升级。
版本细节
v4.8.7
版本细节:https://gitee.com/dotnetchina/Furion/issues/I6GVN8 2023.02.22
-
新特性
- 定时任务看板支持自定义刷新频率
SyncRate
功能 4.8.7.43 ⏱️2023.04.12 703b465 -
Serve.GetIdleHost([host])
静态方法,可获取一个指定主机的Web
地址(端口) 4.8.7.43 ⏱️2023.04.12 fdf788 - 粘土对象可配置访问不存在
Key
时是抛异常还是返回null
4.8.7.40 ⏱️2023.04.10 e994d53 - 定时任务看板支持完全自定义
RequestPath
入口地址功能 4.8.7.34 ⏱️2023.04.04 24736f6 -
App.GetServices(type)
和App.GetServices<T>()
获取服务实例集合 4.8.7.33 ⏱️2023.04.03 c3e9957 - 远程请求
[HttpMethod]ToSaveAsync
下载远程文件并保存到磁盘方法 4.8.7.32 ⏱️2023.04.02 bfd02c1 - 定时任务一系列
.AlterTo
修改作业触发器触发时间便捷方法 4.8.7.31 ⏱️2023.03.31 0349017 - 多语言支持
DateTime
时间格式化配置节点DateTimeFormatCulture
4.8.7.31 ⏱️2023.03.31 #I6RUOU -
Serve.IdleHost
静态属性,可获取一个随机空闲Web
主机地址(端口) 4.8.7.29 ⏱️2023.03.30 e425063 -
WinForm/WPF
静态方法Serve.RunNative()
可配置是否启用Web
主机功能 4.8.7.26 ⏱️2023.03.29 #I6R97L -
WinForm/WPF
支持依赖注入的Native.CreateInstance<T>()
静态方法 4.8.7.23 ⏱️2023.03.27 53d51c3 -
WinForm/WPF
快速注册静态方法:Serve.RunNative()
4.8.7.23 ⏱️2023.03.27 53d51c3 - 远程请求支持
Content-Type
为text/html
和text/plain
处理 4.8.7.22 ⏱️2023.03.27 #I6QMLR - 粘土对象可转换成
IEnumerable<T>
对象并实现Lambda/Linq
操作 4.8.7.19 ⏱️2023.03.22 2b14ed9
- 定时任务看板支持自定义刷新频率
查看变化
dynamic clay = Clay.Parse("{\"Foo\":\"json\",\"Bar\":100,\"Nest\":{\"Foobar\":true},\"Arr\":[\"NOR\",\"XOR\"]}");
// 将 clay.Arr 转换成 IEnumerable<dynamic>
IEnumerable<dynamic> query = clay.Arr.AsEnumerator<dynamic>();
// 实现 Lambda/Linq 操作
var result = query.Where(u => u.StartsWith("N"))
.Select(u => new
{
Name = u
})
.ToList();
-
-
Crontab.IsValid(...)
静态方法,判断Cron
表达式是否有效 4.8.7.17 ⏱️2023.03.20 #I6OHO4
-
-
- 日志配置
WithStackFrame
,可控制是否输出产生日志的程序集,类型和具体方法 4.8.7.16 ⏱️2023.03.19 5ad6ae2
- 日志配置
查看变化
启用 WithStackFrame
日志配置后,可输出程序集,类型,方法签名信息。
// 控制台日志
services.AddConsoleFormatter(options =>
{
options.WithStackFrame = true;
});
// 文件日志
services.AddFileLogging(options =>
{
options.WithStackFrame = true;
});
// 数据库日志
services.AddDatabaseLogging(options =>
{
options.WithStackFrame = true;
});
日志输出如下:
info: 2023-03-17 18:25:06.7988349 +08:00 星期五 L System.Logging.EventBusService[0] #1
[Furion.dll] async Task Furion.EventBus.EventBusHostedService.ExecuteAsync(CancellationToken stoppingToken)
EventBus hosted service is running.
info: 2023-03-17 18:25:08.1393952 +08:00 星期五 L Microsoft.Hosting.Lifetime[14] #1
[System.Private.CoreLib.dll] void System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start<TStateMachine>(ref TStateMachine stateMachine)
Now listening on: https://localhost:5001
info: 2023-03-17 18:25:08.1620391 +08:00 星期五 L Microsoft.Hosting.Lifetime[14] #1
[System.Private.CoreLib.dll] void System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start<TStateMachine>(ref TStateMachine stateMachine)
Now listening on: http://localhost:5000
info: 2023-03-17 18:25:08.1972456 +08:00 星期五 L Microsoft.Hosting.Lifetime[0] #1
[Microsoft.Extensions.Hosting.dll] void Microsoft.Extensions.Hosting.Internal.ConsoleLifetime.OnApplicationStarted()
Application started. Press Ctrl+C to shut down.
info: 2023-03-17 18:25:08.2456579 +08:00 星期五 L Microsoft.Hosting.Lifetime[0] #1
[Microsoft.Extensions.Hosting.dll] void Microsoft.Extensions.Hosting.Internal.ConsoleLifetime.OnApplicationStarted()
Hosting environment: Development
info: 2023-03-17 18:25:08.2746134 +08:00 星期五 L Microsoft.Hosting.Lifetime[0] #1
[System.Private.CoreLib.dll] void System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(bool throwOnFirstException)
Content root path: D:\Workplaces\OpenSources\Furion\samples\Furion.Web.Entry
info: 2023-03-17 18:25:18.1917784 +08:00 星期五 L Furion.Application.TestLoggerServices[0] #16
[Furion.Application.dll] void Furion.Application.TestLoggerServices.测试日志()
我是一个日志 20
这样就清楚地知道日志是哪个程序集、哪个类型、哪个方法输出的了。