我正在尝试动态记录多个IIS站点的站点名称,而不是单独为每个站点提供名称作为变量。我的NLog配置是集中的,这意味着每个站点都引用相同的NLog配置文件。另外,我无法对网站本身进行更改,我只能修改配置文件。
在处理WinForms应用程序时,我可以使用$ {processname}布局渲染器。但是,对于IIS站点,这将返回ISS应用程序池进程名称,如w3wp。但这不允许我区分多个IIS站点。
我当前的解决方案是检查进程名称是否为w3wp,然后使用$ {windows-identity}布局渲染器,因为当Identity设置为ApplicationPoolIdentity时,它将返回应用程序池的名称。但这并非总是可行/想要的。
我也一直在考虑使用$ {basedir},但我找不到删除任何不必要部分的方法,因为我只需要路径的最后一个文件夹。
有什么想法吗?
答案 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>