文章目录
1.日志级别
Trace < Debug < Information < Warning < Error < Critical
- Critical:生死攸关
- Error:无法处理的错误信息
- Warning:不会中断应用程序,但仍需调查的警告错误
- Information:程序运行时输出重要信息,通常具有长期价值
- Debug:开发、调试过程中,短期有用的消息
- Trace:最低的日志级别,我没用过
2.配置文件的解读
- internalLogFile=“c:\temp\internal-nlog-AspNetCore.txt”,如果去掉c:\temp\ 就是默认往系统根路径写入 (所有路径写法都有效)
- rules 的匹配规则是由上而下,只要符合条件,就会写入日志
- rules logger name:logger名称,若为 * 则表示适用于所有日志;若我们某个target专门用于 SystemServices 类的日志输出,则那么可以设置为SystemServices.* ,表示当前约束只允许命名空间为 SystemServices 开头的日志输出。
- rules logger writeTo=“lifetimeConsole, ownFile-web”:可以匹配多个
- rules logger final=true 属性:一旦匹配到,就不会再往下匹配
- target type = ColoredConsole:控制台程序会变色
- target archiveAboveSize=“100000”:超过100KB的日志文件将被自动归档
- target maxArchiveFiles=“3”:应保留的存档文件的最大数量,删除存档中超过 3 个的文件
- target maxArchiveDays=“30”:应保留的存档文件的最长期限,删除超过 30 天的文件
3.使用Logging写入控制台程序
引用包
Microsoft.Extensions.Logging
Microsoft.Extensions.Logging.Console
Program.cs代码(.NET6创建的控制台程序)
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
ServiceCollection services = new();
services.AddLogging(logBulider => {
logBulider.AddConsole();
logBulider.SetMinimumLevel(LogLevel.Debug); //设置允许日志输出的最低级别为Debug
});
services.AddScoped<Test1>();
using (var sp = services.BuildServiceProvider())
{
var test1= sp.GetRequiredService<Test1>();
test1.Test();
}
* 新建Test1.cs类并写入代码
public class Test1
{
private readonly ILogger<Test1> logger;
public Test1(ILogger<Test1> _logger)
{
this.logger = _logger;
}
public void Test()
{
logger.LogDebug("开始执行数据库同步");
logger.LogDebug("连接数据库成功");
logger.LogWarning("查找数据失败,重试第一次");
logger.LogWarning("查找数据失败,重试第二次");
logger.LogError("查找数据最终失败");
}
}
运行效果
4.使用Logging写入Windows下的事件查看器
注意:除非程序只部署到Windows系统下,否则不建议这样写日志
在标题1中稍作修改
引用包 Microsoft.Extensions.Logging.EventLog
新增代码 logBulider.AddEventLog();
运行效果
5.使用NLog写入文本文件(ASP.NET Core 案例)
-
nlog.config
📄官方提供的配置文件 -
Program.cs
builder.Services.AddLogging(logBulider => {
logBulider.AddConsole();
//logBulider.AddEventLog();
logBulider.AddNLog();
//logBulider.SetMinimumLevel(LogLevel.Debug); //设置允许日志输出的最低级别Debug
});
控制器
public class WeatherForecastController : ControllerBase
{
private readonly IConfiguration config;
public TestController(ILogger<TestController> logger)
{
this.logger = logger;
}
[HttpPost]
public JsonResult TestLog()
{
logger.LogInformation("测试Information");
logger.LogDebug("测试Debug");
logger.LogError("测试Error");
return new JsonResult("");
}
}
- 引用包 NLog.Extensions.Logging
- 注意nlog.config 必须小写,如果大写并部署到Linux系统,会报错
- nlog.config 文件属性 设置为
始终复制
- 项目添加代码
logBulider.AddNLog();
6.使用NLog写入数据库(ASP.NET Core 案例)
nlog.config 配置
<targets>
<target name="database" xsi:type="Database" connectionstring="Server=.;Initial Catalog=cxlprod;Persist Security Info=False;User ID=DemoDB;Password=sa2008;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;">
<commandText>
insert into NLogInfo([Date],[origin],[Level],[Message]) values (DATEADD(HOUR, 8, GETDATE()), @origin, @logLevel, @message);
</commandText>
日志来源
<parameter name="@origin" layout="${callsite}" />
日志等级
<parameter name="@logLevel" layout="${level}" />
日志消息
<parameter name="@message" layout="${message}" />
</target>
</targets>
<rules>
<logger name="*" writeTo="database" />
</rules>
7.过滤日志
使用 final 属性 可以选择性的将日志存放到某个具体的.log中,不再往下执行
下面案例,当日志写入 sysServicesFile 中,final=true,执行完后,不会再往下执行
<logger name="SystemServices.*" minlevel="Trace" writeTo="sysServicesFile" final="true" />
<logger name="*" minlevel="Trace" writeTo="defaultFile" />