【问题标题】:log4n logging constraint by host name按主机名的 log4n 日志记录约束
【发布时间】:2012-08-19 18:03:53
【问题描述】:

有没有办法限制 log4n appender 根据主机名记录消息?我只想在生产机器上启用记录器并禁用记录 n 开发机器。

我知道有一种简单的方法可以使用属性记录主机名:%property{log4net:HostName},然后我可以通过此过滤记录的消息,但我想使用 smtp appender 并通过电子邮件发送记录的消息想减少发送电子邮件的数量。

【问题讨论】:

  • 一种标准的方法是提高日志记录级别,例如在 appenders 声明中warning。通常你只想记录(严重的)问题,而不是所有的调试、信息消息。
  • 在开发过程中出现一些错误是正常的,因为开发人员通常不会加载所有子项目,但在生产中这种情况表明存在严重错误。所以这种方法行不通。

标签: c# log4net


【解决方案1】:

另一种解决方案,使用标准过滤器

<filter type="log4net.Filter.PropertyFilter">
  <Key value="log4net:HostName" />
  <StringToMatch value="hostToInclude1" />
  <AcceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.PropertyFilter">
  <Key value="log4net:HostName" />
  <StringToMatch value="hostToInclude2" />
  <AcceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />

或排除过滤器,如答案https://stackoverflow.com/a/755356

但我通常为开发、测试和生产机器部署不同的配置文件

【讨论】:

    【解决方案2】:

    我找到了使用自定义过滤器的解决方案:

    public class HostFilter : FilterSkeleton
    {
        public string AllowedHostsNames { get; set; }
        private IList<string> HostNamesList
        {
            get
            {
                if (string.IsNullOrEmpty(AllowedHostsNames))
                    return new List<string>();
    
                return AllowedHostsNames
                    .Split(',')
                    .Select(n => n.ToUpper().Trim())
                    .ToList();
            }
        }
    
        public override FilterDecision Decide(LoggingEvent loggingEvent)
        {
            var names = HostNamesList;
            if (names.Contains(Environment.MachineName))
                return FilterDecision.Accept;
    
            return FilterDecision.Deny;
        }
    }
    
    
    <appender name="SomeAppender" type="log4net.Appender.SmtpAppender">
      <to value="" />
      <from value="" />
      <subject value="" />
      <smtpHost value="" />
      <authentication value="Basic" />
      <port value="25" />
      <username value="" />
      <password value="" />
      <bufferSize value="10" />
      <lossy value="false" />
      <layout type="log4net.Layout.PatternLayout">
         <conversionPattern value="%newline%date [%thread] %-5level %logger - %message%newline%newline%newline" />
      </layout>
      <filter type="Logging.HostFilter, AssemblyName">
        <allowedHostsNames value="host1, host2, host3" />
      </filter>
    </appender>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2013-12-11
      • 2022-01-15
      • 2012-09-26
      • 1970-01-01
      相关资源
      最近更新 更多