首页 > 其他分享 >跟着杨中科学习(二)日志

跟着杨中科学习(二)日志

时间:2024-06-05 17:13:38浏览次数:15  
标签:logBuilder sp var 中科 services 日志 logger 跟着

日志系统

日志级别

Trace<Debug<Information<Warning<Error<Critical

输出到控制台

Nuget

Microsoft.Extensions.Logging
Microsoft.Extensions.Logging.Console

DI注入

services.AddLogging(logBuilder=>{
	logBuilder.AddConsole();//可多个Procider
    logBuilder.SetMinimumLevel(LogLevel.Trace);//设置级别打印等级
})
services.AddScoped<Test>();
using(var sp=services.BuildServiceProvider())
{
    var test=sp.GetRequiredService<Test>();
    test.TestDemo();
}

使用

class Test
{
    private readonly ILogger<Test> logger;
    public Test(ILogger<Test> logger)
    {
        this logger=logger;
    }
    public void TestDemo()
    {
        logger.LogDebug("开始执行数据库");
        logger.LogWarning("查找数据失败,开始重试");
    }
}

其他日志提供者

Event Log

Windows Only。只在windows下运行

在Windows下部署的
程序、网站运行出错、不正常,先去EventLog看看。

在EventViewer中找

NuGet安装:

Microsoft.Extensions.Logging.EventLog
然后在DI
logBuilder.AddEventLog();

Nlog

文本日志

NLog.Extensions.Logging

约定大于配置

项目根目录建nlog.config,需要注意文件名的大小写(考虑linux)。

.net6.0下的nlog.config配置文件

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Info"
      internalLogFile="c:\temp\internal-nlog-AspNetCore.txt">

  <!-- enable asp.net core layout renderers -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <!-- the targets to write to -->
  <targets>
    <!-- File Target for all log messages with basic details -->
    <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-AspNetCore-all-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />

    <!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
    <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore-own-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />

    <!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
    <target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Output hosting lifetime messages to console target for faster startup detection -->
    <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />

    <!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) -->
    <logger name="Microsoft.*" maxlevel="Info" final="true" />
    <logger name="System.Net.Http.*" maxlevel="Info" final="true" />
    
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>
services.AddLogging(logBuilder=>{
	logBuilder.AddConsole();//可多个Procider
    logBuilder.SetMinimumLevel(LogLevel.Trace);//设置级别打印等级
    logBuilder.AddNlog();
})
services.AddScoped<Test>();
using(var sp=services.BuildServiceProvider())
{
    var test=sp.GetRequiredService<Test>();
    test.TestDemo();
}

日志的分类和过滤

创建一个新的类,但是namespace的名字要改成SystemServices

namespace SystemServices
{
    class Test
	{
        private readonly ILogger<Test> logger;
        public Test(ILogger<Test> logger)
        {
            this logger=logger;
        }
        public void TestDemo()
        {
            logger.LogDebug("开始执行FTP");
            logger.LogWarning("查找数据失败,开始重试");
        }
	}
}
services.AddLogging(logBuilder=>{
	logBuilder.AddConsole();//可多个Procider
    logBuilder.SetMinimumLevel(LogLevel.Trace);//设置级别打印等级
})
services.AddScoped<Test>();
using(var sp=services.BuildServiceProvider())
{
    var test=sp.GetRequiredService<Test>();
    test.TestDemo();
}

修改nlog.config配置文件

