【问题标题】:Is there a log4net pattern for machineName [duplicate]machineName 是否有 log4net 模式 [重复]
【发布时间】:2010-11-03 16:34:52
【问题描述】:

我很难找到有关各种“盒内”模式的文档,例如

%logger  
%level  
%timestamp  

当然有the example page,但我不确定这是选项的完整列表。

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

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

【问题讨论】:

    标签: log4net pattern-layout


    【解决方案1】:
    %property{log4net:HostName}
    

    【讨论】:

      【解决方案2】:

      我刚刚偶然发现的是

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

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

      【讨论】:

      • ${...} 取决于环境变量。
      • 适用于我尝试过的所有 Windows 机器。很有帮助!
      • 我喜欢,如果不需要,为什么要依赖自定义类?
      • 你的回答启发了我得到这个对我有用的配置:
      【解决方案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/

      【讨论】:

        【解决方案4】:

        查看PatternString API,看起来您需要在模式中使用 %property。还可以看看this article,您可能需要在应用程序启动时将机器名称注入到全局上下文中。

        【讨论】:

        • @AgileJon -- 那篇文章正是我想要的!谢谢!!!
        【解决方案5】:

        使用这个关于添加 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>
        

        希望这会有所帮助。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2011-11-09
            • 2019-09-14
            • 1970-01-01
            • 2018-02-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-25
            • 1970-01-01
            相关资源
            最近更新 更多