我正在寻找一种在ASP.NET中使用log4net启用IP日志记录的方法.我找到了一个解决方案但它适用于应用程序级别.有关如何在会话级别记录IP的任何建议/做法?
谢谢
我们正在使用ASP.NET MVC3应用程序中的Log4Net,一切正常但我们希望在日志文件中看到当前用户名而不是应用程序池的标识,这是我们使用的appender配置:
<log4net>
<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
<threshold value="ALL" />
<immediateFlush>true</immediateFlush>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<encoding value="utf-8" />
<file value="C:\Logs\MyLogs.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maxSizeRollBackups value="30" />
<maximumFileSize value="25MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%property{log4net:HostName}] - %username%newline%utcdate - %-5level - %message%newline" />
</layout>
</appender>
<root>
<priority value="ALL" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
Run Code Online (Sandbox Code Playgroud)
所以看起来像属性:%username正在检索以下值:
WindowsIdentity.GetCurrent().Name
Run Code Online (Sandbox Code Playgroud)
而不是我们需要的: HttpContext.Current.User
如何在web.config中轻松解决这个问题,而无需创建自定义属性或其他log4net派生类?如果可能的话,如果自定义属性是我们可以忍受的唯一方式,我猜:)谢谢!
log4net没有正确PatternString替换我的登录名.我想要我的日志
日志\ YYYYMMDD\MSMQcore_ [用户名]的.log
当我使用该%username属性时,我在路径中获取域,这会在其中添加另一个文件夹间接.我只想要用户名.
日志\ YYYYMMDD\MSMQcore_ [域]\[用户名]的.log
任何人都有一个在appender的文件名中插入"用户名"的例子?我尝试了很多东西,我还在摸不着头脑.
<appender name="core_Appender" type="log4net.Appender.RollingFileAppender" >
<!-- <file type="log4net.Util.PatternString" value="Logs/%date{yyyyMMdd}/MSMQcore_%identity.log" /> -->
<!-- <file type="log4net.Util.PatternString" value="Logs/%date{yyyyMMdd}/MSMQcore_%property{user}.log" /> -->
<file type="log4net.Util.PatternString" value="Logs/%date{yyyyMMdd}/MSMQcore_%username.log" />
</appender>
Run Code Online (Sandbox Code Playgroud) 是否可以创建一个允许配置"索引"值的log4net自定义PatternLayoutConverter?我知道"属性"转换字符串,它允许您编写如下代码:
ThreadContext.Properties["ID"] = yourID;
Run Code Online (Sandbox Code Playgroud)
并指定如下:
%property{ID}
Run Code Online (Sandbox Code Playgroud)
该值应包含在输出中.
如果我想记录的值在其他"字典"中怎么办?我想我可以编写一些逻辑来将这些值从字典复制到log4net上下文之一,然后只使用内置的%property令牌.如果我希望log4net根据配置文件中指定的索引值直接从我自己的"字典"中记录值,该怎么办?
我可以编写自己的PatternLayoutConverter,允许我配置如下内容:
%myproperty{ID}
Run Code Online (Sandbox Code Playgroud)
然后从我自己的"字典"中提取相应的"ID"值?
对于任何有兴趣的人来说,用NLog做同样的事情很容易:
[LayoutRenderer("MyGDC")]
class GdcLayoutRenderer : LayoutRenderer
{
[RequiredParameter]
[DefaultParameter]
public string Item { get; set; }
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
string msg = GDC.Get(this.Item);
builder.Append(msg);
}
protected override int GetEstimatedBufferSize(LogEventInfo logEvent)
{
return 10;
}
}
Run Code Online (Sandbox Code Playgroud)
并配置如下:
告诉NLog任何带扩展名的程序集:
<extensions>
<add assembly="NLog.Extensions"/>
</extensions>
Run Code Online (Sandbox Code Playgroud)
在布局中使用"indexed"属性:
<layout="${longdate} | ${MyGDC:item=name} | ${message}"/>
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我实际上使用NLog的GDC对象作为我的"字典",但我演示了如何编写自己的"可索引"LayoutRenderer(或多或少等同于log4net的PatternLayoutConverter)来访问由值中的值索引的值.配置文件.
[编辑]我得到了我想要的答案.我在这里包含了我的示例PatternLayoutRenderer的代码.在我的测试中,我在我的主窗体类中有一个静态字典,我可以存储"应用程序设置".我创建了一个PatternLayoutConverter,可以接受一个键作为参数,以便转换器可以在字典中查找正确的值.我可能能够使用log4net(或NLog)上下文对象实现相同的功能,但在我们的应用程序中,我们可能会有一些应用程序将用于其他目的的设置或会话信息,我们希望能够将其添加到记录输出.由于它已经在查找结构中,因此能够直接引用数据而不必将其显式复制到log4net(或NLog上下文)会很好.
无论如何,这是代码:
namespace Log4NetTest
{
class KeyLookupPatternConverter : PatternLayoutConverter
{
protected override void Convert(System.IO.TextWriter …Run Code Online (Sandbox Code Playgroud) 我开发了一个asp.net网站,我使用log4net以格式记录错误信息:
"%-5p %d - %m%n"
Run Code Online (Sandbox Code Playgroud)
它按当前机器的日期时间记录日期时间.例如:
FATAL 2011-04-10 01:08:11,759 - message
Run Code Online (Sandbox Code Playgroud)
但是我想将datetime转换为另一个区域或者用它来增加额外的时间.例如,我想在上一个示例中添加3个小时,并希望输出为:
FATAL 2011-04-10 **04**:08:11,759 - message
Run Code Online (Sandbox Code Playgroud)
有关如何实现这一点的任何想法?