I solved this issue by using a combination of Jordan’s answer and this answer.
I changed my Loggerconfiguration by adding the logcontext through enrichment and I added the property ‘method’ to my outputTemplate:
var logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.RollingFile(Configuration.GetValue<string>("LogFilePath") + "-{Date}.txt", LogEventLevel.Information,
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{Method}) {Message}{NewLine}{Exception}")
.CreateLogger();
The Enrich.FromLogContext enables properties to be pushed to the outputTemplate by using the LogContext.PushProperty() method. In this case for the ‘method’ property (notice the {Method} in the outputTemplate).
Example for async methods:
using (LogContext.PushProperty("Method", new LogAsyncMethods().GetActualAsyncMethodName()))
{
_log.LogInformation("Log message.");
}
Where GetActualAsyncMethodName() is written like this:
public static string GetActualAsyncMethodName([CallerMemberName]string name = null) => name;
This works fine for async methods.
Now for non-async methods this works fine:
using (LogContext.PushProperty("Method", System.Reflection.MethodBase.GetCurrentMethod().Name))
{
_log.LogInformation("Changing of customer name succeeded");
}
Now the method name is being displayed in the logging. The SourceContext adds the namespace + the class and by adding “.{Method}” it will result in:
Namespace.ClassName.MethodName