<? xml version="1.0" encoding="utf-8" ?>
(nlog xmlns="http://www.nlog-project.org/schemas/NLog. xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true"
<targets>
<target xsi:type="File" name="defaultFile" fileName="logs/log-${shortdate}. 1og"
layout="${date} |${1eve1:uppercase=true} |$ {1ogger} |$ {message} |$ {exception:format=ToString}" />
<target xsi:type="File name="sysServicesFile" archiveAboveSize="10000
fileName="logs/sysServices-${shortdate}. log
layout="${date} |${1eve1:uppercase=true} |${1ogger} | $ {message} |
$ {exception:format=ToString}" />
<target xsi:type="ColoredConsole" name="targetConsole
layout="${date} | $ {1eve1:uppercase=true} |${1ogger} |$ {message} |
$ {exception:format=ToString}" />

maxArchiveFiles="3"

</targets>
<rules>
<logger name="*" minleve1="Warn" maxleve1="Fatal" writeTo="targetConsole" />
<logger name="SystemServices. *" minleve1="Trace" writeTo="sysServicesFile" final="true" />
<logger name="*"minleve1="Trace" writeTo="defaultFile" />
</rules>
</nlog>
archiveAboveSize为“单个日志文件超过多少字节就把日志存档”,

单位为字节,这样可以避免单个文件太大.

如果不设定maxArchiveFiles参数,则文件日志存档文件的数量会一直增加,

而如果设定maxArchiveFiles参数后,则最多保存maxArchiveFiles指定数量个数的存档文件,旧的会被删掉

当然也可以不设置maxArchiveFiles参数,而设置maxArchiveDays参数,这样可以设定保存若干天的日志存档。


关于nlog.config中rules的设置

1、rules节点下可以添加多个logger,每个logger都有名字(name属性),
     name是通配符格式的。
2、logger节点的minlevel属性和maxlevel属性,表示这个logger接受日志的最低级别和最高级别。
3、日志输出时,会从上往下匹配rules节点下所有的logger,若发现当前日志的分类名和Level符合这个logger的
   name的通配符,就会把日志输出给这个logger。如果匹配多个logger,就把这条日志输出给多个logger。
   但是如果一个logger设置了final="true",那么如果匹配到这个logger,就不继续向下匹配其他logger了。

结构化日志和集中日志服务

结构化日志有利于对错误日志进行分析和统计

集中化日志 ,集群化部署环境中,有多个服务器,将服务器的错误日志保存到集中化的日志服务器中,便于查询。

此处就不推荐使用Nlog了,推荐按使用Serilog

NuGet安装:Serilog.AspNetCore

配置

Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.CreateLogger();
builder.AddSerilog();
  private static void Main(string[] args)
    {
        ServiceCollection services = new ServiceCollection();
      	 services.AddLogging(logBuilder=>{
               		Log.Logger = new LoggerConfiguration()
                	.MinimumLevel.Debug()
               		.Enrich.FromLogContext()
                	.WriteTo.Console(new JsonFormatter())
                	.CreateLogger();
               	 	 builder.AddSerilog();
              });
       
        using (var sp = services.BuildServiceProvider())
        {
             
        };
        Console.ReadKey();
	}

使用占位符

class User{

    public string Name { get; set; }
    public string Email { get; set; }
}


User user = new User { Name="admin", Email="[email protected]"};
logger.LogDebug(“注册一个用户{@person}",user);

输出信息会输出user的信息

写入集中化的日志服务,这也是使用Serilog的目的之一

标签:logBuilder,sp,var,中科,services,日志,logger,跟着
From: https://www.cnblogs.com/guan-tou6/p/18233368

相关文章

  • 日志工具类之“根据标记的注解进行指定的字段日志记录-在展示方式上会美观一些”
    一、使用方法在添加、编辑等操作功能时可以使用该方案,在需要记录日志的实体类字段中进行注解标注。并标明对应的字段名二、代码1.使用LoggerUtils工具类生成日志publicJsonResultsavePrice(Priceprice){if(price.getId()!=null){String......
  • 跟着杨中科学习(一)
    .netLinq委托->lambda->LINQinti=5;整数类型的变量i指向数据5;委托是可以指向方法的类型。调用委托变量时执行的就是变量指向的方法。.net中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不用自定义委托类型。staticvoidf1(intz,intc){}//main函数in......
  • java框架-日志-体系与级别-技巧
     体系一是提供了统一的日志门面API,即图中紫色部分,实现了中立的日志记录API。二是桥接功能,即图中蓝色部分,用来把各种日志框架的API(图中绿色部分)桥接到SLF4JAPI。这样一来,即便你的程序中使用了各种日志API记录日志,最终都可以桥接到SLF4J门面API。三是适配功能,即图......
  • golang 使用 zap logger 加入Lumberjack 写日志
    golang使用zaplogger加入Lumberjack写日志Cd进入项目目录gogetgo.uber.org/zap/zapcoregoget-ugithub.com/natefinch/lumberjack关于下面代码说明: funcgetLogWriter()zapcore.WriteSyncer{lumberJackLogger:=&lumberjack.Logger{Filename:......
  • nlog日志
    添加配置文件设置属性:复制到输出目录,如果较新则复制<?xmlversion="1.0"encoding="utf-8"?><nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><targets&g......
  • MyBatis-Plus如何关闭SQL日志打印详解
    前言MyBatis-Plus配置关闭打印SQL日记失效追本溯源,关闭打印日记是真的失效吗?找到问题与解决问题 总结 前言前段时间公司的同事都过来问我,hua哥公司的项目出问题了,关闭不了打印sql日记,项目用宝塔自己部署的,磁盘满了才发现大量的打印sql日记,他们百度过都按照网上的配置......
  • webapi 中 使用log4net 日志记录到数据库中
    1.安装三个nuget包  2.创建 log4net.config文件,选中文件鼠标右键,选择属性->复制到输出目录修改为始终复制<?xmlversion="1.0"encoding="utf-8"?><log4net><!--Debug日志--><appendername="RollingFileDebug"type="log......
  • Spring Boot使用GraalVM编译为native excutable app的日志示例及主要步骤说明
    日志示例[INFO]---native-maven-plugin:0.9.28:compile(default-cli)@my-app---[INFO]FoundGraalVMinstallationfromGRAALVM_HOMEvariable.[INFO][graalvmreachabilitymetadatarepositoryforch.qos.logback:logback-classic:1.4.14]:Configurationdirector......
  • MySQL从入门到高级 --- 12.事务 && 13.锁机制 && 14.日志
    文章目录第十二章&&第十三章&&第十四章:12.事务12.1特性12.2隔离级别13.锁机制13.1各存储引擎对锁的支持状况:13.2锁特性13.3MyISAM表锁13.3.1加表锁13.4InnoDB行锁13.4.1行锁特点13.4.2行锁模式14.日志14.1错误日志14.2二进制日志14.2.1日志格式14.3......
  • awk统计访问nginx日志次数
    ###查询nginx日志的访问IP次数[root@localhostnginx]#awk'{a[$3]++}END{for(vina)printv,a[v]}'access.log|grep192.168.1.33192.168.1.3338018[root@localhostnginx]####查询nginx的状态码次数,统计192.168.1.33、192.168.1.10访问日志里面的状态码次数[root@loca......