.Net Core 日志框架

1 日志级别

1.1 日志级别的定义

LogLevel 日志级别的定义有一下七种:

  • Trace
  • Debug
  • Information
  • Warning
  • Error
  • Critical
  • None

1.2 记录不同日志级别对应的方法

ILogger 对象也有对应的日志级别记录方法:

  • LogDebug(string message, params object[] args)
  • LogTrace(string message, params object[] args)
  • LogInformation(string message, params object[] args)
  • LogWarning(string message, params object[] args)
  • LogError(string message, params object[] args)
  • LogCritical(string message, params object[] args)
  • Log(LogLevel logLevel, string message, params object[] args)

以上方法的重载方法都支持传入 EventId事件Id对象以及 Exception异常对象参数,便于更详细的记录日志以及更方便的排查问题。

1.3 配置参数

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "Console": {
      "LogLevel": {
        "Default": "Information",
        "Program": "Trace",
        "Demo.OrderService": "None"
      }
    }
  }
}
  • 日志的配置都统一存放在 Logging 下;
  • "Default": “Debug” 配置定义了默认的日志级别的Debug,更改Default的值就可以修改默认的日志级别;
  • 只有在日志级别及以上级别的日志才会被记录,比如日志级别定义为Information,那么使用LogDebug()及LogTrace()方法,实际上不会有日志输出;
  • 可以自定义日志级别,如上面的 “Demo.OrderService”: “None”。

2 日志使用

直接在构造函数中注入ILogging对象即可使用:

    class DemoController
    {
        private readonly ILogger<DemoController> _logger;
        public DemoController(ILogger<DemoController> logger)
        {
        	_logger = logger;
        	_logger.LogInformation("DemoController ctor");
        }
    }

注意事项:
在记录日志时,应该避免记录敏感信息,如密码、密钥等
建议使用模板拼接字符串的方式,尽量避免使用$或其他方式拼接字符串,使用模板拼接字符串的方式可以有效减少不必要的消耗:


// 建议使用,在确认要输出日志后,再进行字符串拼接,可以有效减少不必要的消耗
_logger.LogInformation("Show Time{time}", DateTime.Now);

// 尽量避免使用,不管输不输出日志都会先把字符串拼接好
_logger.LogInformation($"Show Time{DateTime.Now}");

3 日志作用域

3.1 作用域的使用场景

  • 一个事务包含多条操作时
  • 复杂流程的日志关联时
  • 调用链追踪与请求处理过程对应时
  • 其他需要关联日志的场景

3.2 BeginScope

使用 BeginScope 开启日志作用域:

using (_logger.BeginScope("ScopeId:{scopeId}", Guid.NewGuid()))
{
    logger.LogInformation("这是Info");
    logger.LogError("这是Error");
    logger.LogTrace("这是Trace");
}

4 Serilog–结构化日志组件:

使用结构化日志的好处有:

  • 易于检索
  • 易于分析统计

4.1 Serilog配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Error",
        "System": "Information"
      }
    }
  },
  "AllowedHosts": "*"
}

配置单独存放在配置文件的Serilog节点下,Override下的配置可以重载Logging下配置的日志记录等级

4.2 Serilog使用

首先需要引用包:Serilog.AspNetCore
在Program应用程序Main函数中配置Serilog:

    public class Program
    {
        public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();

        public static int Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(Configuration)
            .MinimumLevel.Debug()
            .Enrich.FromLogContext()
            .WriteTo.Console(new RenderedCompactJsonFormatter()) //输出日志到控制台
            .WriteTo.File(formatter: new CompactJsonFormatter(), "logs\\myapp.txt", rollingInterval: RollingInterval.Day) //输出日志到文件 new CompactJsonFormatter():输出格式
            .CreateLogger();
            try
            {
                Log.Information("Starting web host");
                CreateHostBuilder(args).Build().Run();
                return 0;
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Host terminated unexpectedly");
                return 1;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                .UseSerilog(dispose: true);  //使用Serilog
    }

在其他服务类中使用时,直接注入ILogger对象即可。

4.3 与 Elasticsearch 集成

引用包:Serilog.Sinks.Elasticsearch
包内包含的 ElasticsearchJsonFormatter 能够让日志的json输出兼容Elasticsearch的JSON格式(如 @timestamp )
更改 Serilog 配置使用 ElasticsearchJsonFormatter :

.WriteTo.Console(new ElasticsearchJsonFormatter()) 

控制台输出日志时,将按照Elasticsearch需要的格式来输出,如:

{
	"@timestamp": "2021-08-15T22:31:43.9143984+12:00",
	"level": "Information",
	"messageTemplate": "{HostingRequestStartingLog:l}",
	"message": "Request starting HTTP\/1.1 GET http:\/\/localhost:5000\/  ",
	"fields": {
		"Protocol": "HTTP\/1.1",
		"Method": "GET",
		"ContentType": null,
		"ContentLength": null,
		"Scheme": "http",
		"Host": "localhost:5000",
		"PathBase": "",
		"Path": "\/",
		"QueryString": "",
		"HostingRequestStartingLog": "Request starting HTTP\/1.1 GET http:\/\/localhost:5000\/  ",
		"EventId": {
			"Id": 1
		},
		"SourceContext": "Microsoft.AspNetCore.Hosting.Internal.WebHost",
		"RequestId": "0HLDRS5H8TSM4:00000001",
		"RequestPath": "\/",
		"CorrelationId": null,
		"ConnectionId": "0HLDRS5H8TSM4"
	},
	"renderings": {
		"HostingRequestStartingLog": [{
			"Format": "l",
			"Rendering": "Request starting HTTP\/1.1 GET http:\/\/localhost:5000\/  "
		}]
	}
}

在服务容器化时,可以使用 Fluentd 监控控制台,并将输出通过管道传输到 Elasticsearch 集群。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET Core 是一个开源的跨平台的 web 应用程序开发框架,它建立在 ASP.NET 框架的基础上,具有更高的性能和可扩展性。尽管 ASP.NET Core 是相对安全的框架,但仍然有一些潜在的漏洞可能存在: 1. 跨站脚本攻击(XSS):如果应用程序没有正确验证和过滤用户输入,攻击者可以注入恶意脚本来执行恶意操作。 2. 跨站请求伪造(CSRF):如果应用程序没有实施适当的防护措施,攻击者可以诱使受害者执行未经授权的操作。 3. 身份验证和授权问题:如果身份验证和授权机制没有正确实施,攻击者可能能够绕过身份验证或访问未经授权的资源。 4. 敏感数据泄露:如果应用程序没有正确处理和保护敏感数据,攻击者可能能够获取敏感信息,如用户凭据或其他敏感数据。 5. 不安全的文件上传:如果应用程序没有正确验证上传文件的类型和内容,攻击者可以上传恶意文件,并可能导致服务器上的安全问题。 6. 不安全的数据库操作:如果应用程序没有正确实施参数化查询和输入验证,可能会导致 SQL 注入漏洞。 7. 服务器配置问题:如果服务器配置不当,如启用调试模式或显示详细错误信息,攻击者可能能够获取敏感信息或利用其他安全问题。 为了减少漏洞的风险,开发人员应该实施安全开发最佳实践,如输入验证、输出编码、身份验证和授权、安全的会话管理、日志记录和监控等。此外,及时更新和修补 ASP.NET Core 框架和相关组件也是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值