Memantau aplikasi dengan Logger.Backends

Elixir memanfaatkan sepenuhnya infrastruktur logging Erlang untuk membuat log. Dimulai dengan versi 1.10 , yang akan dirilis dalam waktu dekat, fungsi-fungsi logging pengguna baru yang muncul di Erlang / OTP 21+ tersedia untuk kami.


Sementara OTP menyediakan seluruh infrastruktur untuk mengirimkan acara jurnal (acara) kepada pelanggan, mencatatnya sendiri, jika dipahami sebagai menyimpan dan / atau menampilkan acara jurnal, harus dilaksanakan oleh aplikasi. Untuk tujuan ini, abstraksi yang sesuai dari Logger.Backend .


Berikut kutipan dari dokumentasi resmi:


Logger mendukung berbagai backend di mana pesan log ditulis.

Backend yang tersedia secara default terbatas pada satu:
  • :console - mencatat pesan ke konsol (diaktifkan secara default)


Setiap pengembang dapat membuat menuai sendiri seperti backend untuk Logger . Karena Logger adalah manajer acara yang menerapkan perilaku Erlang :gen_event , menulis backend baru hanyalah masalah membuat pengendali acara Anda sendiri, seperti yang dijelaskan dalam dokumentasi untuk :gen_event .

Backend yang digunakan dimuat melalui bagian :backends dalam file konfigurasi, yang harus diproses sebelum meluncurkan aplikasi :logger .


Pendekatan paling umum yang melahirkan banyak jenis perpustakaan hex.pm sama adalah membuat Logger.Backend , yang memahami dan meludahkan konsol JSON, dan mengacaukan beberapa jenis pengiriman log ke tempat Anda membutuhkannya (biasanya itu semacam LaaS ) . Dengan demikian, semua log biasanya berakhir di basis data NoSQL , seperti Elastis , atau yang serupa.


Kami tidak menjadi orisinal, dan kami juga menyimpan log kami di Elastik , tetapi sekarang log saja tidak cukup: anak laki-laki modis modern berpegang teguh pada semua pesan dalam log - metrik untuk segala sesuatu tentang segala hal. Standar de facto untuk bekerja dengan metrik dalam aplikasi OTP baru-baru ini adalah perpustakaan Telemetri , proyek open source yang relatif baru yang bertujuan menyatukan dan menstandarisasi bagaimana perpustakaan dan aplikasi BEAM diinstrumentasi dan dikendalikan .


Pendekatan yang diadopsi oleh Telemetri sederhana ke :telemetry.execute/2 ngeri: kita sebut :telemetry.execute/2 setiap kali ada kebutuhan untuk mengukur sesuatu dalam aplikasi, dan perpustakaan merespons dengan callback yang terdaftar pada awal aplikasi. Selain itu, dimungkinkan untuk melampirkan Telemetry.Poller dan melakukan permintaan metrik secara berkala. Contoh dalam artikel yang saya berikan tautan di atas menyarankan untuk memanggil Logger.log/3 dari pengendali acara Telemetri internal.


Gelato


Saya benci kode boilerplate yang harus Anda seret copy-paste dari proyek ke proyek, dari file ke file. Saya ingin semua yang dapat dilakukan oleh kompiler, penjadwal, dan pekerja dilakukan sehingga saya bahkan tidak memikirkannya. Untuk melakukan ini, saya sering mengemas kode boilerplate ke perpustakaan kecil yang menyembunyikan semua boilerplate yang diperlukan di bawah tenda dan menyediakan antarmuka yang bersih untuk melakukan tindakan yang diperlukan oleh aplikasi kita. Saya hanya ingin sesuatu yang dapat disebut report("message", payload) untuk membuat catatan, menambahkan data telemetri, dan mengirimkan catatan ini ke repositori elastis kami.


Ternyata ini tidak begitu sulit untuk dilakukan.


Kami memutuskan untuk menggunakan panggilan Logger standar sebagai antarmuka, sehingga hanya dengan mengubah konfigurasi kami dapat memperkenalkan fungsionalitas yang diinginkan ke dalam proyek yang ada. Cukup tambahkan Logger.Backend baru. Logger.Backend ke proyek yang ada:


 config :logger, backends: [Our.Fancy.Logger.Backend] 

- dan voila - log dengan telemetri sekarang dikirim ke bunker elastis.


Dan jadi perpustakaan Gelato muncul. Saya tahu bahwa pengembang yang serius dan keras seperti perpustakaan dapat disebut sedikit kurang esoteris, tapi saya bukan pengembang yang nyata. Apa, Anda harus berdamai. Meskipun, gelato (dalam bahasa Spanyol - es krim, omong-omong) bahkan sedikit selaras dengan elastisitas.


Perpustakaan sangat fokus pada bagaimana saya melihat dunia yang tepat, dan di ekor dan surai menggunakan pendekatan "konvensi di atas konfigurasi". Ini mengemas semua yang Anda butuhkan ke dalam satu JSON dan mengirimkannya ke server elastis pra-konfigurasi dengan permintaan HTTP sederhana. Itu juga melampirkan semua metadata yang bisa dijangkau, seperti metrik yang diperoleh menggunakan Process.info/1 , dll.


Untuk mulai menggunakan pustaka ini dalam suatu proyek, Anda perlu menambahkan berikut ini ke file config/releases.exs :


 config :gelato, uri: "http://127.0.0.1:9200", # Elastic API endoint events: [:foo, :bar], # attached telemetry events handler: :elastic # or :console for tests config :logger, backends: [Gelato.Logger.Backend], level: :info 

Setelah itu, panggilan Logger.log/3 apa pun seperti yang di bawah ini akan dikirimkan oleh telemetry dan dikirim ke server elastis yang dikonfigurasi.


 Logger.info "foo", question: "why?", answer: 42, now: System.monotonic_time(:microsecond) 

Pustaka lain adalah makro Gelato.bench/4 , yang mengambil blok dan membuat dua panggilan ke Logger.log/3 : satu sebelum blok dieksekusi dan yang lainnya segera setelah itu, berdasarkan jenis aspek di Jawa.


Gelato diam-diam menekankan pengorganisasian antarmuka yang lebih baik dalam proyek menggunakan makro Gelato.defdelegatelog/2 , komposisi sederhana Gelato.bench/4 dan Kernel.defdelegate/2 . Dengan menggunakan makro ini, Anda dapat mengekstrak semua antarmuka proyek ke dalam set terbatas modul tingkat atas dan membuat panggilan ini dicatat dengan telemetri di luar kotak.


Envío.Log


Implementasi Logger.Backend lain. Logger.Backend yang lahir di sudut hasrat teknologi kami adalah Envío.Log . Ia menggunakan perpustakaan Envío untuk mengirim pesan ke saluran Slack khusus. Logger ini memiliki pengaturan log_level sendiri, yang nilainya biasanya diatur ke :warn atau :error , untuk mencegah Slack channel dari spamming, dan semua panggilan pada level yang kurang terkonfigurasi akan dihapus dari BEAM selama kompilasi.


Konfigurasi tipikal akan terlihat seperti ini:


 config :envio, :log, level: :warn, # do not send :info to Slack process_info: false # do not attach process info config :logger, backends: [Envio.Log.Backend], level: :debug config :envio, :backends, %{ Envio.Slack => %{ {Envio.Log.Publisher, :info} => [ hook_url: {:system, "YOUR_SLACK_CHANNEL_API_ENDPOINT"} ] } } 

Setelah konfigurasi, semua panggilan ke Logger.{warn,error}/2 akan dikirim ke saluran Slack yang sesuai. Sangat nyaman untuk memantau proses kerja dalam produksi secara real time.


Selamat logging!

Source: https://habr.com/ru/post/id482626/


All Articles