ELK Docker版集成.net abp log4net使用

本文主要記錄使用ELK完成業務系統的日誌收集,主要使用log4net進行數據入職對接。
相關連接:
ELK docker img: https://hub.docker.com/r/sebp/elk
說明文檔: https://elk-docker.readthedocs.io/#usage

docker 版本安裝:docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it -d --restart=always --name elk sebp/elk

遇到報錯信息:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
修復方法:
永久解決:在/etc/sysctl.conf文件最後添加一行:vm.max_map_count=262144 重啓虛擬機
臨時解決:sysctl -w vm.max_map_count=262144

Kinaba的可視化端口爲:5601
在這裏插入圖片描述
項目中需要引入Log4net 與 log4stash兩個nuget包即可。
log4stash源碼與配置文檔可以參考地址:https://github.com/urielha/log4stash
在這裏插入圖片描述
log4net.config配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="ElasticSearchAppender" type="log4stash.ElasticSearchAppender, log4stash">
      <Server>localhost</Server>
      <Port>9200</Port>
      <IndexName>log_test_%{+yyyy-MM-dd-mm}</IndexName>
      <IndexType>LogEvent</IndexType>
      <Bulksize>2000</Bulksize>
      <BulkIdleTimeout>10000</BulkIdleTimeout>
      <IndexAsync>True</IndexAsync>
    </appender>
    <logger name="log">
      <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
      <level value="INFO" />
      <appender-ref ref="ElasticSearchAppender"/>
    </logger>
  </log4net>
</configuration>

下面爲本人ABP框架中的使用方式:
有三份配置文件,一份是之前的本地log配置文件,另外兩個是根據運行來產生配置文件
docker_log4net.config這個配置文件是用來替換真實ELK的動態變量值,我們會在代碼中替換這些值。這樣在docker部署完之後,只需要改動環境變量ELK的配置即可。log4net.config中就是被替換過值的文件內容。 log4Source.config這個文件是之前使用log4net寫入本地文件的配置。
用來替換動態變量的模板
ABP的框架中默認是使用log4net的,所以只需要引入log4stash即可。
在Startup.cs文件下,ConfigureServices方法下添加如下修改。
環境變量中添加elk服務器的配置數據
這段代碼實現邏輯:判斷使用配置elkServer環境變量,如果沒有就直接使用原始的方式,如果存在,就會讀取模板的數據,然後替換變量,寫入配置文件中。

 //替換環境變量值
            var isElkServer = !string.IsNullOrEmpty(_appConfiguration["ELKServer"]);
            if (isElkServer)
            {
                using var reader = new StreamReader("docker_log4net.config");
                var LogConfig = reader.ReadToEnd().Replace("@IndexName", "node_process_data_" + _hostingEnvironment.EnvironmentName).
                    Replace("@Server", _appConfiguration["ELKServer"].Split(":")[0]).
                    Replace("@Port", _appConfiguration["ELKServer"].Split(":")[1]);
                reader.Dispose();

                using var writer = new StreamWriter("log4net.config");
                writer.Write(LogConfig);
                writer.Flush();
            }
            var logConfig = isElkServer ? "log4net.config" : "log4Source.config";
            //Configure Abp and Dependency Injection
            return services.AddAbp<NodeProcessServiceWebModule>(options =>
            {
                options.IocManager.IocContainer.AddFacility<LoggingFacility>(
                    f => f.LogUsing(new Log4NetLoggerFactory(logConfig, reloadOnChange: true))
                 );
            });

這樣就可以輕鬆寫入elk的平臺中了。

添加自定義的屬性:

log4net.LogicalThreadContext.Properties["Camera_Code"] = folderName;
log4net.LogicalThreadContext.Properties["Object_Name"] = name;
_logger.Info(message);
log4net.LogicalThreadContext.Properties.Clear();

ELK根據日誌分析展示在Dashboard:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章