2017-04-17 63 views
1

我假設這是一個很常見的問題,我們如何輕鬆地將Server信息添加到EventFlow事件?EventFlow - 創建自定義過濾器以附加源服務器信息

我的場景是我正在部署一個應用程序,該應用程序將具有自己的環境特定的EventFlowConfig.json,但服務器場中的每個服務器都將獲得相同的json文件。那麼......我如何知道服務器場中的哪臺服務器將事件發送給ElasticSearch?

一個選擇是使用.net獲取服務器名稱並將其作爲列發送,這需要我將服務器名稱添加到每個事件中。這似乎有點過分,但它會完成這項工作。我希望除了必須將其編碼成事件之外,還有一種更簡單的方法。

感謝您的時間, 格雷格

編輯4 - 卡羅爾得到了很大的幫助我得到這個工作,例如建立和運行,謝謝!KAROL嘗試添加創建自定義過濾器作爲擴展:

  1. 我們需要創建一個新的類自定義過濾器工廠
  2. 然後,我們需要創建一個第二個新的類,並把它落實的IFilter接口。爲了從工廠傳遞健康監視器,我們使用了一個構造函數。
  3. 使用評估功能爲我們的區域添加
  4. 然後參考定製過濾器在我們EventFlowConfig.json的擴展區域中的數據(eventData.AddPayloadProperty)。
    a。該類別是過濾器工廠

    b。該類型是你班級的名字。

    c。例如(假設您將過濾器工廠命名爲「MyCustomFilterFactory」):「My.Application.Logging.MyCustomFilterFactory,My.Application.Assembly.WhereCustomFilterAndItsFactoreLive」

  5. 添加一個引用到Microsoft.Extensions.Configuration所在的C#代碼的生活。

  6. 然後,你可以參考你的自定義過濾器你需要的地方,在這裏我們使用的是全局過濾

工作例如:

class CustomGlobalFilter : IFilter 
{ 
    private IHealthReporter HealthReporter; 
    private string MachineName; 
    public CustomGlobalFilter(string ServerName, IHealthReporter HealthReporter) 
    { 
     MachineName = ServerName; 
     this.HealthReporter = HealthReporter;    
    } 
FilterResult IFilter.Evaluate(EventData eventData) 
    {    
     eventData.AddPayloadProperty("ServerName", MachineName, HealthReporter, "CustomGlobalFilter"); 
     return FilterResult.KeepEvent; 
    } 
} 

class CustomGlobalFilterFactory : IPipelineItemFactory<CustomGlobalFilter> 
{ 
    public CustomGlobalFilter CreateItem(IConfiguration configuration, IHealthReporter healthReporter) 
    {    
     CustomGlobalFilter GlobalFilter = new CustomGlobalFilter(System.Environment.MachineName, healthReporter);    
     return GlobalFilter; 
    } 
} 

然後在EventFlow配置:

"filters": [ 
{ 
    "type": "drop", 
    "include": "Level == Verbose" 
}, 
{ 
    "type": "CustomGlobalFilter" 
} 
], 
... 
"extensions": [ 
{ 
    "category": "filterFactory", 
    "type": "CustomGlobalFilter", 
    "qualifiedTypeName": "My.Company.Presentation.App.CustomGlobalFilter, My.Company.Presentation.App" 
} 

感謝, 格雷格

+0

只是一個註釋,你的EventFlow配置工作示例顯示不正確的QualifiedTypeName。它應該是: 「qualifiedTypeName」:「My.Company.Presentation.App.CustomGlobalFilter ** Factory **,My.Company.Presentation.App」 – James

回答

2

這並不是說被內置到今天EventFlow的東西,但至少有兩個選項:

  1. Use EventFlow extensibility添加一個自定義過濾器,將這些屬性添加到它「看到」的每個事件。
  2. 在許多日誌記錄庫中,有一個「初始化程序」或「豐富」的概念,可用於自動添加上下文屬性。例如in Serilog(它本身是由EventFlow支持的)