Вход в AspNetCore Hosting / Перенаправление вывода консоли - PullRequest
0 голосов
/ 04 июля 2018

Я только недавно добавил проект AspNetCore к нашему программному обеспечению, который является не более чем небольшим сайтом MVC. Для размещения этого проекта я использую функции Microsoft.AspNetCore.Hosting и Topshelf для запуска хостинга в службе Windows.

Проблема в том, что я не могу получить отладочную информацию из процесса хостинга после его запуска в службе Windows. Обычно вся информация записывается на консоль, и, поскольку я использую собственную трассировку / регистрацию в нашем программном обеспечении, я хотел бы продолжать использовать ее, если это возможно, или, по крайней мере, сказать процессу хостинга просто переслать всю информацию на вызов метода нашей трассировки не пропустите ничего и внедрите в будущем один из распространенных регистраторов, таких как NLog.

Вот код для хостинга

public class Program
{
    public static void Main(string[] args)
    {
        // Name of the executable
        var nameOfExe = Process.GetCurrentProcess().MainModule.FileName;

        // Path of the current executable
        var pathToContentRoot = Path.GetDirectoryName(nameOfExe);

        // Path of the www root for the static files
        var pathToWebRoot = pathToContentRoot + @"\wwwroot";

        IWebHost host = WebHost.CreateDefaultBuilder()
        .UseKestrel()
        .UseContentRoot(pathToContentRoot)
        .UseIISIntegration()
        .UseWebRoot(pathToWebRoot)
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .Build();

        host.RunAsCustomService();
    }
}


public static class WebHostServiceExtensions
{
    public static void RunAsCustomService(this IWebHost host)
    {
        var webHostService = new Service(host);
        ServiceBase.Run(webHostService);
    }
}


public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        if(env.IsDevelopment())
        {
            env.ContentRootPath = env.ContentRootPath.Replace("Bin", @"Main");
            env.ContentRootFileProvider = new PhysicalFileProvider(env.ContentRootPath);
            env.WebRootPath = env.WebRootPath.Replace("Bin", @"Main");
            env.WebRootFileProvider = new PhysicalFileProvider(env.WebRootPath);
        }

        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSession(options => {
            options.IdleTimeout = TimeSpan.FromMinutes(500); });
        // Add framework services.
        services
            .AddLocalization(options => options.ResourcesPath = "Resources")

            .AddMvc().ConfigureApplicationPartManager(manager =>
            {
                var oldMetadataReferenceFeatureProvider = manager.FeatureProviders.First(f => f is MetadataReferenceFeatureProvider);
                manager.FeatureProviders.Remove(oldMetadataReferenceFeatureProvider);
                manager.FeatureProviders.Add(new ReferencesMetadataReferenceFeatureProvider());
            })
            .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
            .AddDataAnnotationsLocalization();

        services.AddSingleton<FFDModel>();
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

        services.Configure<WebSettings>(Configuration.GetSection("ValidationFilters"));
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseSession();

        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        IList<CultureInfo> supportedCultures = new List<CultureInfo>
        {
             new CultureInfo("en-US"),
             new CultureInfo("de-DE"),
            };
        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("en-US"),
            SupportedCultures = supportedCultures,
            SupportedUICultures = supportedCultures
        });

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=FFD}/{action=Index}/{id?}");
        });
    }
}

1 Ответ

0 голосов
/ 04 июля 2018

Я бы использовал Serilog https://serilog.net для входа в любое приложение .NET.

Serilog может быть настроен на перенаправление вывода на несколько целей, например консоль, катящийся файл. Если у вас есть пользовательское назначение / требование для ведения журнала, вы можете переслать вывод, написав пользовательский Sink.

Легко интегрировать в приложение ASP.Net Core, используя расширение IWebHostBuilder https://github.com/serilog/serilog-aspnetcore

Источники

...