Penggunaan fungsi LOG_PERROR pada PHP

PowerPoint 2010: Memformat Gambar

Biasanya mesej log ditulis ke stderr. Saya tertanya-tanya adakah idea / amalan yang baik untuk memisahkan mesej log sehingga kesilapan dan amaran pergi ke stderr sementara mesej debug / maklumat / notis pergi ke stdout? Atau ini tidak relevan memandangkan banyak proses pembalakan khusus hanya dibaca dari stdin, yang memerlukan mesej log sumber dalam stderr dan stdout digabungkan dan dialihkan ke stdin logger.

[Kemas kini]

Dua jawapan di bawah kedua-duanya disebut syslog, saya rasa saya perlu menjelaskan penyediaannya secara terperinci.

Proses daemon yang saya tanyakan berjalan di latar depan sendiri. Daemonization dikendalikan dengan mengawasi proses seperti runit atau supervisord. Dalam kedua kes tersebut, langkah dan proses daemon akan ditangkap oleh proses pengawasan, dan ini adalah tugas proses penyeliaan untuk memutuskan bagaimana dan di mana menyimpan log (mungkin syslog, atau di tempat lain dalam rangkaian melalui UDP) . Proses daemon tidak perlu bimbang tentang apa dan di mana menulis log, kerana mereka hanya menulis ke stdout / stderr.

Dalam kes runit, kemudahan pembalakannya svlogd akan membaca dari stdinnya untuk mesej log yang diarahkan, yang digabungkan stderr / stdout dari proses daemon yang dikendalikan. Untuk supervisord, ia dapat merakam stderr dan stdout untuk memisahkan fail log.

Oleh itu, dalam tetapan khusus ini, adakah amalan yang baik untuk memisahkan log antara stderr dan stdout, atau hanya menulis kepada salah satu daripadanya?

4

  • Sebahagian daripada kekeliruan adalah bahawa anda merujuk kepada proses anak sebagai proses daemon. Dokumentasi untuk penyelia bersetuju bahawa mereka bukan daemon.
  • Sepertinya anda menulis program kanak-kanak sendiri, kerana anda bertanya sama ada hendak menulis ke stdout atau stdout / stderr. Sekiranya ada, apa yang anda peroleh dengan menggunakan runit atau supervisord? Adakah sebab anda tidak mahu menulis daemon biasa dan menggunakan monit?
  • Sekiranya anda menetapkan rancangan asal anda, saya mencadangkan bahawa kesilapan dan amaran pergi ke stderr sementara mesej debug / maklumat / notis pergi ke stdout sebagai gantinya. Dengan cara ini anda juga dapat menjalankan program anda cron, dengan stdout dialihkan ke fail log. Sekiranya terdapat kesilapan sebenar, cron akan e-mel root.
  • Saya melihat bahawa anda masih aktif di ServerFault. Untuk mengelakkan perkara ini muncul dalam senarai soalan yang belum dijawab, sila terima jawapan atau jelaskan soalan anda lebih jauh. Terima kasih!

Saya tidak akan mencadangkan penggabungan stdout dan stderr dalam program anda, tetapi bagaimana anda mengatasinya di luar ia terpulang pada awak. stdout dimaksudkan untuk data yang diproses yang dimaksudkan untuk saluran pipa, sementara stderr khusus untuk mesej bukan data. Ini menjadikan tingkah laku tertentu mungkin, seperti pemprosesan kumpulan, tanpa mengubah tingkah laku interaktif yang ada. Kes anda berbeza-beza - ada peluang yang baik bermaksud tidak ada artinya.

Kerana runit mempunyai cara pembalakan yang agak berbeza melalui svlog, dan perkhidmatan yang anda tulis kemungkinan besar tidak akan berdemonisasi (yang dalam kes ini bermaksud "melepaskan diri dari tty") maka akan terpulang kepada anda jika anda ingin menangkap semuanya ke satu log, atau tidak, melalui /etc/sv//run skrip. Sebahagian besar, skrip yang paling banyak digunakan

exec 2>&1 

untuk menggabungkan kedua aliran bersama, kerana kebanyakan perkhidmatan tidak menyebarkan data melalui stdout. Sekiranya anda mahu menggunakan svlog anda perlu membuat skrip di /etc/sv//log/run dengan arahan yang sesuai untuk memulakannya. Ia mungkin kelihatan serupa (tetapi tidak seperti ini):

