Я перевожу приложение ASP.Net в ASP.Net Core.В принципе настройка NLog работает нормально, как и ожидалось.Теперь я хочу записать идентификатор сессии вместе с сообщением журнала.Для этого я добавил - Microsoft.AspNetCore.Session - NLog.Web.AspNetCore от NuGet.
Сессии активируются при запуске, и я получаю идентификаторы сессий в коде.
После NLog на GitHub в Startup.cs
следует добавить
//add NLog.Web
app.AddNLogWeb();
, что не имеет никакого смысла, поскольку метод помечен как устаревший.
Однако ни с этой строкой, ни без нее NLog не выдает правильный вывод в файл журнала.В журнале регистрируется только следующее:
2018-12-03 09:59:42.6111 Warn Exception in layout renderer. Exception: System.InvalidOperationException: Session has not been configured for this application or request.
at Microsoft.AspNetCore.Http.DefaultHttpContext.get_Session()
at NLog.Web.LayoutRenderers.AspNetSessionIdLayoutRenderer.DoAppend(StringBuilder builder, LogEventInfo logEvent)
at NLog.LayoutRenderers.LayoutRenderer.RenderAppendBuilder(LogEventInfo logEvent, StringBuilder builder)
Целевая конфигурация выглядит следующим образом:
<target archiveAboveSize="10000000"
xsi:type="File"
fileName="${basedir}/logs/SystemOut.log"
archiveFileName="${basedir}/logs/SystemOut_${shortdate}.{#}.log"
archiveEvery="Day"
archiveNumbering="Rolling"
maxArchiveFiles="50"
layout="[${date:format=dd\.MM\.yyyy\-HH\:mm\:ss}] [${level}] [${callsite}] [${aspnet-sessionid}] [Client:${event-context:item=clientId}] [User:${aspnet-user-identity}] Url: ${aspnet-request-url} Action: ${aspnet-mvc-action} ${message} ${exception}"
autoFlush="true"
name="sysout" />
А вот содержимое Startup.cs
:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(120);
options.Cookie.HttpOnly = true;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
Чего не хватает в моей конфигурации?