相关文章推荐
个性的单杠  ·  git - git log ...·  6 天前    · 
光明磊落的路灯  ·  对于 Git ...·  4 天前    · 
飘逸的企鹅  ·  Windows ...·  1 年前    · 
痴情的火龙果  ·  Visual ...·  1 年前    · 
豪爽的西装  ·  Log4J.xml配置详解 - ...·  1 年前    · 

转载请注明原文链接!

为什么要使用Serilog?

Serilog比NLog 功能更为强大,能支持结构化的消息,不像NLog扁平和繁琐,配置也更加方便。支持代码配置、json、xml。但我觉得用代码配置就挺好,nlog就是XML配置太麻烦。

1、nuget 安装
Serilog.AspNetCore  会自动安装依赖项

2、(可选,异步写入) nuget 安装 Serilog.Sinks.Async

3、注册服务配置写入文件

builder.Services.AddLogging(bulid =>
     Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .Enrich.FromLogContext()
     WriteTo.Async(config => config.File(
               "d://.log",
               rollingInterval: RollingInterval.Day,
               fileSizeLimitBytes: 1024 * 1024 * 10,//单位字节 不配置时默認1GB
               retainedFileCountLimit: 10,//保留最近多少個文件  不配置时默認31個
               rollOnFileSizeLimit: true,//超過文件大小時 自動創建新文件 
               shared: true)
    .CreateLogger();
    bulid.AddSerilog();

4、随便找个控制器在构造函数注入后即可使用

  [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
            while (true)
                _logger.LogInformation("ASDASDASDASDASDADSASDASDASDASDASDADSASDASDASDASDASDADSASDASDASDASDASDADS");
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            .ToArray();

打开d盘找到即可看见日志文本

输出格式如下:

2022-05-28 00:12:35.949 +08:00 [INF] ASDASDASDASDASDADSASDASDASDASDASDADSASDASDASDASDASDADSASDASDAS

(推荐)更高级一些的详细配置,建议把log等级分开配置 推荐配置4种

1、设置好4个路径,对应不同的日志类型

string infoPath = Directory.GetCurrentDirectory() + @"\logs\info\.log"; ;
string waringPath = Directory.GetCurrentDirectory() + @"\logs\waring\.log";
string errorPath = Directory.GetCurrentDirectory() + @"\logs\error\.log";
string fatalPath = Directory.GetCurrentDirectory() + @"\logs\fatal\.log";

2、(推荐,不设也行)设置好模板

string template = "{NewLine}时间:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}等级:{Level}{NewLine}来源:{SourceContext}{NewLine}具体消息:{Message}{NewLine}{Exception}";

3、具体配置

builder.Services.AddLogging(bulid =>
     Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .Enrich.FromLogContext()
    .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Information).
     WriteTo.Async(congfig => congfig.File(
               infoPath,
               rollingInterval: RollingInterval.Day,
               fileSizeLimitBytes: 1024 * 1024 * 10,//默認1GB
               retainedFileCountLimit: 10,//保留最近多少個文件  默認31個
               rollOnFileSizeLimit: true,//超過文件大小時 自動創建新文件  
               shared: true,
               outputTemplate: template)
    //-----------------------------------------------------------------------------------
     .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Warning).
     WriteTo.Async(congfig => congfig.File(
               waringPath,
               rollingInterval: RollingInterval.Day,
               fileSizeLimitBytes: 1024 * 1024 * 10,
               retainedFileCountLimit: 10,
               rollOnFileSizeLimit: true,
               shared: true,
               outputTemplate: template)
    //-----------------------------------------------------------------------------------
    .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Error).
     WriteTo.Async(congfig => congfig.File(
               errorPath,
               rollingInterval: RollingInterval.Day,
               fileSizeLimitBytes: 1024 * 1024 * 10,
               retainedFileCountLimit: 10,
               rollOnFileSizeLimit: true,
               shared: true,
               outputTemplate: template)
    //-----------------------------------------------------------------------------------
     .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Fatal).
     WriteTo.Async(congfig => congfig.File(
               fatalPath,
               rollingInterval: RollingInterval.Day,
               fileSizeLimitBytes: 1024 * 1024 * 10,
               retainedFileCountLimit: 10,
               rollOnFileSizeLimit: true,
               shared: true,
               outputTemplate: template)
    //-----------------------------------------------------------------------------------
    .CreateLogger();
    bulid.AddSerilog();

代码有点多,建议自己做封装

只做了基本配置,不够用的话,具体更多配置或更高级用法自行查询官网。

https://github.com/serilog

1.日志自动写入到数据库、写入到文件 2.appsettings.json数据库连接更改后,不需要去改NLog中的连接地址,启动网站或项目时自动检测变动然后去更改,以appsettings.json为准,保持同步。 3.写入日志时,除了NLog自带的字段,新增LogType自定义字段记录日志类型,例如网站日志、中间件日志等 4.统一的写日志方法,不用每次get一个logger对象(或依赖注入)来记日志 在nuget中安装NLogNLog.Web.AspNetCore ,这两个是NLog相关的包。 还需要安装NLog写入数据库的数据库适配器,我这里写入到MySQL数据库, 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mongodb进行存储日志,那就是完美的结合,MongoDB也是文档式数据库,存储的格式很像JSON,也可以它是一个JSON文件,查询数据库快。不扯远了,还是讲讲Serilog的使用吧! 一、什么是Serilog? SerilogASP.NET Core 的一个插件,可以简化日志记录。Serilog 有各种. 简单了解SeriLog serilog 一般分为如下几个等级(从低到高排列,等级最高是Fatal)。 log.Verbose("verbose"); // 好像没什么用,也不会输出显示出来 //以下为常用记录日志方法 log.Information(“info”); log.Debug(“debug”); log.Warning(“warning”); log.Error(“err”); log.Fatal(“fatal”); 无论是core或framework ,配置基本相同,就是声明一个(如下代码) 静态文件(HTML,CSS,图片和Javascript之类的资源)会被ASP.NET Core应用直接提供给客户端。 静态文件通常位于网站根目录(web root) <content>/wwwroot文件夹下。通常会把项目的当前目录设置为Content root,这样项目的web root就可以在开发阶段被明确。 public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseContentRoot(Directory 也可以对个别相应的包进行删除等,都是可以的。例如,标注的1是读取配置文件的,如果不需要通过配置文件进行操作,就可以使用这个包。2是打印到控制台的,如果不需要打印到控制台,也可以不引用。3是写入到文件的,如果不需要写入到文件,也是可以不提供的。我在此处全部引入,方便可以使用多种日志记录方法。Async是异步写入日志,一般需要引入。 我们先在启动项目的Program类里面,新增一些对Serilog的支持操作: 使用Log4Net,NLog,Elmah和MVC,WebForms的非常简单的演示站点的解决方案 NuGet软件包还原 为了减少下载时间,此解决方案使用NuGet软件包还原。 这意味着当您从Github下载解决方案时,它不包含packages文件夹。 然后,在构建解决方案时,Visual Studio会自动从NuGet加载程序包。 如果您使用的是NuGet 2.7或更高版本,所有这些都会自动发生。 但是,如果您使用NuGet 2.0-2.6,则需要征得您的同意。 参见 该解决方案包括使用请求ID( )的演示站点。 查找以“-RequestIds”结尾的项目。 接下来我们为项目添加日志支持 1、由于本项目我们需要将日志写入到文件,因此我们可以直接安装Serilog.Sinks.File,打开Nuget,搜索安装Serilog.Sinks.File。 2、打开Program.cs,添加如下代码: #region 初始化日志 Log.Logger = new LoggerConfiguration() .MinimumLevel.Error() .WriteTo.File(Path.Combine("Logs", @"Log.txt"), 1 Serilog是什么? 在.NET使用日志框架第一时间会想到NLog或是Log4Net,Serilog 是这几年快速崛起的Log框架之一,Serilog是以Structured logging 为基础进行设计,透过logging API 可以轻松的记录应用程式中对象属性,方便快速进行logging 内容进行查询与分析,并将其纪录内容透过json (可指定) 的方式输出。 首先,将Serilog.AspNetCore NuGet软件包安装到您的应用程序中。 Serilog.AspNet