有没有办法约束log4n appender根据主机名记录消息?我想只在生产机器上启用logger并禁用日志记录和开发机器。
我知道有一种简单的方法可以使用属性记录主机名:%property {log4net:HostName},然后我可以通过此过滤已记录的消息,但我想使用smtp appender并通过电子邮件发送记录的消息想减少发送的电子邮件数量。
答案 0 :(得分: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
但我通常会为开发,测试和生产机器部署不同的配置文件
答案 1 :(得分:0)
我找到了使用自定义过滤器的解决方案:
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>