在我们常规的调试或者测试的时候,喜欢把一些测试信息打印在控制台或者记录在文件中,对于.netframework项目来说,我们输出控制台的日志信息习惯的用Console.WriteLine来输出查看,不过对于.netcore的项目来说,这种输出看不到任何信息了,不过即使这样,我们建议还是把一些测试的日志记录在文件中,供查看对比。本篇随笔介绍使用Serilog 来记录日志信息,包括应用于.netframework项目和.netcore项目中都适合。

1、在Winform项目中整合Serilog 记录日志

在.NET使用日志框架第一时间会想到NLog或是Log4Net,Serilog 是这几年快速崛起的Log框架之一,Serilog是以Structured logging 为基础进行设计,通过logging API 可以轻松的记录应用程序中对象属性,方便快速进行logging 内容进行查询与分析,并将其纪录内容通过json (可指定) 的方式输出。

不管对于.netframwork或者.netcore的Winform项目来说,使用Serilog 来记录日志信息的操作都很类似,它都支持的。

官网地址:https://serilog.net/,或者参考它的Github地址:https://github.com/serilog/serilog

我们只需要引入对应的几个Serilog 相关DLL即可,如下所示。

然后在Main函数中添加对应的处理代码,如下所示。

    static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();

在类代码或者界面代码中,直接通过方法输出日志信息即可。

   //使用Serilog记录日志信息
Serilog.Log.Information(json);

它和其他Log组件,如Log4net一样,它的使用区分类别来输出不同类型的日志,支持Verbose、Debug、Information、Error、Warning、Fatal 几个接口的输出。

Serilog.Log.Verbose("verbose"); // 用于跟踪信息和调试细节,不会输出显示出来

//以下为常用记录日志方法
Serilog.Log.Information("info");
Serilog.Log.Debug("debug");
Serilog.Log.Warning("warning");
Serilog.Log.Error("err");
Serilog.Log.Fatal("fatal"); 

输出日志信息如下所示。

Serilog 如果想个性化设置日志输出到什么地方,需要引用一些serilog的接收器。Serilog的输出对象称之为Sink

Github上提供了大量的Serilog 第三方的可用sinks,这里简单的列举几个常用的:

2、在.NetCore项目的Web API中整合Serilog

在.netcore的Web API项目中配置和上面的有一些差异,引入相关的Serilog组件类库,如下所示。

其中需要在IHostBuilder或者IWebHostBuilder中注入Serilog接口,如下初始化代码所示。

在Web API的控制器中使用代码如下所示

    /// <summary>
/// 用于接收长语音信息回调的处理
/// </summary>
[ApiController]
[Route("[controller]")]
public class LongVoiceController : ControllerBase
{
private readonly ILogger<LongVoiceController> _logger; public LongVoiceController(ILogger<LongVoiceController> logger)
{
_logger = logger;
} /// <summary>
/// 测试控制器,路由:get /longvoice
/// </summary>
/// <returns></returns>
[HttpGet]
public List<string> TestList()
{
return new List<string>()
{
"测试列表接口",
"检查控制器正常"
};
} /// <summary>
/// 回调写入结果, 路由:post /longvoice
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<CommonResultDto> CallBack(LongVoiceResultDto input)
{
CommonResultDto result = null;
var json = JsonConvert.SerializeObject(input, Formatting.Indented);
_logger.LogInformation(json); result = new CommonResultDto(0, "操作成功");
return await Task.FromResult(result);
}
}

我们注意到直接使用web API 的 IIogger<T>接口调用写日志即可。

_logger.LogInformation(json);

这样我们可以看到相关的日志输出

