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

时间:2018-04-18 04:14:29

标签: iis .net-core serilog

我想在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();

2 个答案:

答案 0 :(得分:3)

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上的文件夹权限。

enter image description here

答案 1 :(得分:0)

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

您应该:

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

或-

授予 ApplicationPoolIdentity 写入权限:

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

enter image description here

您可以使用cli进行相同的工作

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

别忘了重新启动应用程序池和站点

来自Microsoft Docs