zoukankan      html  css  js  c++  java
  • Serilog——一个集成了。net应用程序的优秀日志框架

    介绍 日志记录是一种记录程序执行信息的方法,用于调试和跟踪。日志记录通常涉及到向日志文件写入文本消息或向监视应用程序发送数据。这些日志信息可以帮助您更好地理解处理过的数据、警告、错误等等。在实践中,日志记录使开发人员和测试人员能够识别软件问题、监视实时系统并验证输出。 在。net平台中,有多种成熟的日志框架,如: Log4Net(http://logging.apache.org/log4net/) nloglog-project.org/ commonlogging (http://netcommon.sourceforge.net/) objectguy (http://www.theobjectguy.com/dotnetlog/) elmah (https://code.google.com/p/elmah/) 它们旨在简化开发人员处理日志的工作。所有日志框架的工作原理基本相同:将其中一个库包含到程序中,并将日志语句添加到代码中。如果启动了应用程序并启用了日志记录,日志记录信息将发送到配置的日志记录目的地,如日志文件、控制台或数据库。 Serilog是一个优秀的日志框架,多年来一直在使用。与. net的其他日志库不同,Serilog是基于结构化日志数据构建的。这个框架是围绕日志消息不应该是字符串的集合这一思想构建的。日志消息被保存为结构化数据(JSON),可以以文档形式写入各种输出提供者。 serilog结构 特性 简单的API和易于扩展的结构化数据,以保存您的数据的语义日志到任何不同的目标 概述 在开始之前,让我们快速概述一下将Serilog应用到您的项目中有多容易。请看下面的例子: 基本的日志: 隐藏,复制Codeusing Serilog; 名称空间SerilogTutorial { 公开课HelloSerilog { 公共静态void Main (string [] args) { / /创建日志记录器 var logger = new LoggerConfiguration() .WriteTo.Console () .CreateLogger (); / /输出日志 记录器。信息(“你好,Serilog !”); } } } 此示例将如下代码写入控制台。 隐藏,复制代码2015-10-19 15:39:06[信息]你好,Serilog! 向日志记录器传递参数: 隐藏,复制代码//创建日志程序 var logger = new LoggerConfiguration() .WriteTo.Console () .CreateLogger (); //写结构化数据 记录器。信息(“在{时间}ms内处理过的{数量}条记录”,500,120); 它写一行如下: 隐藏,复制代码2015-10-19 22:24:09[信息]在120毫秒内处理了500条记录 创建模板伐木工人: 隐藏,复制代码//创建日志程序 var logger = new LoggerConfiguration() .WriteTo.Console () .CreateLogger (); / /准备数据 var order = new {Id = 12, Total = 128.50, CustomerId = 72}; var customer = new {Id = 72, Name = "John Smith"}; //写日志消息 记录器。信息("New orders {OrderId} by {Customer}", order。Id、客户); 它打印日志如下: 隐藏,复制Code2015-10-19 22:32:43[信息]New orders 12 by“{Id = 72, Name = John Smith}” 正如我们所看到的,Serilog的强大之处在于它支持流程消息参数和结构化数据。传统的日志库将消息呈现为字符串,Serilog则延迟呈现,并从消息模板中单独捕获参数。 使用的代码 现在让我们深入了解如何将Serilog应用到您的项目中。以下是基本步骤: 准备安装serilog创建日志程序 配置日志记录器添加接收器 自定义日志记录器写日志消息 定义日志输出模板,指定安装数据库接收器的最小级别 准备 当然,您需要安装Visual Studio并准备好一个项目。为了简化,您只需要创建一个控制台应用程序。 安装serilog 通常,有两种方式来安装nuget包。 方式1 -通过Nuget包管理器 右键单击您的项目>管理nuget包>搜索serilog 方式2 -通过项目经理控制台 转到菜单比;工具比;NuGet PackageManager祝辞项目管理器控制台 PM>安装包Serilog 创建一个日志记录器 Logger是写日志的基础,用于输出日志消息。要创建日志程序,您需要指定两个设置。 配置日志记录器 您需要创建一个LoggerConfiguration对象 添加下沉 接收是处理日志的位置或目的地。接收器可以是控制台、文件或数据存储。接收器使用WriteTo()方法配置。 现在,你可以构建一个日志程序来写事件到控制台: 隐藏,复制Code

    var logger = = new LoggerConfiguration()
        .WriteTo.ColoredConsole()
        .CreateLogger();

    可以通过链接WriteTo方法添加多个额外的接收器: 隐藏,复制Code

    var logger = new LoggerConfiguration()
        .WriteTo.ColoredConsole()
        .WriteTo.RollingFile(@"C:Log-{Date}.txt")
        .CreateLogger();

    写日志消息 现在,日志记录器已经可以使用了。您可以简单地写日志如下: 隐藏所在sp;复制Code

    log.Debug("Debugging message");
    log.Information("Information message");
    log.Warning("Warning message");
    log.Error("Error message");
    log.Fatal("Fatal message");

    自定义日志记录器 为了修改logger以满足您的需要,您需要调优logger。 定义日志输出模板 日志消息模板控制接收如何呈现事件。消息模板是标准。net格式字符串的超集,并且与string.Format()方法兼容。此外,它支持JSON对象或常规c#对象(带有@符号)作为参数。 隐藏,复制Code

    var position = new { Latitude = 25, Longitude = 134 };
    var elapsedMs = 34;
    log.Information("Processed {@Position} in {Elapsed} ms.", position, elapsedMs);

    它打印日志如下: 隐藏,复制Code

    09:14:22 [Information] Processed { Latitude: 25, Longitude: 134 } in 34 ms.

    指定最低水平 有五个级别的日志: 级使用详细的跟踪信息和调试细节;通常只有在不寻常的情况下才会开启调试内部控制流和诊断状态转储,以便于准确定位所识别的问题、感兴趣的事件或与外部观察者相关的信息;默认启用的最小日志记录级别警告指示器显示可能的问题或服务/功能退化错误,该错误指示应用程序或已连接的系统中的故障,导致应用程序完全失败的致命关键错误 Serilog使用最小级别和较高级别写入日志,忽略较低级别。例如,指定最小级别,因为除Verbose外,调试将输出日志。 隐藏,复制Code

    var logger = new LoggerConfiguration()
             .MinimumLevel.Debug()
             .WriteTo.ColoredConsole()
             .CreateLogger();

    您还可以覆盖最小级别。例如,我们希望在控制台中显示高于调试的所有日志,但将所有错误日志保存到数据库中。为了满足这个需求,您可以将全局级别指定为Debug,并将数据库接收设置为警告级别。 隐藏,复制Code

    var logger = new LoggerConfiguration()
             .MinimumLevel.Debug()
        .WriteTo.ColoredConsole()
        .WriteTo.MongoDB("mongo://myserver/logs", minimumLevel: LogEventLevel.Warning)
        .CreateLogger();
    logger.Information("I am an information log"); // will print in console
    log.Error("I am an error log");// will print in console and also store in database

    将错误级日志事件写入文件: 隐藏,复制Code

    var logger = new LoggerConfiguration()
        .WriteTo.File("log.txt", LogEventLevel.Error)
        .CreateLogger();
    logger.Information("I am an information log"); // will not in log file
    logger.Error("I am an error log"); // will write to log file

    如果没有指定最小级别,Serilog将使用信息级别事件作为缺省值—信息和更高级别的事件将被处理。 水槽安装数据库 Serilog支持内置接收器,包括控制台、文件(单个/滚动)和TextWriter。为了将serilog日志导出到不同的目的地,需要安装额外的接收器。 一种典型的情况是将日志写入数据库,您需要安装额外的接收器。例如,使用SQL Server数据库作为目标需要安装SQL Server sink。 隐藏,复制Code

    PM> Install-Package Serilog.Sinks.MSSqlServer

    使用SQL脚本创建数据库日志事件和表日志: 隐藏,复制Code

    if not exists(select * from sys.databases where name='LogEvents')
             create database LogEvents;
    Go
    Use LogEvents;
    Go
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [Logs](
             [Id] [int] IDENTITY(1,1) NOT NULL,
             [Message] [nvarchar](max) NULL,
             [MessageTemplate] [nvarchar](max) NULL,
             [Level] [nvarchar](128) NULL,
             [TimeStamp] [datetime] NOT NULL,
             [Exception] [nvarchar](max) NULL,
             [Properties] [xml] NULL,
     CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED
    (
             [Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, _
    	ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]
    GO

    脚本将创建LogEvents数据库和日志表: 写入SQL Server数据库接收器: 隐藏,复制Code

    var logger = new LoggerConfiguration()
            .WriteTo.MSSqlServer(@"Server=.;Database=LogEvents;
            	Trusted_Connection=True;", "Logs")
            .CreateLogger();
    logger.Information("I am an information log");
    logger.Error("Hello, I am an error log");

    你将得到: 更多的 本文只讨论Serilog的基本概念。这里可以提供更高级的功能。推进主题包括: 通过丰富添加动态属性添加日志过滤器过滤掉嘈杂的事件和选择特定的日志添加子日志处理复杂的日志要求更多的吸收,如MongoDB, Seq, RavenDB,电子邮件和Azure DocumentDB。完整的列表可以在这里找到。 历史 2015年10月20日:修正格式 本文转载于:http://www.diyabc.com/frontweb/news15899.html

  • 相关阅读:
    LVS基于DR模式负载均衡的配置
    Linux源码安装mysql 5.6.12 (cmake编译)
    HOSt ip is not allowed to connect to this MySql server
    zoj 3229 Shoot the Bullet(无源汇上下界最大流)
    hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割
    poj 2391 Ombrophobic Bovines(最大流+floyd+二分)
    URAL 1430 Crime and Punishment
    hdu 2048 神、上帝以及老天爷(错排)
    hdu 3367 Pseudoforest(最大生成树)
    FOJ 1683 纪念SlingShot(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/Dincat/p/13490021.html
Copyright © 2011-2022 走看看