سؤال

لدينا تطبيق على Linux يستخدم سجل النظام آلية.بعد قضاء أسبوع في محاولة معرفة سبب تشغيل هذا التطبيق بشكل أبطأ من المتوقع، اكتشفنا أنه إذا قمنا بإزالة سجل النظام وكتبنا مباشرة إلى ملف سجل، فقد تحسن الأداء بشكل كبير.

أفهم سبب كون سجل النظام أبطأ من كتابة الملفات المباشرة.لكني كنت أتساءل:هل هناك طرق لتكوين سجل النظام لتحسين أدائه؟

هل كانت مفيدة؟

المحلول

ويمكنك تكوين أن syslogd (وrsyslog على الأقل) لا لمزامنة ملفات السجل بعد رسالة السجل من قبل معلق مسبقا على "-" إلى سجل مسار الملف في ملف التكوين. هذا يسرع الأداء على حساب الخطر الذي سجل الرسائل يمكن أن تضيع في الحادث.

نصائح أخرى

هناك عدة خيارات لتحسين أداء سجل النظام:

  • تحسين المكالمات باستخدام الماكرو

     int LogMask = LOG_UPTO(LOG_WARNING);
     #define syslog(a, ...) if ((a) & LogMask ) syslog((a), __VA_ARGS__)
    
     int main(int argc, char **argv)
     {
              LogMask = setlogmask(LOG_UPTO(LOG_WARNING));
              ...
     }
    

    تتمثل ميزة استخدام ماكرو لتصفية مكالمات syslog في أن المكالمة بأكملها يتم تقليلها إلى قفزة مشروطة على متغير عالمي ، مفيد للغاية إذا كان لديك مكالمات تصحيح ترجمة مجموعات البيانات الكبيرة من خلال وظائف أخرى.

  • قناع الإعداد ()

    setlogmask(LOG_UPTO(LOG_LEVEL))
    

    سيقوم SetLogmask () بتحسين المكالمة من خلال عدم تسجيلها إلى /dev /log ، ولكن سيظل البرنامج يدعو الوظائف المستخدمة كوسائط.

  • التصفية باستخدام syslog.conf

     *.err                                               /var/log/messages
    

    "راجع صفحة الدليل الخاصة بـ syslog.conf للحصول على التفاصيل."

  • قم بتكوين سجل النظام للقيام بالتسجيل غير المتزامن أو المخزن مؤقتًا

    يستخدم metalog للتخزين المؤقت لإخراج السجل ومسحه في كتل.الأسهم Syslog و Syslog-NG لا تفعل ذلك بقدر ما أعرف.

وقبل الشروع في البرنامج الخفي جديد الكتابة يمكنك معرفة ما اذا كان سيسلوغ-نغ وأسرع (أو يمكن تهيئتها لتكون أسرع) من سجل النظام القديم عادي.

وخدعة واحدة يمكنك استخدامها إذا كنت السيطرة على المصدر إلى تطبيق تسجيل هو قناع من مستوى السجل الذي تريده في التطبيق نفسه، بدلا من syslog.conf. فعلت هذا منذ سنوات مع أحد التطبيقات التي تم إنشاؤها لذلك، ضخمة، كمية ضخمة ضخمة من سجلات التصحيح. بدلا من إزالة دعوات من رمز الإنتاج، ونحن فقط ملثمين حتى مستوى التصحيح مكالمات لم يحصل إرسالها إلى شيطان. أنا فعلا وجدت رمز، انها بيرل لكنه مجرد واجهة لsetlogmask (3) المكالمة.

use Sys::Syslog;
# Start system logging
# setlogmask controls what levels we're going to let get through.  If we mask
# them off here, then the syslog daemon doesn't need to be concerned by them
# 1   = emerg
# 2   = alert
# 4   = crit
# 8   = err
# 16  = warning
# 32  = notice
# 64  = info
# 128 = debug
Sys::Syslog::setlogsock('unix');
openlog($myname,'pid,cons,nowait','mail');
setlogmask(127); # allow everything but debug
#setlogmask(255); # everything
syslog('debug',"syslog opened");

ولست متأكدا لماذا كنت عشري بدلا من قناع بت ... <م> تتغاضى

اكتب تنفيذ سجل النظام الخاص بك.:-ص

ويمكن تحقيق ذلك بطريقتين.

  1. اكتب الشى الذى تريده LD_PRELOAD ربط لتجاوز وظائف سجل النظام، وجعلها الإخراج إلى stderr بدلاً من.في الحقيقة لقد كتبت تدوينة حول هذا الأمر منذ عدة سنوات: http://marc.info/?m=97175526803720 :-ص
  2. اكتب البرنامج الخفي لسجل النظام الخاص بك.إنها مجرد مسألة بسيطة تتمثل في انتزاع مخططات البيانات منها /dev/log!:-ص

حسنًا، حسنًا، هاتان الإجابتان مضحكتان.هل قمت بالتعريف syslogd لنرى أين هو الأكثر اختناقا؟

ويمكنك تكوين مستوى أن syslogd (أو منشأة) لتسجيل الدخول بشكل غير متزامن، عن طريق وضع ناقص قبل الطريق إلى ملف التسجيل (أي: المستخدم * [التبويب] - / فار / السجل / user.log).

وابتهاج.

ويمكن أن تساعد في تنفيذ سيسلوغ-المتزامن ()، في خطر من خطوط سجل فقدت / يحدها التأخير في أوقات أخرى. http://thekelleys.org.uk/syslog-async/

ملحوظة: "متزامنة" هنا يشير إلى الاصطفاف سجل الأحداث داخل التطبيق الخاص بك، وليس الإنتاج أن syslogd خيار تكوين ملف غير المتزامن أن إجابات أخرى تشير إلى

.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top