My ASP.NET Core 2.1 app logs to a Serilog file sink, all the \"usual stuff\" - i.e. app related stuff such as debug, monitoring, performance, etc.
However we also ne
You can definitely do that.
You need to import package Serilog.Sinks.File
Then you have to configure Serilog.
In program.cs do following thing.
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File(
@"<>",
fileSizeLimitBytes: 10000000,
rollOnFileSizeLimit: true,
shared: true,
flushToDiskInterval: TimeSpan.FromSeconds(1))
.CreateLogger();
In buildWebHost function add UseSerilog().
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
.UseSerilog() // <-- Add this line
.Build();
Update 1
I have used EventId property. This is just demo that how you can use different file based on eventId but for your requirement you have to implement additional thing your own.
Program.cs
public class Program
{
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.WriteTo.Logger(cc => cc.Filter.ByIncludingOnly(WithProperty("EventId",1001)).WriteTo.File("Test1001.txt",flushToDiskInterval: TimeSpan.FromSeconds(1)))
.WriteTo.Logger(cc => cc.Filter.ByIncludingOnly(WithProperty("EventId", 2001)).WriteTo.File("Test2001.txt", flushToDiskInterval: TimeSpan.FromSeconds(1)))
.CreateLogger();
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args).UseSerilog()
.UseStartup();
public static Func WithProperty(string propertyName, object scalarValue)
{
if (propertyName == null) throw new ArgumentNullException("propertyName");
ScalarValue scalar = new ScalarValue(scalarValue);
return e=>
{
LogEventPropertyValue propertyValue;
if (e.Properties.TryGetValue(propertyName, out propertyValue))
{
var stValue = propertyValue as StructureValue;
if (stValue != null)
{
var value = stValue.Properties.Where(cc => cc.Name == "Id").FirstOrDefault();
bool result = scalar.Equals(value.Value);
return result;
}
}
return false;
};
}
}
My HomeController.cs
public class HomeController : Controller
{
ILogger logger;
public HomeController(ILogger logger)
{
this.logger = logger;
}
public IActionResult Index()
{
logger.Log(LogLevel.Information,new EventId(1001), "This is test 1");
logger.Log(LogLevel.Information, new EventId(2001), "This is test 2");
return View();
}
}
Note: Main thing is that you have to use some type of filter.