10

我很难找到关于各种“盒子里”模式的文档,比如

%logger  
%level  
%timestamp  

当然有示例页面,但我不确定这是选项的完整列表。

我也知道可以将应用程序中的 MDC 参数传递给记录器,但这涉及代码更改,这与配置更改不同。

有没有%machineName选择,或者machineIP选择?问题是我们将网络场中的所有服务器都记录到同一个数据库日志中,我们现在认为来自一台机器的消息数量不成比例。

4

6 回答 6

13
%property{log4net:HostName}
于 2009-06-17T14:41:40.343 回答
12

我刚刚偶然发现的是

<layout type="log4net.Layout.PatternLayout" value="${COMPUTERNAME}"/>

这似乎奏效了——想知道这与建议的其他选项之间有什么区别。喜欢%property{log4net:HostName}

于 2009-06-17T14:56:35.100 回答
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/

于 2011-12-08T16:14:38.730 回答
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>

希望这可以帮助。

于 2012-02-24T00:36:51.133 回答
2

查看PatternString API,看起来你需要在你的模式中使用 %property 。也看看这篇文章,你可能需要在应用程序启动时将机器名注入到全局上下文中。

于 2009-06-17T14:31:38.350 回答
0

有趣的是,我认为这是“紧凑参数语法”在这里查看最后一节http://logging.apache.org/log4net/release/manual/configuration.html

于 2009-08-10T04:45:13.680 回答