【问题标题】:Enable file logging on IIS for serilog在 IIS 上为 serilog 启用文件日志记录
【发布时间】:2018-04-18 04:14:28
【问题描述】:

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

Program.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();

启用 useSerialLog()

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

【问题讨论】:

标签: iis .net-core serilog


【解决方案1】:

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();
        }

更新你的控制器:

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" };
        }
    }

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

【讨论】:

  • IIS_IUSRSDefaultAppPool 的权限设置为 完全控制,就像此处的 Serilog 讨论中所建议的那样 (github.com/serilog/serilog/issues/921 ) 也没有帮助我...有趣的事实:IIS STDOUT 日志记录表明 Serilog 日志记录在理论上可以工作...
  • 好吧,我的错误更愚蠢... 如果调试导致问题... :D
  • 您好,我正在尝试在已发布的应用程序目录中创建文件日志,但从未创建过该文件。当我在 Visual Studio 中启动应用程序时,一切正常,但是当我使用发布的应用程序时,该文件未在该文件夹中创建
  • @kintela 请为 IIS_IUSRS 添加文件夹权限,该文件将被写入其中。
【解决方案2】:

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

你应该:

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

或者-

授予ApplicationPoolIdentity写入权限:

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

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

ICACLS C:\sites\MyWebApp /grant "IIS AppPool\DefaultAppPool":F

不要忘记重新启动应用程序池和站点

来自Microsoft Docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多