2016-01-22 158 views
0

我正在使用log4net和ElasticsearchAppender。 现在我想添加另一个ElasticSearch appender,但有另一个索引。 我现在所做的是:Log4Net和ElasticSearch - 多个索引

<appender name="ElasticSearchAppender" type="log4net.ElasticSearch.ElasticSearchAppender, log4net.ElasticSearch"> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
    <param name="ConversionPattern" value="%date - %level - %message %property{label} %property{mstimeload} %property{applicationid} %property{page} 
      %property{ipclient} %property{browser} %property{browsersignature} %property{appversion} %property{sessionuniquecodetag} %property{globalcountertailsloaded} 
      %property{ipserveraddress}" /> 
    </layout> 
    <connectionString value="Server=myip;Index=log;Port=9200;rolling=true"/> 
    <lossy value="true" /> 
    <bufferSize value="100" /> 
    <evaluator type="log4net.Core.LevelEvaluator"> 
    <threshold value="INFO"/> 
    </evaluator> 
</appender> 
<appender name="ElasticSearchAppenderClient" type="log4net.ElasticSearch.ElasticSearchAppender, log4net.ElasticSearch"> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
    <param name="ConversionPattern" value="%date - %level - %message %property{label} %property{applicationid} %property{ipclient} %property{browser} %property{browserversione} %property{browsersignature}"/> 
    </layout> 
    <connectionString value="Server=myip;Index=logclient;Port=9200;rolling=true"/> 
    <lossy value="true" /> 
    <bufferSize value="100" /> 
    <evaluator type="log4net.Core.LevelEvaluator"> 
    <threshold value="INFO"/> 
    </evaluator> 
</appender> 

然后在服务器端我有

private static readonly log4net.ILog log = log4net.LogManager.GetLogger("ElasticSearchAppender"); 
private static readonly log4net.ILog logclient = log4net.LogManager.GetLogger("ElasticSearchAppenderClient"); 

问题是,当我添加的属性的值。因为我做的是例如:

log4net.ThreadContext.Properties["label"] = label; 
log4net.ThreadContext.Properties["ipclient"] = ipclient; 
log4net.ThreadContext.Properties["applicationid"] = applicationid; 
log4net.ThreadContext.Properties["page"] = page; 
... 
log.Info(ex); 

的第一个日志和

log4net.ThreadContext.Properties["label"] = label; 
log4net.ThreadContext.Properties["browser"] = browser; 
log4net.ThreadContext.Properties["browserversion"] = browserversion; 
... 
logclient.Info(""); 

但随后的日志索引logclient在我找到指数log,反之亦然的性能。相反,我希望为每个索引拥有两个不同的独立日志索引,并使用不同的属性。

回答

0

我想我找到了解决方案。 在web.config我做这样的:

<log4net> 
<appender name="ElasticSearchAppender" type="log4net.ElasticSearch.ElasticSearchAppender, log4net.ElasticSearch"> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" value="%date %level %c{1} %c{2}" /> 
    </layout> 
    <connectionString value="Server=localhost;Index=log;Port=9200;rolling=true"/> 
    <lossy value="false" /> 
    <evaluator type="log4net.Core.LevelEvaluator"> 
      <threshold value="ALL" /> 
    </evaluator> 
    <bufferSize value="100" /> 
</appender> 
<appender name="ElasticSearchAppenderClient" type="log4net.ElasticSearch.ElasticSearchAppender, log4net.ElasticSearch"> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" value="%date %level %c{1} %c{3}" /> 
    </layout> 
    <connectionString value="Server=localhost;Index=logclient;Port=9200;rolling=true"/> 
    <lossy value="false" /> 
    <evaluator type="log4net.Core.LevelEvaluator"> 
      <threshold value="ALL" /> 
    </evaluator> 
    <bufferSize value="100" /> 
</appender> 
<root> 
    <level value="ALL"/> 
    <appender-ref ref="ElasticSearchAppender" /> 
</root> 
<logger name="ElasticSearchAppenderClient" additivity="False"> <!-- additivity="False" VERY IMPORTANT!! --> 
    <level value="ALL" /> 
    <appender-ref ref="ElasticSearchAppenderClient" /> 
</logger> 
</log4net> 

然后,我创建了两个不同的类别为每个索引,然后我通过这个类来我的日志:

private static readonly ILog _log = LogManager.GetLogger("ElasticSearchAppender"); 
private static readonly ILog _logclient = LogManager.GetLogger("ElasticSearchAppenderClient"); 

Log thislog = new Log(); 
thislog.label = "log"; 
thislog.mstime = 1; 
_log.Error(thislog); 

LogClient thislogc = new LogClient(); 
thislogc.label = "logclient"; 
thislogc.browser = 2; 
_logclient.Error(thislogc); 
1

它看起来像你直接从你的应用程序到Elasticsearch登录到一个索引logclient

您可以创建两个具有单独索引的命名记录器,并在整个代码中适当地使用记录器。

您可能还想考虑更改type而不是索引。您也可以考虑使用Logstash。虽然它是您负责的另一项服务,但它可能会带来很多问题,例如将日志路由到索引和类型,或者将IP转换为geo_hash。

最后,我在一年前从Log4net切换到Logary,以改善与Logstash/Elasticsearch的集成并且非常满意。