Fanray uses Serilog and practices Structured Logging. One of the output sources is Seq.
Setup
The wiring of Serilog happens inside Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseApplicationInsights() .UseSerilog() .UseStartup<Startup>();
And the configuration of it with Seq happens in appsettings.json
and appsettings.Production.json
. Below is the snippet from appsettings.json with MinimumLevel
set to Deubg
for local development.
"Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.Seq" ], "WriteTo": [ { "Name": "Console" }, { "Name": "Seq", "Args": { "serverUrl": "http://localhost:5341" } } ], "MinimumLevel": { "Default": "Debug", "Override": { "Microsoft": "Information", "System": "Information" } } }
Structured Logging
Structured Logging enables you to dump entire objects as JSON into the logs and you can later search for them with their properties as search criteria.
For example I have this code in BlogService.cs, it logs a BlogPost object. Notice the special syntax {@BlogPost}
_logger.LogDebug("Show {@BlogPost}", blogPost);
That outputs the following and notice it also outputs the nested objects inside BlogPost like Category, Tags etc.
{ Type: "BlogPost", CategoryTitle: "Technology", Tags: […], TagTitles: […], Body: "<p>This is a test post.</p>", BodyMark: null, Category: {…}, CategoryId: 2, CommentCount: 0, CommentStatus: "NoComments", CreatedOn: "2018-09-22T02:23:40.0000000+00:00", CreatedOnDisplay: "yesterday", UpdatedOnDisplay: "09/21/2018", Excerpt: "This is a test post.", ParentId: null, RootId: null, Slug: "this-is-a-test", Status: "Draft", Title: "This is a test", UpdatedOn: "2018-09-22T02:23:41.0002676+00:00", User: {…}, UserId: 1, ViewCount: 0, PostTags: […], Id: 5, _typeTag: "BlogPost" }
Seq
Seq is the tool that allows you to search through what you have logged taking advantage of Structured Logging. And it is my recommended way to log during the development of Fanray.
To get started with Seq first download and install it from https://getseq.net/ and then to use it during development simply go to http://localhost:5341.
Search for Objects
To search for an object, say give me all BlogPost with a Body that contains the word "Welcome" case insensitive.

Here are docs on Seq's Filter Syntax and Cheet Sheet https://docs.getseq.net/docs/query-syntax
Search for a Request
A request is common thing to search through the log, ASP.NET Core outputs detailed debug information during development.
For example, when I publish a new post from Open Live Writer, I want to see what exactly happens during that request of publishing my post. Since Asp.net Core provides these detailed info for each request thus you can search for it with its id "0HLH1ICD1KGGF:00000001". The screen shot below shows the entirety of that request, the bottom rectangle marks the start of the request while the top rectangle marks the finish of it. From this you are able to see things like all the SQLs EF Core executed, the MetaWeblogAPI newPost endpoint was called and the XML it received and other good stuff.