在Winform项目和Web API的.NetCore项目中使用Serilog 来记录日志信息的更多相关文章

  1. ASP.NET Web API Selfhost宿主环境中管道、路由

    ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...

  2. ASP.NET Web API WebHost宿主环境中管道、路由

    ASP.NET Web API WebHost宿主环境中管道.路由 前言 上篇中说到ASP.NET Web API框架在SelfHost环境中管道.路由的一个形态,本篇就来说明一下在WebHost环境 ...

  3. ASP.NET Core Web API 最小化项目

    ASP.NET Core中默认的ASP.NET Core 模板中有Web API 模板可以创建Web API项目. 有时,只需要创建一个API,不需要关心Razor,本地化或XML序列化.通过删除无用 ...

  4. 给现有MVC项目增加Web API支持

    在MVC4中自带了Web API不再需要从Nuget中下载. Step1:增加System.Web.Http,System.Web.Http.WebHost,System.Net.Http三个程序集的 ...

  5. mvc Web api 如何在控制器中调用

    关于如何调用 mvc Web api 的方法,网上一搜就是一大把,基本都是在前台jq中调用的,但是如何在后台调用呢? 本楼主做了一下测试,仅供参考. 先写一个简单的api,如下:[域1] namesp ...

  6. 如何使用ASP.NET Web API OData在Oracle中使用Entity Framework 6.x Code-First方式开发 OData V4 Service

    环境: Visual Studio 2013 + .Net Framework 4.5.2 1.新建项目 2.安装OData,ODP.NET 安装的包: 下面是部分代码: using System; ...

  7. Global Error Handling in ASP.NET Web API 2(webapi2 中的全局异常处理)

    目前,在Web API中没有简单的方法来记录或处理全局异常(webapi1中).一些未处理的异常可以通过exception filters进行处理,但是有许多情况exception filters无法 ...

  8. ssm项目,web容器无法初始化项目

    在web.xml中配置加载spring时,发现项目无法运行:而去掉spring的配置时,项目可以被初始化. 此时应考虑到spring的配置文件中存在错误,以至于web容器无法对项目成功初始化,在web ...

  9. web api(基于NFine框架) 中接口跳转数据格式错误解决方案

    using NFine.Code; using NFine.Domain; using System.Web.Http; using Newtonsoft.Json; namespace Api.Co ...

随机推荐

  1. Godunov's 定理

    Godunov's theorem 转自Wiki 目录 Godunov's theorem 简介 定理 定理1. 单调保持性(Monotonicity preserving) 定理2. Godunov ...

  2. EXCEl-数据透视表按照自定义序列排序

    用着感觉挺神奇,也有点奇怪,可能不是很懂里边的原理吧.最后,需要排序的列,应该在数据透视表首列才有效. 参考:https://jingyan.baidu.com/article/bea41d43a53 ...

  3. STL学习笔记1

    STL六大部件 容器.分配器.算法.迭代器.适配器.仿函数 他们的关系如下

  4. Oracle—merge into语法

    oracle的merge into语法,在这种情况下: 基于某些字段,存在就更新,不存在就插入: 不需要先去判断一下记录是否存在,直接使用merge into merge into 语法: MERGE ...

  5. Tomcat(2):配置Tomcat

    1,打开IDEA创建一个项目 2,配置Tomcat服务器 3,运行 5,成功 t t

  6. Spring Boot中使用Redis

    一.定义工程 创建一个spring boot模块 二.修改pom文件 在pom文件中添加Spring Boot与Redis整合依赖 <dependencies> <!--spring ...

  7. 【Services】【Web】【LVS】lvs基础概念

    1.简介 1.1. 作者:张文嵩,就职于阿里 1.2. LVS是基础四层路由.四层交换的软件,他根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机: 1.3. IPTABLES的请求转发路 ...

  8. 通过 Ajax 发送 PUT、DELETE 请求的两种实现方式

    一.普通请求方法发送 PUT 请求 1. 如果不用 ajax 发送 PUT,我们可以通过设置一个隐藏域设置 _method 的值,如下: <form action="/emps&quo ...

  9. feignclient发送get请求,传递参数为对象

    feignclient发送get请求,传递参数为对象.此时不能使用在地址栏传递参数的方式,需要将参数放到请求体中. 第一步: 修改application.yml中配置feign发送请求使用apache ...

  10. Libev——ev_timer 相对时间定时器

    Libev中的超时监视器ev_timer,是简单的相对时间定时器,它会在给定的时间点触发超时事件,还可以在固定的时间间隔之后再次触发超时事件. 1.超时监视器ev_timer结构 typedef st ...