为什么 ${basedir} NLog 配置不起作用?

8

为什么我不能在生产服务器中使用${basedir} nlog.config?如果我使用fileName="${basedir}/logs/${shortdate}.log",nlog将不会记录消息信息,但是如果我更改为类似fileName="C:/logs/${shortdate}.log"的内容,则会记录消息信息。

我的nlog.config:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <targets>    
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="f" />
  </rules>
</nlog>

Controller:

public class HomeController : Controller
{
    private static Logger logger = LogManager.GetCurrentClassLogger();

    public ActionResult Index()
    {
        logger.Debug("Test NLog");
        return View();
    }
}

2
你的应用程序运行的账户(App Pool / Network Service / 自定义)是否有权限写入日志文件夹?日志文件夹是否已经存在?该账户是否有权限在 ${basedir} 中创建文件夹? - Brendan Green
@BrendanGreen 如何检查应用程序池/自定义帐户权限?如果我右键单击应用程序文件夹并单击安全选项卡,则仅显示网络服务帐户,其权限设置为只读。 - Willy
你是怎么运行这个应用程序的?是通过IIS或者IIS Express,还是其他方式?这都取决于你的开发环境,你需要提供更多的细节。 - Brendan Green
我使用Web Deploy Package发布了网站,然后从IIS 6 Manager中右键单击Default Web Site - Deploy - Import Application并浏览zip包。在我的生产环境中,我运行在Windows Server 2008和IE 9下。与我的问题一样,${basedir}在生产服务器上不起作用。 - Willy
1
我认为IIS6在NETWORK SERVICE账户下运行ASP.NET。在您的Windows Server 2008服务器上,您需要授予此帐户权限以写入/修改您的logs文件夹(我假设这是您的Web根目录的子文件夹)。如果您想让NLog自动创建logs文件夹,则需要将这些权限授予Web根目录。 - Brendan Green
@BrendanGreen 谢谢,现在它可以运行了,您可以将其添加为答案。 - Willy
1个回答

9

这个问题与文件权限有关。简单来说,运行Web应用程序的用户没有写入日志文件的权限。

根据.NET版本和IIS版本的不同,可能涉及多个用户。

对于IIS 6,我会说Web应用程序是以 NETWORK SERVICE 账户运行的。

因此,您需要授予该用户 写/修改 logs 文件夹的权限(我假设它是Web根目录的子文件夹)。如果您想让NLog自动创建logs文件夹,您需要将这些权限授予Web根目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接