Log4Net 和 ElasticSearch - 多索引

Log4Net and ElasticSearch - Multiple Indexes

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

<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 的属性,反之亦然。相反,我希望有两个不同且独立的日志索引,每个索引具有不同的属性。

您似乎是直接从您的应用程序登录 Elasticsearch 到单个索引 logclient

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

您可能还想考虑更改 type 而不是索引。

您也可以考虑使用 Logstash。虽然这是您要负责的另一项服务,但它可以为 table 带来很多好处,例如将日志路由到索引和类型或将 ip 路由到 geo_hash 转换。

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

我想我已经找到了解决办法。 在 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>

然后我为每个索引创建了两个不同的 classes,然后我将这个 class 传递到我的日志中:

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);