转载请注明原文链接!
为什么要使用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中安装NLog和NLog.Web.AspNetCore ,这两个是NLog相关的包。
还需要安装NLog写入数据库的数据库适配器,我这里写入到MySQL数据库,
上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mongodb进行存储日志,那就是完美的结合,MongoDB也是文档式数据库,存储的格式很像JSON,也可以它是一个JSON文件,查询数据库快。不扯远了,还是讲讲Serilog的使用吧!
一、什么是Serilog?
Serilog 是 ASP.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