මිතුරන් හුවමාරු කර ගන්නා ආකාරය සහ ELK (ආරම්භය) පිළිබඳ මගේ කතාව මම දිගටම කරගෙන යන්නෙමි
ELK තොගයේ ලොග්ස්ටෑෂ් ලොග් බුද්ධිමත්ව සැකසීමට සහ ලේඛන ආකාරයෙන් ඉලාස්ටික් තුළ ස්ථානගත කිරීම සඳහා සූදානම් කිරීමට භාවිතා කරයි, එහි පදනම මත කිබානා හි විවිධ දෘශ්යකරණයන් තැනීමට පහසුය.
ස්ථාපනය
අදියර දෙකකින් සමන්විත වේ:
- OpenJDK පැකේජය ස්ථාපනය කිරීම සහ වින්යාස කිරීම.
- Logstash පැකේජය ස්ථාපනය කිරීම සහ වින්යාස කිරීම.
OpenJDK පැකේජය ස්ථාපනය කිරීම සහ වින්යාස කිරීම
OpenJDK පැකේජය බාගත කර විශේෂිත නාමාවලියකට ඉවත් කළ යුතුය. එවිට මෙම ඩිරෙක්ටරියට යන මාර්ගය Windows මෙහෙයුම් පද්ධතියේ $env:Path සහ $env:JAVA_HOME විචල්යයන් තුලට ඇතුලත් කල යුතුය.
අපි ජාවා අනුවාදය පරීක්ෂා කරමු:
PS C:> java -version
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)
Logstash පැකේජය ස්ථාපනය කිරීම සහ වින්යාස කිරීම
Logstash බෙදාහැරීම සමඟ සංරක්ෂිත ගොනුව බාගන්න C:Program Files
එය වටින්නේ නැත, ලොග්ස්ටාෂ් සාමාන්යයෙන් ආරම්භ කිරීම ප්රතික්ෂේප කරනු ඇත. එවිට ඔබ ගොනුවට ඇතුල් විය යුතුය jvm.options
ජාවා ක්රියාවලිය සඳහා RAM වෙන් කිරීමේ වගකීම නිවැරදි කරයි. සේවාදායකයේ RAM වලින් අඩක් සඳහන් කිරීමට මම නිර්දේශ කරමි. එහි 16 GB RAM ප්රමාණයක් තිබේ නම්, පෙරනිමි යතුරු වනුයේ:
-Xms1g
-Xmx1g
සමඟ ප්රතිස්ථාපනය කළ යුතුය:
-Xms8g
-Xmx8g
ඊට අමතරව, රේඛාව ගැන අදහස් දැක්වීම සුදුසුය -XX:+UseConcMarkSweepGC
. මේ ගැන වැඩි විස්තර
input {
stdin{}
}
filter {
}
output {
stdout {
codec => "rubydebug"
}
}
මෙම වින්යාසය සමඟ, Logstash කොන්සෝලයෙන් දත්ත කියවයි, හිස් පෙරහනක් හරහා ගොස් එය නැවත කොන්සෝලය වෙත ප්රතිදානය කරයි. මෙම වින්යාසය භාවිතා කිරීමෙන් Logstash හි ක්රියාකාරීත්වය පරීක්ෂා කරනු ඇත. මෙය සිදු කිරීම සඳහා, අපි එය අන්තර් ක්රියාකාරී ආකාරයෙන් ධාවනය කරමු:
PS C:...bin> .logstash.bat -f .logstash.conf
...
[2019-12-19T11:15:27,769][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2019-12-19T11:15:27,847][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2019-12-19T11:15:28,113][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
Logstash වරාය 9600 මත සාර්ථකව දියත් කරන ලදී.
අවසාන ස්ථාපන පියවර: Windows සේවාවක් ලෙස Logstash දියත් කරන්න. උදාහරණයක් ලෙස, පැකේජය භාවිතයෙන් මෙය කළ හැකිය
PS C:...bin> .nssm.exe install logstash
Service "logstash" installed successfully!
වැරදි ඉවසීම
මූලාශ්ර සේවාදායකයෙන් මාරු කිරීමේදී ලඝු-සටහන් වල ආරක්ෂාව ස්ථිර පෝලිම් යාන්ත්රණය මගින් සහතික කෙරේ.
එය ක්රියාත්මක වන්නේ කෙසේද?
ලොග් සැකසීමේදී පෝලිම්වල පිරිසැලසුම: ආදානය → පෝලිම → පෙරහන + ප්රතිදානය.
ආදාන ප්ලගිනය ලොග් මූලාශ්රයකින් දත්ත ලබා ගනී, එය පෝලිමකට ලියයි, සහ දත්ත මූලාශ්රය වෙත ලැබී ඇති බවට තහවුරු කිරීමක් යවයි.
පෝලිමේ පණිවිඩ Logstash මගින් සකසනු ලැබේ, පෙරහන සහ ප්රතිදාන ප්ලගිනය හරහා ගමන් කරයි. ලොගය යවා ඇති බවට ප්රතිදානයෙන් තහවුරු කිරීමක් ලැබෙන විට, Logstash විසින් සැකසූ ලොගය පෝලිමෙන් ඉවත් කරයි. Logstash නැවැත්වූයේ නම්, තහවුරු කිරීමක් නොලැබුණු සියලුම සකස් නොකළ පණිවිඩ සහ පණිවිඩ පෝලිමේ පවතින අතර, Logstash එය ආරම්භ වන විට ඒවා දිගටම සකසනු ඇත.
ගැලපුම්
ගොනුවේ යතුරු මගින් සකස් කළ හැක C:Logstashconfiglogstash.yml:
queue.type
: (හැකි අගයන් -persisted
иmemory (default))
.path.queue
: (පෙරනිමියෙන් C:Logstashqueue හි ගබඩා කර ඇති පෝලිම් ගොනු සහිත ෆෝල්ඩරය වෙත යන මාර්ගය).queue.page_capacity
: (උපරිම පෝලිම් පිටු ප්රමාණය, පෙරනිමි අගය 64mb වේ).queue.drain
: (සත්ය/අසත්යය - Logstash වසා දැමීමට පෙර පෝලිම් සැකසීම නැවැත්වීම සක්රීය කරයි/අබල කරයි. මම එය සක්රීය කිරීම නිර්දේශ නොකරමි, මන්ද මෙය සේවාදායකය වසා දැමීමේ වේගයට සෘජුවම බලපානු ඇත).queue.max_events
: (පෝලිමේ ඇති උපරිම සිදුවීම් ගණන, පෙරනිමිය 0 (අසීමිත)).queue.max_bytes
: (උපරිම පෝලිම් ප්රමාණය බයිට් වලින්, පෙරනිමිය - 1024mb (1gb)).
වින්යාස කර ඇත්නම් queue.max_events
и queue.max_bytes
, පසුව මෙම ඕනෑම සිටුවමක අගය ළඟා වූ විට පණිවිඩ පෝලිමට පිළිගැනීම නතර වේ. ස්ථීර පෝලිම් ගැන තව දැනගන්න
පෝලිම සැකසීම සඳහා වගකිව යුතු logstash.yml කොටසෙහි උදාහරණයක්:
queue.type: persisted
queue.max_bytes: 10gb
ගැලපුම්
Logstash වින්යාසය සාමාන්යයෙන් කොටස් තුනකින් සමන්විත වන අතර, ලැබෙන ලඝු-සටහන් සැකසීමේ විවිධ අවධීන් සඳහා වගකිව යුතු ය: ලැබීම (ආදාන කොටස), විග්රහ කිරීම (පෙරහන කොටස) සහ ඉලාස්ටික් වෙත යැවීම (ප්රතිදාන කොටස). පහත අපි ඒ එක් එක් දෙස සමීපව බලමු.
ආදාන
ගොනු බීට් නියෝජිතයන්ගෙන් අමු ලඝු-සටහන් සහිත එන ප්රවාහය අපට ලැබේ. ආදාන කොටසේ අපි දක්වන්නේ මෙම ප්ලගිනයයි:
input {
beats {
port => 5044
}
}
මෙම වින්යාසයෙන් පසුව, ලොග්ස්ටාෂ් 5044 වරායට සවන් දීමට පටන් ගන්නා අතර, ලොග් ලබා ගන්නා විට, පෙරහන් කොටසේ සැකසුම් අනුව ඒවා සකසයි. අවශ්ය නම්, ඔබට SSL හි filebit වෙතින් ලඝු-සටහන් ලබා ගැනීම සඳහා නාලිකාව ඔතා ගත හැක. බීට්ස් ප්ලගින සැකසුම් ගැන වැඩිදුර කියවන්න
පෙරහන
Exchange උත්පාදනය කරන සැකසුම් සඳහා රසවත් වන සියලුම පෙළ ලොග ලොග් ගොනුවේම විස්තර කර ඇති ක්ෂේත්ර සමඟ csv ආකෘතියෙන් ඇත. csv වාර්තා විග්රහ කිරීම සඳහා, Logstash අපට ප්ලගීන තුනක් ලබා දෙයි:
උදාහරණයක් ලෙස, එය පහත වාර්තාව දෙකට බෙදනු ඇත (ක්ෂේත්රය තුළ කොමාවක් තිබීම හේතුවෙන්), එම නිසා ලොගය වැරදි ලෙස විග්රහ කරනු ලැබේ:
…,"MDB:GUID1, Mailbox:GUID2, Event:526545791, MessageClass:IPM.Note, CreationTime:2020-05-15T12:01:56.457Z, ClientType:MOMT, SubmissionAssistant:MailboxTransportSubmissionEmailAssistant",…
ලඝු-සටහන් විග්රහ කිරීමේදී එය භාවිතා කළ හැක, උදාහරණයක් ලෙස, IIS. මෙම අවස්ථාවේදී, පෙරහන් කොටස මේ ආකාරයෙන් පෙනෙනු ඇත:
filter {
if "IIS" in [tags] {
dissect {
mapping => {
"message" => "%{date} %{time} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
}
remove_field => ["message"]
add_field => { "application" => "exchange" }
}
}
}
Logstash වින්යාසය ඔබට භාවිතා කිරීමට ඉඩ සලසයි IIS
. ප්ලගිනය තුළ අපි ක්ෂේත්ර අගයන් ඒවායේ නම් සමඟ ගැලපේ, මුල් ක්ෂේත්රය මකන්න message
, ලොගයෙන් ඇතුළත් කිරීමක් අඩංගු වූ අතර, අපට අභිරුචි ක්ෂේත්රයක් එක් කළ හැකිය, උදාහරණයක් ලෙස, අප ලඝු එකතු කරන යෙදුමේ නම අඩංගු වේ.
ලොග් ලුහුබැඳීමේදී, csv ප්ලගිනය භාවිතා කිරීම වඩා හොඳය; එයට සංකීර්ණ ක්ෂේත්ර නිවැරදිව සැකසිය හැකිය:
filter {
if "Tracking" in [tags] {
csv {
columns => ["date-time","client-ip","client-hostname","server-ip","server-hostname","source-context","connector-id","source","event-id","internal-message-id","message-id","network-message-id","recipient-address","recipient-status","total-bytes","recipient-count","related-recipient-address","reference","message-subject","sender-address","return-path","message-info","directionality","tenant-id","original-client-ip","original-server-ip","custom-data","transport-traffic-type","log-id","schema-version"]
remove_field => ["message", "tenant-id", "schema-version"]
add_field => { "application" => "exchange" }
}
}
ප්ලගිනය තුළ, අපි ක්ෂේත්ර අගයන් ඒවායේ නම් සමඟ ගැලපේ, මුල් ක්ෂේත්රය මකන්න message
(සහ ක්ෂේත්ර tenant-id
и schema-version
), ලොගයෙන් ඇතුළත් කිරීමක් අඩංගු වූ අතර, අපට අභිරුචි ක්ෂේත්රයක් එක් කළ හැක, උදාහරණයක් ලෙස, අප ලඝු එකතු කරන යෙදුමේ නම එහි අඩංගු වේ.
පෙරීමේ අදියරෙන් පිටවීමේදී, කිබානා හි දෘශ්යකරණය සඳහා සූදානම්, පළමු ආසන්න වශයෙන් අපට ලේඛන ලැබෙනු ඇත. අපට පහත සඳහන් දේ මග හැරෙනු ඇත:
- සංඛ්යාත්මක ක්ෂේත්ර පෙළ ලෙස හඳුනා ගනු ඇත, එමඟින් ඒවා මත ක්රියා කිරීම වළක්වයි. එනම්, ක්ෂේත්ර
time-taken
IIS ලොගය, මෙන්ම ක්ෂේත්රrecipient-count
иtotal-bites
ලොග් ලුහුබැඳීම. - සම්මත ලේඛන කාල මුද්රාවේ අඩංගු වන්නේ ලොගය සැකසූ කාලය මිස එය සේවාදායක පැත්තේ ලියා ඇති කාලය නොවේ.
- ක්ෂේත්රයේ
recipient-address
ලිපි ලබන්නන් ගණනය කිරීමට විශ්ලේෂණයට ඉඩ නොදෙන එක් ඉදිකිරීම් අඩවියක් මෙන් පෙනෙනු ඇත.
ලොග් සැකසුම් ක්රියාවලියට කුඩා මැජික් එකතු කිරීමට කාලයයි.
සංඛ්යාත්මක ක්ෂේත්ර පරිවර්තනය කිරීම
dissect ප්ලගිනයට විකල්පයක් ඇත convert_datatype
, පෙළ ක්ෂේත්රයක් ඩිජිටල් ආකෘතියකට පරිවර්තනය කිරීමට භාවිතා කළ හැක. උදාහරණයක් ලෙස, මේ වගේ:
dissect {
…
convert_datatype => { "time-taken" => "int" }
…
}
මෙම ක්රමය සුදුසු වන්නේ ක්ෂේත්රයේ අනිවාර්යයෙන්ම නූලක් අඩංගු වන්නේ නම් පමණක් බව මතක තබා ගැනීම වටී. විකල්පය ක්ෂේත්ර වලින් ශුන්ය අගයන් සකසන්නේ නැති අතර ව්යතිරේකයක් විසි කරයි.
ලඝු-සටහන් ලුහුබැඳීම සඳහා, ක්ෂේත්ර නිසා සමාන පරිවර්තන ක්රමයක් භාවිතා නොකිරීම වඩා හොඳය recipient-count
и total-bites
හිස් විය හැක. මෙම ක්ෂේත්ර පරිවර්තනය කිරීම සඳහා ප්ලගිනයක් භාවිතා කිරීම වඩා හොඳය
mutate {
convert => [ "total-bytes", "integer" ]
convert => [ "recipient-count", "integer" ]
}
ලබන්නාගේ_ලිපිනය තනි ලබන්නන්ට බෙදීම
මෙම ගැටළුව විකෘති ප්ලගිනය භාවිතයෙන්ද විසඳිය හැක:
mutate {
split => ["recipient_address", ";"]
}
වේලා මුද්දරය වෙනස් කිරීම
ලොග් ලුහුබැඳීමේදී, ප්ලගිනය මඟින් ගැටළුව ඉතා පහසුවෙන් විසඳනු ලැබේ timestamp
ක්ෂේත්රයෙන් අවශ්ය ආකෘතියෙන් දිනය සහ වේලාව date-time
:
date {
match => [ "date-time", "ISO8601" ]
timezone => "Europe/Moscow"
remove_field => [ "date-time" ]
}
IIS ලොග වලදී, අපට ක්ෂේත්ර දත්ත ඒකාබද්ධ කිරීමට අවශ්ය වනු ඇත date
и time
විකෘති ප්ලගිනය භාවිතා කර, අපට අවශ්ය කාල කලාපය ලියාපදිංචි කර මෙම කාල මුද්රාව තබන්න timestamp
දිනය ප්ලගිනය භාවිතා කරමින්:
mutate {
add_field => { "data-time" => "%{date} %{time}" }
remove_field => [ "date", "time" ]
}
date {
match => [ "data-time", "YYYY-MM-dd HH:mm:ss" ]
timezone => "UTC"
remove_field => [ "data-time" ]
}
ප්රතිදාන
ලොග් ග්රාහකයට සැකසූ ලඝු-සටහන් යැවීමට ප්රතිදාන කොටස භාවිතා වේ. ඉලාස්ටික් වෙත කෙලින්ම යැවීමේදී, ප්ලගිනයක් භාවිතා වේ
output {
elasticsearch {
hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
manage_template => false
index => "Exchange-%{+YYYY.MM.dd}"
}
}
අවසාන වින්යාසය
අවසාන සැකසුම මේ ආකාරයෙන් පෙනෙනු ඇත:
input {
beats {
port => 5044
}
}
filter {
if "IIS" in [tags] {
dissect {
mapping => {
"message" => "%{date} %{time} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
}
remove_field => ["message"]
add_field => { "application" => "exchange" }
convert_datatype => { "time-taken" => "int" }
}
mutate {
add_field => { "data-time" => "%{date} %{time}" }
remove_field => [ "date", "time" ]
}
date {
match => [ "data-time", "YYYY-MM-dd HH:mm:ss" ]
timezone => "UTC"
remove_field => [ "data-time" ]
}
}
if "Tracking" in [tags] {
csv {
columns => ["date-time","client-ip","client-hostname","server-ip","server-hostname","source-context","connector-id","source","event-id","internal-message-id","message-id","network-message-id","recipient-address","recipient-status","total-bytes","recipient-count","related-recipient-address","reference","message-subject","sender-address","return-path","message-info","directionality","tenant-id","original-client-ip","original-server-ip","custom-data","transport-traffic-type","log-id","schema-version"]
remove_field => ["message", "tenant-id", "schema-version"]
add_field => { "application" => "exchange" }
}
mutate {
convert => [ "total-bytes", "integer" ]
convert => [ "recipient-count", "integer" ]
split => ["recipient_address", ";"]
}
date {
match => [ "date-time", "ISO8601" ]
timezone => "Europe/Moscow"
remove_field => [ "date-time" ]
}
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
manage_template => false
index => "Exchange-%{+YYYY.MM.dd}"
}
}
ප්රයෝජනවත් සබැඳි:
වින්ඩෝස් මත OpenJDK 11 ස්ථාපනය කරන්නේ කෙසේද? Logstash බාගන්න ප්රත්යාස්ථතාව භාවිතා කරන depriated විකල්පය UseConcMarkSweepGC #36828 එන්එස්එස්එම් නොනැසී පවතින පෝලිම් ආදාන ප්ලගිනය පරාජය කරයි ලොග්ස්ටාෂ් යාලුවනේ, මගේ චේන්සෝ එක කොහෙද? මට මගේ ලඝු-සටහන් විසන්ධි කිරීමට අවශ්යයි පෙරහන් ප්ලගිනය විසන්ධි කරන්න කොන්දේසි පෙරහන් ප්ලගිනය විකෘති කරන්න දිනය පෙරහන් ප්ලගිනය ඉලාස්ටික් සෙවුම් ප්රතිදාන ප්ලගිනය
මූලාශ්රය: www.habr.com