#!/bin/sh exec 2>&1 exec svlog -tt main 

di mana main adalah symlink ke direktori logging.

    Pertama, sesuatu yang penting untuk diperjelaskan: STDOUT dan STDERR jarang relevan dalam konteks proses daemon setelah ia berjaya dimulakan, kecuali jika anda menggunakan satu dengan penyahpepijatan.

    Inti daemon adalah bahawa ia perlu melepaskan diri dari mempunyai terminal kawalan, sehingga dapat bertahan setelah logout. Setelah tidak ada terminal, semua mesej perlu dihantar ke daemon syslog atau fail log yang diuruskan secara langsung oleh proses.

    Sekiranya anda sebenarnya tidak merujuk kepada daemon, dan sebenarnya bermaksud skrip shell atau yang serupa yang anda tulis sendiri, maka logiknya biasanya seperti ini:

    • STDOUT: Apa sahaja yang anda mahukan terperangkap dengan paip atau pengalihan output asas.
    • STDERR: Mesej "Di luar kumpulan". Perkara yang anda mahukan akan menyerang terminal seseorang, walaupun mereka melakukan semacam pengalihan. (Oleh itu mengapa ia dikaitkan dengan kesilapan) Biarkan pengguna memutuskan apakah mereka juga ingin mengalihkan mesej ini juga, iaitu mengalihkan STDERR ke STDIN seperti yang anda nyatakan.

    2

    • Terima kasih kerana menjawab! Saya menambahkan lebih banyak maklumat latar belakang pada soalan mengikut jawapan anda. Bolehkah anda melihatnya lagi? Terima kasih banyak-banyak!
    • 1 Saya berpendapat bahawa jawapan saya tetap sah selepas pengeditan. Sekiranya seseorang merancang apa-apa proses latar depan, untuk mematuhi prinsip yang paling tidak mengejutkan, ia harus dirancang seolah-olah mungkin dijalankan di dalam terminal. Meletakkan proses daemon pengawas di depannya tidak boleh mengubah bagaimana perisian dirancang.

    Saya tidak fikir anda harus menggunakan stdout dan stderr untuk pembalakan. Sekiranya anda mempunyai mesej log dengan keparahan yang berbeza, mereka harus ditandai dengan awalan untuk memudahkan menyaring / menyusunnya menggunakan svlogd.

    Saya katakan menggunakan stdout dan stderr untuk pembalakan akan melanggar prinsip paling tidak mengejutkan.

      Sekiranya ia adalah daemon, saya cadangkan menggunakan antara muka syslog untuk memasukkan mesej anda terus ke log.Jalankan "man 3 syslog" untuk maklumat. Sekiranya perlu, program anda juga dapat memiliki opsi debug (dengan parameter yang menentukan keutamaan) yang memberitahu program daemon untuk tidak berjalan di latar belakang, dan juga masuk ke stderr.

      Saya akan menulis fungsi pembalakan yang mengambil keutamaan dan rentetan sebagai argumen. Ia harus memanggil syslog () untuk mencatat mesej dengan betul, dan jika keutamaannya lebih besar dari atau sama dengan nilai keutamaan debug global, keluarkan pesan ke stderr dan juga syslog (). Panggil syslog(..., '%s', msg) untuk mengelakkan peratusan watak dalam mesej tidak diganggu. (Atau jadikan fungsi anda mengambil sejumlah argumen dan lulus senarai argumen ke vsyslog ().)

      Pastikan anda menelefon openlog(..., LOG_PID, LOG_DAEMON) dalam permulaan program anda. Anda boleh menambah | LOG_PERROR selepas LOG_DAEMON jika anda berada dalam mod debug, yang akan mengelakkan daripada menulis fungsi log yang disebutkan di atas. Tetapi anda akan kehilangan keupayaan untuk menapis berdasarkan keutamaan.

      Anda mungkin (jika menggunakan Ubuntu) perlu mengkonfigurasi /etc/rsyslog.conf untuk memastikan bahawa mesej daemon sedang log.

      PS - Gunakan perintah logger jika daemon anda adalah skrip shell

      1

      • Terima kasih kerana menjawab! Saya menambahkan lebih banyak maklumat latar belakang pada soalan mengikut jawapan anda. Bolehkah anda melihatnya lagi? Terima kasih banyak-banyak!

      Tweet

      Share

      Link

      Plus

      Send

      Send

      Pin