如何在NLog中获取IIS站点名称

时间:2014-10-01 07:47:12

标签: asp.net iis iis-7.5 nlog

我正在尝试动态记录多个IIS站点的站点名称,而不是单独为每个站点提供名称作为变量。我的NLog配置是集中的,这意味着每个站点都引用相同的NLog配置文件。另外,我无法对网站本身进行更改,我只能修改配置文件。

在处理WinForms应用程序时,我可以使用$ {processname}布局渲染器。但是,对于IIS站点,这将返回ISS应用程序池进程名称,如w3wp。但这不允许我区分多个IIS站点。

我当前的解决方案是检查进程名称是否为w3wp,然后使用$ {windows-identity}布局渲染器,因为当Identity设置为ApplicationPoolIdentity时,它将返回应用程序池的名称。但这并非总是可行/想要的。

我也一直在考虑使用$ {basedir},但我找不到删除任何不必要部分的方法,因为我只需要路径的最后一个文件夹。

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

我不知道是否有内置功能来了解这类信息,但您可以创建自己的LayoutRenderer,创建它的代码如下:

namespace NLog.Extensions.LayoutRenderers
{
    using System.Text;
    using NLog.LayoutRenderers;

    [LayoutRenderer("IISSiteName")]
    public class IISSiteName : LayoutRenderer
    {
        protected override void Append(StringBuilder builder, LogEventInfo logEvent)
        {
            if (System.Web.Hosting.HostingEnvironment.ApplicationHost != null)
                builder.Append(System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName());
        }
    }
}

您必须编译此代码并使用NLog.config文件中的标记添加DLL,如下所示

<?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" autoReload="true" >

  <extensions>
    <add assemblyFile="c:\\your-path-to-dll" />
  </extensions>

  <targets>
    <target xsi:type="File" name="file" fileName="${basedir}\file.txt" layout="${date} ${level} ${IISSiteName} "/>
  </targets>

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

</nlog>

如果将已编译的DLL添加为项目的引用,则必须更改assembly的assemblyPath并将其添加为Namespace.Class格式。

我在我的电脑上工作,所以它应该正常工作。如果没有,请告诉我。

问候

答案 1 :(得分:2)

在您的NLog.config文件中,添加如下内容:

<parameter name="@WebsiteName" layout="${gdc:WebsiteName}"/> <!-- custom field! -->

然后,当您初始化记录器时,请执行以下操作:

var logger = LogManager.GetCurrentClassLogger();
GlobalDiagnosticsContext.Set("WebsiteName",System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName());

希望这有帮助!

编辑:我现在意识到您无法更新实际的网络来源。抱歉。这会更好(你必须将NLog.Exended.dll和扩展节点添加到配置文件):

<parameter name="@WebsiteName" layout="${aspnet-request:serverVariable=SERVER_NAME}"/> <!-- IIS Server Variable -->

可能是HTTP_HOST或SERVER_NAME。我总是让那些人改变。

您必须在NLog.config文件中添加Extensions节点,以及NLog.Extended.dll:

<extensions><add assembly="NLog.Extended" assemblyFile="NLog.Extended.dll"/></extensions>

答案 2 :(得分:2)

现在有一个NLog.Web package有一个布局渲染器${iis-site-name},它应该完全符合您的需要。

答案 3 :(得分:0)

也许我还没有理解你的限制,但有什么阻止你使用asp net应用程序布局渲染器:

https://github.com/NLog/NLog/wiki/AspNetApplication-layout-renderer

${aspnet-application:variable=String}

...

答案 4 :(得分:0)

像下面的nlog.config可以用于我的dotnet核心项目。只需将fileName设置为fileName="C:\[yourPath]\Log\${iis-site-name}${date:format=yyyyMMdd}.txt"

<?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"
    autoReload="true"
    internalLogLevel="info"
    internalLogFile="c:\temp\internal-nlog.txt">

    <!-- the targets to write to -->
    <targets>
        <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
        <target xsi:type="File" name="ownFile-web" fileName="C:\inetpub\archive\Log\${iis-site-name}${date:format=yyyyMMdd}.txt"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
    </targets>

    <!-- rules to map from logger name to target -->
    <rules>
        <!--All logs, including from Microsoft-->
        <!--<logger name="*" minlevel="Debug" writeTo="allfile" />-->

        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxLevel="Info" final="true" />
        <!-- BlackHole without writeTo -->
        <logger name="*" minlevel="Debug" writeTo="ownFile-web" />
    </rules>
</nlog>