net自带日志与Serilog、log4Net的异同
1、比较。
.NET自带的日志功能、Serilog和log4Net都是用于记录日志的库,但它们之间存在一些差异。具体分析如下:
- 相同点:
- 目的:它们都提供了在开发过程中记录应用程序运行情况的功能,便于开发者追踪和调试问题。
- 配置性:三者均支持通过配置文件或代码进行灵活的日志记录设置。
- 扩展性:它们都可以根据需要自定义日志格式和输出目标。
- 不同点:
- 灵活性和可扩展性:Serilog是一个高度可扩展的日志框架,它支持多种输出格式,包括控制台、文件、Elasticsearch等。它的特点是可配置性强,支持链式调用,可以自定义日志格式和输出方式。而log4Net也是一个成熟的日志框架,支持多种日志级别和输出目标,但在性能方面可能不如Serilog。
- 集成度:Serilog可以轻松与Microsoft的内置日志接口集成在一起,这使得测试应用程序变得更加容易。而log4Net作为老牌的日志库,虽然集成度也很高,但在新兴的.NET Core项目中可能需要更多的配置工作。
- 静态类使用:Serilog提供了静态的Log类,这可能会违反依赖反转原则,但在某些情况下(如Program类中)可能是有用的。而.NET自带的日志功能则依赖于Microsoft.Extensions.Logging,这是一个非静态的日志接口,更加符合现代软件设计的依赖注入原则。
综上所述,Serilog在性能、可配置性和灵活性方面表现较好,而log4Net作为一个成熟的日志框架,拥有稳定的用户群和丰富的文档资源。而.NET自带的日志功能则与.NET生态系统紧密集成,为开发者提供了一个开箱即用的日志解决方案。在选择日志库时,应根据项目的具体需求、团队的熟悉程度以及维护的便利性来决定。
2、最简单方式。测试自带:
/// <summary>
/// 测试连接1
/// 异常
/// </summary>
/// <param name="t">字符串</param>
/// <returns></returns>
[HttpGet]
[ApiVersionCustomRoute(SwaggerDocSettings.ApiVersions.v1)]
public string Test(string t)
{
int i = 0;
try
{
i = int.Parse(t);
}
catch (Exception ex)
{
_logger.LogError("Test接口异常:" + ex.Message.ToString());
return "报错,不可转int类型";
}
return "【Test】OK.输入的是:" + i.ToString();
}
2.1、效果:
3、log4net:
3.1、安装相应包:log4net、Microsoft.Extensions.Logging.Log4Net.AspNetCore
3.2、添加配置文件:log4net.config。然后右击属性,改为始终复制到目录。
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<!--日志输入路径-->
<file value="Logs/Log-" />
<!--按日期命名文件-->
<datePattern value="yyyy-MM-dd'.log'" />
<!--是否只写到一个文件中-->
<staticLogFileName value="false" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<!--最多产生文件数超过的话保留最新-->
<maxSizeRollBackups value="1000" />
<maximumFileSize value="10MB" />
<!--防止多线程时不能写Log,官方说线程非安全-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<!--时间、线程、级别、、信息、换行、堆栈信息、换行、-->
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" />
<header value="
----------------------header--------------------------
" />
<footer value="
----------------------footer--------------------------
"/>
</layout>
</appender>
<root>
<level value="DEBUG" />
<!--上边已配置的appender节点的名称-->
<appender-ref ref="RollingFile" />
</root>
</log4net>
3.3、注入服务:
builder.Host.ConfigureLogging(loggingBuilder =>
{
loggingBuilder.AddLog4Net();
});
3.4、测试:
public ApiResult Test(string t)
{
int i = 0;
try
{
i = int.Parse(t);
}
catch (Exception ex)
{
string str = "Test接口异常:" + ex.Message.ToString();
//_logger.LogError(str);
_logger.LogError("1、" + str, ex);
_logger.LogError("2、" + str + "【】" + ex.ToString());
_logger.LogError("3、" + str);
_logger.LogError(ex, "4、" + str);
return ApiResultHelper.Error("转化失败", ex.Message.ToString());
}
i = int.Parse(t);
return ApiResultHelper.Success("转化成功!");
}
3.5、输出成功:(建议使用第4条的计入方式)
3.6、网上还有很多使用帮助类的形式添加日志记录,但是我感觉没有这种简单,相当于替换了原有的。但是帮助类那种可拓展的更丰富吧,看个人使用情况。