本文主要記錄使用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框架中的使用方式:
docker_log4net.config這個配置文件是用來替換真實ELK的動態變量值,我們會在代碼中替換這些值。這樣在docker部署完之後,只需要改動環境變量ELK的配置即可。log4net.config中就是被替換過值的文件內容。 log4Source.config這個文件是之前使用log4net寫入本地文件的配置。
ABP的框架中默認是使用log4net的,所以只需要引入log4stash即可。
在Startup.cs文件下,ConfigureServices方法下添加如下修改。
這段代碼實現邏輯:判斷使用配置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: