C# 按主机名列出的log4n日志约束

C# 按主机名列出的log4n日志约束,c#,log4net,C#,Log4net,有没有办法约束log4n appender根据主机名记录消息?我只想在生产机器上启用logger,而在开发机器上禁用logging 我知道有一种简单的方法可以使用属性来记录主机名:%property{log4net:HostName},然后我可以通过该方法过滤记录的邮件,但是我想使用smtp appender并通过电子邮件发送记录的邮件,我想减少发送的电子邮件数量 我找到了使用自定义筛选器的解决方案: public class HostFilter : FilterSkeleton {

有没有办法约束log4n appender根据主机名记录消息?我只想在生产机器上启用logger,而在开发机器上禁用logging


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

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

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>
公共类主机筛选器:Filterskleton
{
公共字符串允许主机名{get;set;}
私有IList主机名称列表
{
得到
{
if(string.IsNullOrEmpty(AllowedHostsNames))
返回新列表();
允许返回主机snames
.Split(“,”)
.Select(n=>n.ToUpper().Trim())
.ToList();
}
}
公共覆盖筛选器决策决定(LoggingEvent LoggingEvent)
{
var name=主机名称列表;
if(names.Contains(Environment.MachineName))
返回筛选决定。接受;
返回FilterDecision.Deny;
}
}

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

<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" />


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

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