我很难找到关于各种'盒子'模式的文档,比如
%logger
%level
%timestamp
当然有the example page但我不确定这是完整的选项列表。
我也知道MDC参数可以从应用程序输出到记录器,但这涉及代码更改,这是一个与配置更改不同的野兽。
是否有%machineName
选项或machineIP
选项?问题是我们将Web场中的所有服务器都登录到同一个数据库日志中,我们现在认为来自一台计算机的消息数量不成比例。
答案 0 :(得分:12)
%property{log4net:HostName}
答案 1 :(得分:11)
我偶然发现的是
<layout type="log4net.Layout.PatternLayout" value="${COMPUTERNAME}"/>
这似乎正在起作用 - 想知道这和其他选项之间的区别是什么。比如%property{log4net:HostName}
答案 2 :(得分:3)
创建一个获取计算机名称的类:
using System;
using System.IO;
using log4net.Layout.Pattern;
namespace YourNameSpace.Converters
{
public class MachinePatternConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
writer.Write(Environment.MachineName);
}
}
}
然后设置你的log4net配置:
<layout type="log4net.Layout.PatternLayout">
<converter>
<name value="machine" />
<type value="YourNameSpace.MachinePatternConverter" />
</converter>
<conversionPattern value="%date [%thread] %level %logger %machine" />
</layout>
我喜欢这种方法,因为它可以重复使用,我可以管理我想要的信息。例如,如果要记录IP地址,只需执行相同操作并创建转换器,如下所示:
public class IPPatternConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
if (HttpContext.Current == null)
return;
writer.Write(HttpContext.Current.Request.UserHostAddress);
}
}
有关链接的更多信息:http://devstuffs.wordpress.com/2012/01/12/creating-your-own-pattern-layout-converter-for-log4net/
答案 3 :(得分:2)
查看PatternString API,看起来您需要在模式中使用%属性。另请查看this article,您可能需要在应用程序启动时将机器名称注入全局上下文。
答案 4 :(得分:2)
使用这个关于添加GlobalContext属性的答案https://stackoverflow.com/a/2096452/1224858,我能够让它工作。
我在我的类文件中添加了以下代码:
log4net.GlobalContext.Properties["hostname"] = Environment.MachineName;
然后在配置文件中我可以引用主机名,它将出现
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{hostname}] - %message%newline" />
</layout>
希望这有帮助。
答案 5 :(得分:0)
有趣的是,我认为这是“紧凑参数语法”,请查看此处的最后一节http://logging.apache.org/log4net/release/manual/configuration.html