RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa wikang Rust #
Panimula #
Sa mundo ng pagbuo ng software, gumaganap ang pagtatala ng saligang papel sa pag-unawa sa kilos ng aplikasyon, sa pagsusuri ng suliranin, at sa pagtiyak ng maayos na pagtakbo. At naghahandog ang wikang Rust, isang wikang pamprograma para sa sistema na kilala sa bisa at kaligtasan nito, sa mga developer ng malawak na hanay ng solusyon sa pagtatala. At mula sa mga aklatang ito isinilang ang RustLogs (RLG): isang malakas at nababaluktot na aklatan ng pagtatala na nagpapadali ng pagdaragdag ng matatag na kakayahan sa pagtatala sa mga aplikasyong Rust.
.class="m-10 w-100"
1. Pag-unawa sa pangangailangan ng mabisang pagtatala #
Bago sumisid sa detalye ng RustLogs (RLG), huminto muna tayo saglit upang unawain kung bakit saligan ang mabisang pagtatala sa pagbuo ng software. Ang pagtatala ay mapagpasyang teknik sa pagkuha ng impormasyon sa oras ng pagtakbo hinggil sa kilos ng aplikasyon, sa daloy ng datos, at sa mga posibleng suliranin. At sa pamamagitan ng estratehikong paglalagay ng tagubilin ng talaan sa loob ng base ng kodigo, kayang makakuha ng mga developer ng mahalagang kabatiran hinggil sa panloob na gawain ng aplikasyon at matukoy ang anumang anomalya o pagkakamali. Kayang mabisang mangalap ng mga developer ng mapagpasyang datos — tulad ng pagsasagawa ng punsiyon, ng nilalaman ng baryabol, at ng babala ng pagkakamali — sa pamamagitan ng estratehikong pagsingit ng tagubilin ng talaan sa kodigo. At nagiging di-mapapantayang mahalaga ang impormasyong ito kapag inaayos ang depekto, pinabubuti ang bisa, o iniimbestigahan ang di-inaasahang kilos.
Gayunman, maaaring maging gawaing nakauubos ng panahon at madaling magkamali ang pagpapatupad ng punsiyon ng pagtatala mula sa simula. Nangangailangan ito ng maingat na pagsasaalang-alang sa antas ng talaan, sa pagpopormat, sa patutunguhan ng output, at sa bigat sa bisa. At dito pumapasok ang RustLogs (RLG), na naghahandog ng masaklaw at madaling gamiting solusyon sa pagtatala na idinisenyo partikular para sa mga developer ng Rust.
.class="m-10 w-100"
2. RustLogs (RLG): isang masaklaw na aklatan ng pagtatala #
Ang RustLogs (RLG) ay isang aklatan ng pagtatala na mayaman sa tampok na naglalayong pasimplehin at ayusin ang proseso ng pagdaragdag ng kakayahan sa pagtatala sa mga aplikasyong Rust. Naghahandog ito ng malinis at madaling maunawaang API, kasama ang hanay ng malalakas na macro, kaya pinadadali nito ang pagsasanib ng pagtatala sa base ng kodigo. At naghahandog ang RustLogs (RLG) ng malawak na saklaw ng antas ng talaan, na nagpapahintulot sa iyong kontrolin ang lawak ng detalye ng iyong talaan ayon sa bigat at halaga ng impormasyon.
Isa sa pangunahing lakas ng RustLogs (RLG) ang kakayahan nitong umangkop sa pagpopormat ng talaan at sa patutunguhan ng output. Sinusuportahan ang nakabalangkas na pagtatala, kaya pinahihintulutan ka nitong kunin ang datos ng talaan sa nakabalangkas na anyo tulad ng JSON, na nagpapadali ng pagsusuri nito. At naghahandog din ang RustLogs (RLG) ng pagkakatugma sa maraming pormat ng output, kabilang na ang mga tanyag na balangkas ng pagtatala tulad ng syslog, ng Apache Access Log, at ng Log4j XML. At tinitiyak ng sari-saring gamit na ito na maayos na naisasanib ang RustLogs (RLG) sa umiiral nang imprastruktura at kasangkapan para sa pagtatala.
.class="m-10 w-100"
3. Pagsisimula sa RustLogs (RLG) #
Upang simulan ang paggamit ng RustLogs (RLG) sa iyong proyektong Rust, kailangan mo itong idagdag bilang dependency sa talaksang Cargo.toml. Tukuyin ang nais na bersiyon ng RustLogs (RLG) at hayaang asikasuhin ng Cargo ang iba pa:
[dependencies]
rlg = "0.0.3"
Sa sandaling naidagdag ang dependency, masisimulan mo nang gamitin ang RustLogs (RLG) sa iyong kodigong Rust. Naghahandog ang aklatan ng simple at madaling maunawaang API para sa paglikha ng entry ng talaan. Narito ang isang saligang halimbawa:
use rlg::log::Log;
use rlg::log_format::LogFormat;
use rlg::log_level::LogLevel;
let log_entry = Log::new(
"session_id",
"timestamp",
&LogLevel::INFO,
"component",
"This is a log message",
&LogFormat::JSON,
);
Upang lumikha ng bagong entry ng talaan, gamitin ang punsiyong Log::new(). Tukuyin ang pagkakakilanlan ng sesyon, ang tatak ng oras, ang antas ng talaan, ang sangkap, ang mensahe ng talaan, at ang anyo ng talaan (JSON sa halimbawang ito). Naghahandog ang RustLogs (RLG) ng antas at anyo ng talaang naunang tinukoy. Pumili mula sa mga antas na ALL, DEBUG, DISABLED, ERROR, FATAL, INFO, NONE, TRACE, VERBOSE, at WARNING. Para naman sa anyo, pumili mula sa CLF, JSON, CEF, ELF, W3C, GELF, ApacheAccessLog, Logstash, Log4jXML, at NDJSON. At binibigyan ka nito ng masusing kontrol sa iyong paghahanda ng pagtatala.
.class="m-10 w-100"
4. Asinkronong pagtatala gamit ang RustLogs (RLG) #
Isa sa namumukod na tampok ng RustLogs (RLG) ang suporta nito sa asinkronong pagtatala. Sa makabagong pagbuo ng software, napakahalaga ng bisa, at maaaring magdulot ng di-kailangang pagkaantala ang pagharang sa pangunahing hibla ng pagsasagawa para sa layuning pagtatala. At tinutugunan ng RustLogs (RLG) ang usaping ito sa pamamagitan ng paghahandog ng kakayahan sa asinkronong pagtatala na handa nang gamitin.
Sa RustLogs (RLG), maitatala mo ang mensahe nang asinkrono gamit ang pamamaraang log() sa entry ng talaan. At ibinabalik ng pamamaraang ito ang isang Future na tumatakbo habang tumatakbo ang pangunahing lohika ng iyong aplikasyon. At pinahihintulutan nito ang iyong aplikasyon na magpatuloy nang hindi hinihintay na matapos ang pagtatala. Narito ang halimbawa ng asinkronong pagtatala gamit ang RustLogs (RLG):
use rlg::log::Log;
use rlg::log_format::LogFormat;
use rlg::log_level::LogLevel;
async fn log_async() {
let log_entry = Log::new(
"session_id",
"timestamp",
&LogLevel::INFO,
"component",
"This is an async log message",
&LogFormat::JSON,
);
match log_entry.log().await {
Ok(_) => println!("Log message written successfully"),
Err(e) => eprintln!("Error writing log message: {}", e),
}
}
Sa paggamit ng asinkronong pagtatala, tinitiyak ng RustLogs (RLG) na hindi napipinsala ng operasyon ng pagtatala ang bisa ng iyong aplikasyon. At partikular itong kapaki-pakinabang sa mga senaryong mataas ang produktibidad o kapag humahawak ng malaking dami ng datos ng talaan.
.class="m-10 w-100"
5. Nababaluktot na paghahanda at pag-aangkop #
Naghahandog ang RustLogs (RLG) ng mataas na antas ng kakayahang umangkop at ng opsiyon sa pag-aangkop upang matugunan ang iba't ibang kahingian sa pagtatala. Maihahanda mo ang iba't ibang opsiyon sa pagtatala, tulad ng lokasyon ng talaksan ng talaan, ng antas ng talaan, at ng anyo ng output. At pinahihintulutan ka nitong ihanda ang pagtatala ayon sa pangangailangan ng iyong aplikasyon.
Sa likas na takda, itinatala ng RustLogs (RLG) ang mensahe sa isang talaksang tinatawag na RLG.log sa loob ng kasalukuyang folder. Gayunman, madali mong maiaangkop ang landas ng talaksan ng talaan sa pamamagitan ng pagtatakda ng baryabol ng kapaligirang LOG_FILE_PATH:
std::env::set_var("LOG_FILE_PATH", "/path/to/custom/log/file.log");
Pinahihintulutan ka ng kakayahang umangkop na ito na ituro ang output ng talaan sa iba't ibang talaksan ayon sa kapaligiran ng paglulunsad o sa imprastruktura ng pagtatala.
Bukod dito, naghahandog ang RustLogs (RLG) ng balangkas na Config na nagpapahintulot sa iyong ikarga ang takda ng paghahanda mula sa baryabol ng kapaligiran o bumalik sa likas na halaga. At binibigyang-kakayahan ka nitong isentro ang paghahanda ng pagtatala at madaling baguhin ito nang hindi binabago ang iyong kodigo:
use rlg::config::Config;
let config = Config::load();
Sa pamamagitan ng balangkas na Config, maaabot mo ang naikargang takda ng paghahanda at magagamit mo ito sa buong aplikasyon mo. At tinitiyak nito ang magkakatugmang kilos ng pagtatala sa iba't ibang pagpapatakbo o paglulunsad.
.class="m-10 w-100"
6. Malalakas na macro para sa pinasimpleng pagtatala #
Naghahandog ang RustLogs (RLG) ng hanay ng malalakas na macro na nagpapasimple ng karaniwang gawain sa pagtatala at nagbabawas ng paulit-ulit na kodigo. At naghahandog ang mga macro na ito ng praktikal na paraan upang maitala ang mensahe nang may simpleng paghahanda at pagtatakda. Narito ang ilang halimbawa ng macro na makukuha sa RustLogs (RLG):
macro_log!: lumilikha ng bagong entry ng talaan gamit ang tinukoy na parametro.
let log = macro_log!(session_id, time, level, component, description, format);
macro_info_log!: lumilikha ng talaan ng impormasyon gamit ang likas na pagkakakilanlan ng sesyon at anyo.
let log = macro_info_log!(time, component, description);
macro_warn_log!: lumilikha ng talaan ng babala.
let log = macro_warn_log!(time, component, description);
macro_error_log!: lumilikha ng talaan ng pagkakamali gamit ang likas na anyo.
let log = macro_error_log!(time, component, description);
Ibinubukod ng mga macro na ito ang pagiging masalimuot ng paglikha ng entry ng talaan, kaya pinahihintulutan ka nitong tumuon sa saligang impormasyong nais mong itala. At naghahandog sila ng makatuwirang likas na halaga para sa pagkakakilanlan ng sesyon, para sa anyo, at para sa iba pang parametro, kaya binabawasan nito ang dami ng kodigong kailangan mong isulat at panatilihin.
.class="m-10 w-100"
7. Pagsasanib sa umiiral nang imprastruktura ng pagtatala #
Isa sa pangunahing pakinabang ng RustLogs (RLG) ang pagkakatugma nito sa iba't ibang imprastruktura at kasangkapan para sa pagtatala. Sinusuportahan ng aklatan ang malawak na saklaw ng anyo ng output, kaya pinadadali nito ang pagsasanib sa umiiral nang daluyan ng pagtatala at sa plataporma ng pagsusuri.
Halimbawa, kung gumagamit ka ng sentralisadong sistema ng pagtatala tulad ng syslog, kayang isulat nang maayos ng RustLogs (RLG) ang mensahe ng talaan sa anyong syslog. At kung gumagamit ka naman ng kasangkapan sa pagtitipon ng talaan tulad ng Logstash o Graylog, kayang ilabas ng RustLogs ang talaan sa anyong tugma sa mga sistemang ito, tulad ng JSON o GELF.
Tinitiyak ng kakayahang ito sa pagsasanib ang posibilidad na magamit ang lakas ng RustLogs (RLG) nang hindi ginugulo ang umiiral mong paghahanda ng pagtatala. Maipagpapatuloy mo ang paggamit ng iyong gustong imprastruktura ng pagtatala habang ginagamit mo ang kadalian at kakayahang umangkop na inihahandog ng RustLogs (RLG).
.class="m-10 w-100"
8. Paghawak sa pagkakamali at katatagan #
Hindi ligtas sa pagkakamali ang operasyon ng pagtatala, at naghahandog ang RustLogs (RLG) ng matatag na mekanismo sa paghawak ng pagkakamali upang matiyak ang pagiging maaasahan at integridad ng iyong talaan. At ibinabalik ng aklatan ang uring Result mula sa pamamaraang log(), kaya pinahihintulutan ka nitong harapin nang maayos ang posibleng pagkakamali.
Kabilang sa karaniwang pagkakamaling maaaring maganap sa panahon ng pagtatala ang: pagkakamali sa input/output ng talaksan, suliranin sa pagpopormat, o pagkakamaling may kinalaman sa network kapag nagpapadala ng talaan sa malayong patutunguhan. At kinukuha ng RustLogs (RLG) ang mga pagkakamaling ito at naghahandog ito ng kapaki-pakinabang na mensahe ng pagkakamali, kaya pinahihintulutan ka nitong suriin at tugunan ang mga ito nang naaangkop.
Narito ang halimbawa ng paghawak sa pagkakamali gamit ang RustLogs (RLG):
use rlg::log::Log;
use rlg::log_format::LogFormat;
use rlg::log_level::LogLevel;
async fn log_with_error_handling() {
let log_entry = Log::new(
"session_id",
"timestamp",
&LogLevel::INFO,
"component",
"This is a log message",
&LogFormat::JSON,
);
match log_entry.log().await {
Ok(_) => println!("Log message written successfully"),
Err(e) => eprintln!("Error writing log message: {}", e),
}
}
Tinitiyak ng RustLogs (RLG) na hindi lumilipas nang hindi napapansin ang kabiguan sa pagtatala. Binibigyan ka nito ng impormasyong kailangan upang makagawa ng hakbang na pagwawasto sa pamamagitan ng mahusay na paghawak sa pagkakamali.
.class="m-10 w-100"
9. Pagsasaalang-alang sa bisa #
Pagdating sa pagtatala, ang bisa ay mapagpasyang salik na dapat isaalang-alang. Maaaring magdulot ng malaking bigat at makaapekto sa pangkalahatang bisa ng iyong aplikasyon ang labis na pagtatala o ang di-mabisang mekanismo ng pagtatala. At idinisenyo ang RustLogs (RLG) nang nasa isip ang bisa, sapagkat naghahandog ito ng ilang pagpapabuti upang mabawasan ang epekto ng pagtatala sa iyong sistema.
Una, sinusuportahan ng RustLogs (RLG) ang asinkronong pagtatala, gaya ng nabanggit sa itaas. Gumagamit ang RustLogs (RLG) ng asinkronong operasyon ng input/output, upang hindi hadlangan ng pagtatala ang pangunahing hibla. At pinahihintulutan nito ang iyong aplikasyon na magpatuloy sa pagproseso habang nagaganap ang pagtatala sa likuran. At binabawasan ng di-humaharang na paraang ito ang parusa sa bisa na dulot ng operasyon ng pagtatala.
Bukod dito, gumagamit ang RustLogs (RLG) ng mabisang mekanismo ng pagpopormat at output. Gumagamit ang aklatan ng mga bapor na naunang inilaan at iniiwasan nito ang di-kailangang paglalaan ng memorya hangga't maaari. At binabawasan ng pagpapabuting ito ang bakas sa memorya at pinabubuti nito ang kabuuang kahusayan ng pagtatala.
Pinahihintulutan ka ng RustLogs (RLG) na kontrolin ang antas ng detalye sa iyong talaan. Maaari mong piliing itala ang pinakamahalagang impormasyon lamang o isama ang higit pang detalye para sa layuning pagwawasto. At sa pagtatakda ng angkop na antas ng talaan para sa iba't ibang sangkap o yunit sa iyong aplikasyon, mapabubuti mo ang bisa sa pamamagitan ng pag-aalis ng di-kailangang pagtatala sa kapaligiran ng produksiyon.
.class="m-10 w-100"
Pangwakas #
Ang RustLogs (RLG) ay malakas, nababaluktot, at madaling gamiting aklatan ng pagtatala na nagpapasimple ng proseso ng pagsasanib ng pagtatala sa mga aplikasyong Rust. At ginagawa itong sari-saring gamit na pagpipilian para sa iba't ibang pangangailangan sa pagtatala ng malawak nitong hanay ng tampok — kabilang na ang nakabalangkas na pagtatala, ang asinkronong operasyon, at ang pagkakatugma sa tanyag na imprastruktura ng pagtatala.
Binibigyang-kakayahan ng madaling maunawaang API ng aklatan, ng malalakas nitong macro, at ng matatag nitong mekanismo sa paghawak ng pagkakamali ang mga developer na mahusay at maaasahang makuha ang mahalagang impormasyon sa oras ng pagtakbo. At pinatatatag din ng pagpapabuti sa bisa at ng nababaluktot na opsiyon sa pagtatakda ng RustLogs ang pagiging magagamit at ang kakayahan nitong umangkop sa kahingian ng iba't ibang proyekto.
Sa masaklaw nitong dokumentasyon at sa maayos nitong pagsasanib sa ekosistema ng Rust, nakatayo ang RustLogs bilang maaasahan at mabisang solusyon sa pagtatala para sa mga developer ng Rust. At sa paggamit ng kakayahan ng RustLogs, kayang makakuha ng mga developer ng mas malalim na kabatiran hinggil sa kilos ng kanilang aplikasyon, mapasimple ang proseso ng pagwawasto, at matiyak ang pangmatagalang kakayahang mapanatili ang kanilang base ng kodigo.
At habang patuloy na lumalago at umuunlad ang komunidad ng Rust, hinahangad ng RustLogs na maging mahalagang kasangkapan sa arsenal ng developer, na nagbibigay-kakayahan sa kanya na makabuo ng mga aplikasyong matatag, mahusay ang pagtatala, at madaling mapanatili.
Huling sinuri .
I-cross-post ang artikulong ito
Kopyahin ang format para sa Medium
# RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau > Originally published at [https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/](https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/) Ang RustLogs (RLG): isang aklatan ng pagtatala para sa Rust na may asinkronong operasyon, nakabalangkas na output sa JSON at GELF, malalakas na macro, at pagsasanib sa umiiral nang imprastruktura ng pagtatala. Read the full article on sebastienrousseau.com: https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/
Kopyahin ang format para sa Mastodon
RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau Ang RustLogs (RLG): isang aklatan ng pagtatala para sa Rust na may asinkronong operasyon, nakabalangkas na output sa JSON at GELF, malalakas na macro, at pagsasanib sa umiiral nang imprastruktura ng pagtatala. https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/
Kopyahin na naka-format para sa LinkedIn
RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau Ang RustLogs (RLG): isang aklatan ng pagtatala para sa Rust na may asinkronong operasyon, nakabalangkas na output sa JSON at GELF, malalakas na macro, at pagsasanib sa umiiral nang imprastruktura ng pagtatala. Narito ang mga pangunahing estratehikong aral: - RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa wikang Rust. Sa mundo ng pagbuo ng software, gumaganap ang pagtatala ng saligang papel sa pag-unawa sa kilos ng aplikasyon, sa pagsusuri ng suliranin, at sa pagtiyak ng maayos na pagtakbo. - Panimula. Sa mundo ng pagbuo ng software, gumaganap ang pagtatala ng saligang papel sa pag-unawa sa kilos ng aplikasyon, sa pagsusuri ng suliranin, at sa pagtiyak ng maayos na pagtakbo. - Pangwakas. Ang RustLogs (RLG) ay malakas, nababaluktot, at madaling gamiting aklatan ng pagtatala na nagpapasimple ng proseso ng pagsasanib ng pagtatala sa mga aplikasyong Rust. - 1. Pag-unawa sa pangangailangan ng mabisang pagtatala. Bago sumisid sa detalye ng RustLogs (RLG), huminto muna tayo saglit upang unawain kung bakit saligan ang mabisang pagtatala sa pagbuo ng software. Ano ang diskarte ng inyong organisasyon sa mga hamon na tinukoy sa piraso na ito? → https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/ #Rustlogs #Rlg #Rust #Pagtatala #Logging Sebastien Rousseau | CC-BY-4.0
Sipiin ang artikulong ito
RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau
Ang RustLogs (RLG): isang aklatan ng pagtatala para sa Rust na may asinkronong operasyon, nakabalangkas na output sa JSON at GELF, malalakas na macro, at pagsasanib sa umiiral nang imprastruktura ng pagtatala.
BibTeX
@online{rousseau2024rustlogs,
author = {Rousseau, Sebastien},
title = {{RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau}},
year = {2024},
url = {https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/},
urldate = {2024}
}RIS
TY - GEN AU - Rousseau, Sebastien TI - RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau PY - 2024 UR - https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/ ER -
Vancouver
Rousseau S. RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau. sebastienrousseau.com. 2024 Mar 8. Available from: https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/
Chicago
Rousseau, Sebastien. "RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau." sebastienrousseau.com. March 8, 2024. https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/.
APA
Rousseau, S. (2024, March 8). RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau. sebastienrousseau.com. https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/
Muling i-publish ang artikulong ito
RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau
Ang RustLogs (RLG): isang aklatan ng pagtatala para sa Rust na may asinkronong operasyon, nakabalangkas na output sa JSON at GELF, malalakas na macro, at pagsasanib sa umiiral nang imprastruktura ng pagtatala.
Ang artikulong ito ay nakapailalim sa lisensya ng Creative Commons Attribution 4.0 International. Kailangan ng pagkilala sa canonical URL para sa muling pag-publish.
RustLogs (RLG): isang nakabalangkas na aklatan ng pagtatala para sa Rust — Sebastien Rousseau Ang RustLogs (RLG): isang aklatan ng pagtatala para sa Rust na may asinkronong operasyon, nakabalangkas na output sa JSON at GELF, malalakas na macro, at pagsasanib sa umiiral nang imprastruktura ng pagtatala. Originally published at https://sebastienrousseau.com/fil/2024-03-08-rustlogs-rlg-aklatan-ng-pagtatala-para-sa-rust/ by Sebastien Rousseau. Licensed under CC-BY-4.0.
