在 IIS 上为 serilog 启用文件日志记录

Cha*_*ith 6 iis serilog .net-core

我想在 IIS 上启用文件日志记录以解决本地 IIS 上的问题。以下是我正在使用的代码。当我在 Visual Studio 上运行并记录到文件时它有效,但当我部署到 IIS 时无效。文件夹有足够的权限来创建文件,我也创建了文件夹和文件。我在这里错过了什么?

程序.cs

        var path = @"C:\workspace\Logs\Log-{Date}.txt";

        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Verbose()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
            .Enrich.FromLogContext()
            .WriteTo.Console(
                outputTemplate:
                "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}{NewLine}",
                theme: AnsiConsoleTheme.Literate)
            .WriteTo.File(path, fileSizeLimitBytes: 1_000_000,
                rollOnFileSizeLimit: true,
                shared: true,
                flushToDiskInterval: TimeSpan.FromSeconds(1))
            .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

启用 useSerialLog()

public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureServices(services => services.AddAutofac())
                .UseStartup<Startup>()
                .UseSerilog()
                .Build();
Run Code Online (Sandbox Code Playgroud)

ati*_*ker 12

Serilog 在本地完美运行。对于 IIS,日志文件夹需要 IIS 用户权限。

public Startup(IHostingEnvironment env)
        {
            Log.Logger = new LoggerConfiguration()
               .MinimumLevel
               .Information()
               .WriteTo.RollingFile(@"C:\inetpub\serilog\agilogoservicelogs\{Date}.txt", LogEventLevel.Information)
               .WriteTo.Seq("http://localhost:5341")
               .CreateLogger();

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

            Configuration = builder.Build();
        }
Run Code Online (Sandbox Code Playgroud)

更新您的控制器:

public class ValuesController : Controller
    {
        private readonly ILogger<ScrumUserController> _logger;

        public ValuesController(ILogger<ScrumUserController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<string> Get()
        {
            _logger.LogInformation("Agilibo Service start running");
            return new string[] { "Agilibo Core", "Service" };
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在授予已部署的 IIS 上的文件夹权限。

在此输入图像描述


men*_*xin 8

如果您使用.net core,因为默认应用程序池身份: ApplicationPoolIdentity没有写权限。

你应该:

将应用程序池用户更改为本地系统...

或者-

授予ApplicationPoolIdentity写入权限:

ApplicationPoolIdentity是一个虚拟名称,可以使用“IIS AppPool\DefaultAppPool”设置权限。

在此输入图像描述

你可以使用 cli 做同样的工作

ICACLS C:\sites\MyWebApp /grant "IIS AppPool\DefaultAppPool":F
Run Code Online (Sandbox Code Playgroud)

不要忘记重新启动 applicationpool 和 site

来自微软文档