﷽
→ أحدث إصدار
→ سجل التغيير
→ العينات
ملخص لماذا مكتبة أخرى الميزات في لمحة ابدء تحميل بداية سريعة التثبيت (اختياري) ضبط وسيطات التطبيق إعدادات مستوى تكوين باستخدام ملف التكوين باستخدام el::فئة التكوينات باستخدام تكوينات في الخط التكوينات الافتراضية التكوينات العالمية محددات تنسيق التسجيل محددات تنسيق التاريخ/الوقت محددات التنسيق المخصصة أعلام التسجيل حجج التطبيق تكوين وحدات الماكرو تكوينات القراءة التسجيل أساسي التسجيل المشروط التسجيل من حين لآخر printf مثل التسجيل تسجيل الشبكة تسجيل مطول أساسي المشروطة والعرضية مستوى مطول تحقق مما إذا كان التسجيل المطول قيد التشغيل VModule تسجيل المسجلين الجدد إلغاء تسجيل المسجلين نشر معرفات المسجل الموجودة مشاركة مستودع التسجيل ميزات إضافية تتبع الأداء تتبع الأداء المشروط الاستفادة من بيانات تتبع الأداء تدوير ملف السجل التعامل مع الأعطال تثبيت معالجات الأعطال المخصصة ستاكتريس متعدد الخيوط تحقق من وحدات الماكرو خطأ في التسجيل () باستخدام سجل النظام تسجيل المحكمة الخاصة بلبنان القوالب المدعومة تسجيل كيو تي تعزيز التسجيل تسجيل wxWidgets توسيع المكتبة تسجيل الفصل الدراسي الخاص بك تسجيل فئة الطرف الثالث مسح ملفات السجل وتحريكها يدويًا سجل إرسال رد الاتصال رد الاتصال بتسجيل المسجل التسجيل غير المتزامن الفصول المساعدة مساهمة تقديم التصحيحات الإبلاغ عن خطأ التوافق بناء مصفوفة رخصة تنصل
Easylogging++ هي مكتبة تسجيل فعالة ذات رأس واحد لتطبيقات C++. إنها قوية للغاية وقابلة للتمديد بدرجة كبيرة وقابلة للتكوين وفقًا لمتطلبات المستخدم. يوفر القدرة على كتابة المصارف الخاصة بك (عبر المميز المشار إليه باسم LogDispatchCallback
). تُستخدم هذه المكتبة حاليًا من قبل مئات المشاريع مفتوحة المصدر على github وغيرها من مواقع إدارة التحكم مفتوحة المصدر.
هذا الدليل مخصص لـ Easylogging++ v9.97.1. بالنسبة للإصدارات الأخرى، يرجى الرجوع إلى الإصدار المقابل على جيثب.
قد تكون مهتمًا أيضًا بخادم تسجيل البقايا.
انتقل إلى الأعلى
إذا كنت تعمل على أداة صغيرة أو مشروع كبير بلغة C++، فقد تكون هذه المكتبة مفيدة لك. يعتمد على رأس واحد ويتطلب فقط الارتباط بملف مصدر واحد. (في الأصل كان الرأس فقط وتم تغييره لاستخدام الملف المصدر في الإصدار رقم 445. لا يزال بإمكانك استخدام الرأس فقط في الإصدار 9.89).
تم تصميم هذه المكتبة مع أخذ العديد من الأفكار في الاعتبار (أي سهولة النقل والأداء وسهولة الاستخدام والميزات وسهولة الإعداد).
لماذا مكتبة أخرى؟ حسنًا، الإجابة واضحة جدًا، استخدمها كما كتبتها حتى تتمكن من إصلاح المشكلات (إن وجدت) أثناء تقدمك أو رفعها على جيثب. بالإضافة إلى ذلك، أنا شخصيًا لم أر أي مكتبة تسجيل تعتمد على رأس واحد مع مثل هذا التصميم حيث يمكنك تكوينه أثناء التنقل وتوسيعه ليناسب احتياجاتك والحصول على أداء سريع. لقد رأيت مكتبات تسجيل أخرى ذات رأس واحد لـ C++ ولكنها إما تستخدم مكتبات خارجية، على سبيل المثال، Boost أو Qt لدعم ميزات معينة مثل الترابط أو التعبير العادي أو التاريخ وما إلى ذلك. تحتوي هذه المكتبة على كل شيء مدمج لمنع استخدام المكتبات الخارجية، لا يعني ذلك أنني لا أحب تلك المكتبات، بل في الواقع أحبها، ولكن نظرًا لأن ليس كل المشاريع تستخدم هذه المكتبات، فلا يمكنني المخاطرة بالاعتماد عليها.
انتقل إلى الأعلى
Easylogging++ غني بالميزات ويحتوي على العديد من الميزات التي سيتطلبها كل من المطورين النموذجيين والمتقدمين أثناء كتابة البرنامج؛
انتقل إلى الأعلى
قم بتنزيل أحدث إصدار من أحدث إصدار
للحصول على إصدارات أخرى، يرجى زيارة صفحة الإصدارات. إذا كان تطبيقك لا يدعم C++ 11، فيرجى التفكير في استخدام الإصدار 8.91. هذه نسخة مستقرة لـ C++98 وC++03، ولكنها تفتقر إلى بعض الميزات.
انتقل إلى الأعلى
من أجل البدء باستخدام Easylogging++، يمكنك اتباع ثلاث خطوات سهلة:
easylogging++.h
و easylogging++.cc
)# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, char * argv[]) {
LOG (INFO) << " My first info log using default logger " ;
return 0 ;
}
الآن تجميع باستخدام
g++ main.cc easylogging++.cc -o prog -std=c++11
بهذه البساطة! يرجى ملاحظة أنه يجب استخدام INITIALIZE_EASYLOGGINGPP
مرة واحدة فقط وإلا فسوف ينتهي بك الأمر بالحصول على أخطاء في الترجمة. هذا هو تعريف عدة متغيرات extern
. وهذا يعني أنه يمكن تعريفه مرة واحدة فقط لكل تطبيق. أفضل مكان لوضع بيان التهيئة هذا هو الملف حيث يتم تعريف وظيفة int main(int, char**)
مباشرة بعد بيان التضمين الأخير.
إذا كنت تريد تثبيت هذا الرأس على مستوى النظام، فيمكنك القيام بذلك عبر:
mkdir build
cd build
cmake -Dtest=ON ../
make
make test
make install
يتم دعم الخيارات التالية بواسطة Easylogging++ cmake ويمكنك تشغيل هذه الخيارات باستخدام -D<option>=ON
lib_utc_datetime
- يحدد ELPP_UTC_DATETIME
build_static_lib
- يبني مكتبة ثابتة لـ Easylogging++ ومع ذلك، ستظل بحاجة إلى ملف easylogging++.cc
لتتمكن من التجميع. بالنسبة للرأس فقط، يرجى التحقق من الإصدار 9.89 والإصدارات الأقل.
وبدلاً من ذلك، يمكنك تنزيل وتثبيت easyloggingpp باستخدام مدير التبعيات vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install easyloggingpp
يتم تحديث منفذ easyloggingpp في vcpkg بواسطة أعضاء فريق Microsoft والمساهمين في المجتمع. إذا كان الإصدار قديمًا، فيرجى إنشاء مشكلة أو سحب طلب على مستودع vcpkg.
انتقل إلى الأعلى
يوصى دائمًا بتمرير وسيطات التطبيق إلى Easylogging++. تتطلب بعض ميزات Easylogging++ منك تعيين وسائط التطبيق، على سبيل المثال، التسجيل المطول لتعيين المستوى المطول أو وحدات vmodules (سيتم شرحها لاحقًا). من أجل القيام بذلك يمكنك استخدام مساعد الماكرو أو فئة المساعد؛
int main ( int argc, char * argv[]) {
START_EASYLOGGINGPP (argc, argv);
...
}
انتقل إلى الأعلى
لكي تبدأ في تكوين مكتبة التسجيل الخاصة بك، يجب أن تفهم مستويات الخطورة. لا يستخدم Easylogging++ عمدًا التسجيل الهرمي من أجل التحكم الكامل في ما هو ممكن وما هو غير ممكن. ومع ذلك، لا يزال هناك خيار لاستخدام التسجيل الهرمي باستخدام LoggingFlag::HierarchicalLogging
. يحتوي Easylogging++ على المستويات التالية (مرتبة للمستويات الهرمية)
مستوى | وصف |
---|---|
عالمي | المستوى العام الذي يمثل جميع المستويات. مفيد عند ضبط التكوين العام لجميع المستويات. |
يتعقب | المعلومات التي يمكن أن تكون مفيدة لتتبع أحداث معينة - تكون مفيدة في الغالب من سجلات تصحيح الأخطاء. |
تصحيح | الأحداث الإعلامية الأكثر فائدة للمطورين لتصحيح أخطاء التطبيق. ينطبق فقط إذا لم يتم تعريف NDEBUG (لغير VC++) أو تم تعريف _DEBUG (لـ VC++). |
مميت | حدث خطأ فادح للغاية من شأنه أن يؤدي إلى إحباط التطبيق. |
خطأ | معلومات خطأ ولكن سيستمر التطبيق لمواصلة التشغيل. |
تحذير | المعلومات التي تمثل أخطاء في التطبيق ولكن التطبيق سيستمر في التشغيل. |
معلومات | مفيد بشكل أساسي لتمثيل التقدم الحالي للتطبيق. |
مطول | المعلومات التي يمكن أن تكون مفيدة للغاية وتختلف باختلاف مستوى التسجيل المطول. لا ينطبق التسجيل المطول على التسجيل الهرمي. |
مجهول | ينطبق فقط على التسجيل الهرمي ويستخدم لإيقاف التسجيل بالكامل. |
انتقل إلى الأعلى
Easylogging++ سهل التكوين. هناك ثلاث طرق ممكنة للقيام بذلك،
يمكن إجراء التكوين عن طريق الملف الذي يتم تحميله في وقت التشغيل بواسطة فئة Configurations
. يحتوي هذا الملف على التنسيق التالي؛
* LEVEL:
CONFIGURATION NAME = "VALUE" ## Comment
ANOTHER CONFIG NAME = "VALUE"
يبدأ اسم المستوى بنجمة (*) وينتهي بنقطتين (:). يوصى بشدة ببدء ملف التكوين الخاص بك بالمستوى Global
بحيث يستخدم أي تكوين غير محدد في الملف التكوين من Global
تلقائيًا. على سبيل المثال، إذا قمت بتعيين Filename
في Global
وتريد أن تستخدم كافة المستويات نفس اسم الملف، فلا تقم بتعيينه بشكل صريح لكل مستوى، وستستخدم المكتبة قيمة التكوين من Global
تلقائيًا. يحتوي الجدول التالي على التكوينات التي يدعمها ملف التكوين.
اسم التكوين | يكتب | وصف |
---|---|---|
Enabled | منطقي | يحدد ما إذا كان المستوى المقابل للمسجل ممكّنًا أم لا. يمكنك تعطيل كافة السجلات باستخدام el::Level::Global |
To_File | منطقي | ما إذا كان سيتم كتابة السجل المقابل لملف السجل أم لا |
To_Standard_Output | منطقي | ما إذا كان سيتم كتابة السجلات إلى المخرجات القياسية أم لا، على سبيل المثال، المحطة الطرفية أو موجه الأوامر |
Format | شار* | يحدد تنسيق/نمط التسجيل للمستوى والمسجل المقابل. |
Filename | شار* | يحدد ملف السجل (المسار الكامل) لكتابة السجلات للمستوى والمسجل المقابلين |
Subsecond_Precision | uint | يحدد الدقة الفرعية (التي كانت تسمى سابقًا "عرض المللي ثانية"). يمكن أن يكون العرض ضمن النطاق (1-6) |
Performance_Tracking | منطقي | يحدد ما إذا كان تم تمكين تتبع الأداء أم لا. هذا لا يعتمد على المسجل أو المستوى. يستخدم تتبع الأداء دائمًا مسجل "الأداء" ما لم يتم تحديده |
Max_Log_File_Size | size_t | إذا كان حجم ملف السجل للمستوى المقابل >= الحجم المحدد، فسيتم اقتطاع ملف السجل. |
Log_Flush_Threshold | size_t | يحدد عدد إدخالات السجل التي سيتم الاحتفاظ بها حتى نقوم بمسح بيانات السجل المعلقة |
من فضلك لا تستخدم علامات الاقتباس المزدوجة في أي مكان في التعليق، فقد ينتهي بك الأمر إلى سلوك غير متوقع.
ملف التكوين النموذجي
* GLOBAL:
FORMAT = "%datetime %msg"
FILENAME = "/tmp/logs/my.log"
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = true
SUBSECOND_PRECISION = 6
PERFORMANCE_TRACKING = true
MAX_LOG_FILE_SIZE = 2097152 ## 2MB - Comment starts with two hashes (##)
LOG_FLUSH_THRESHOLD = 100 ## Flush after every 100 logs
* DEBUG:
FORMAT = "%datetime{%d/%M} %func %msg"
محتويات ملف التكوين في النموذج أعلاه واضحة ومباشرة. نبدأ بالمستوى GLOBAL
من أجل تجاوز جميع المستويات. أي مستوى لاحق محدد بشكل واضح سوف يتجاوز التكوين من GLOBAL
. على سبيل المثال، كافة المستويات باستثناء DEBUG
لها نفس التنسيق، أي التاريخ والوقت ورسالة السجل. بالنسبة لمستوى DEBUG
، لدينا فقط التاريخ (مع اليوم والشهر) ووظيفة المصدر ورسالة السجل. يتم استخدام باقي تكوينات DEBUG
من GLOBAL
. لاحظ أيضًا {%d/%M}
بتنسيق DEBUG
أعلاه، إذا لم تحدد تنسيق التاريخ، فسيتم استخدام التنسيق الافتراضي. القيم الافتراضية للتاريخ/الوقت هي %d/%M/%Y %h:%m:%s,%g
لمزيد من المعلومات حول محددات التنسيق هذه، يرجى الرجوع إلى قسم محدد تنسيق التاريخ/الوقت أدناه
# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, const char ** argv) {
// Load configuration from file
el::Configurations conf ( " /path/to/my-conf.conf " );
// Reconfigure single logger
el::Loggers::reconfigureLogger ( " default " , conf);
// Actually reconfigure all loggers instead
el::Loggers::reconfigureAllLoggers (conf);
// Now all the loggers will use configuration from file
}
يمكن تحويل ملف التكوين الخاص بك إلى كائن
el::Configurations
(باستخدام المُنشئ) الذي يمكن استخدامه أينما تكون هناك حاجة إليه (كما هو الحال في المثال أعلاه).
انتقل إلى الأعلى
يمكنك ضبط التكوينات أو إعادة ضبط التكوينات؛
# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, const char ** argv) {
el::Configurations defaultConf;
defaultConf. setToDefault ();
// Values are always std::string
defaultConf. set (el::Level::Info,
el::ConfigurationType::Format, " %datetime %level %msg " );
// default logger uses default configurations
el::Loggers::reconfigureLogger ( " default " , defaultConf);
LOG (INFO) << " Log using default file " ;
// To set GLOBAL configurations you may use
defaultConf. setGlobally (
el::ConfigurationType::Format, " %date %msg " );
el::Loggers::reconfigureLogger ( " default " , defaultConf);
return 0 ;
}
يجب ضبط التكوين مرة واحدة فقط. إذا كنت راضيًا عن التكوين الافتراضي، فيمكنك استخدامه أيضًا.
انتقل إلى الأعلى
يعني التكوين المضمن أنه يمكنك تعيين التكوينات في std::string
ولكن تأكد من إضافة جميع أحرف السطر الجديدة وما إلى ذلك. لا ينصح بهذا لأنه دائمًا ما يكون فوضويًا.
el::Configurations c;
c.setToDefault();
c.parseFromText( " *GLOBAL: n FORMAT = %level %msg " );
يقوم الكود أعلاه بتعيين كائن التكوينات فقط، ولا تزال بحاجة إلى إعادة تكوين المسجل/المسجلات باستخدام هذه التكوينات.
انتقل إلى الأعلى
إذا كنت ترغب في الحصول على تكوين للمسجلين الحاليين والمستقبليين، فيمكنك استخدام el::Loggers::setDefaultConfigurations(el::Configurations& configurations, bool configureExistingLoggers = false)
. يعد هذا مفيدًا عندما تعمل على نطاق واسع إلى حد ما، أو تستخدم مكتبة تابعة لجهة خارجية تستخدم بالفعل Easylogging++. سيستخدم أي مسجل تم إنشاؤه حديثًا التكوينات الافتراضية. إذا كنت ترغب في تكوين أدوات التسجيل الموجودة أيضًا، فيمكنك تعيين الوسيطة الثانية على true
(يتم تعيينها افتراضيًا على false
).
انتقل إلى الأعلى
Level::Global
لا علاقة له بالتكوينات العامة، فهو مفهوم يمكنك من خلاله تسجيل التكوينات لجميع/أو بعض المسجلين وحتى تسجيل المسجلين الجدد باستخدام ملف التكوين. بناء جملة ملف التكوين هو:
-- LOGGER ID ## Case sensitive
## Everything else is same as configuration file
-- ANOTHER LOGGER ID
## Configuration for this logger
يبدأ معرف المسجل بشرطتين. بمجرد كتابة ملف التكوين العام الخاص بك، يمكنك تكوين جميع أدوات تسجيلك (وتسجيل أجهزة تسجيل جديدة) باستخدام وظيفة واحدة؛
int main ( void ) {
// Registers new and configures it or
// configures existing logger - everything in global.conf
el::Loggers::configureFromGlobal ( " global.conf " );
// .. Your prog
return 0 ;
}
يرجى ملاحظة أنه ليس من الممكن تسجيل مسجل جديد باستخدام التكوين العام دون تحديد التكوين الخاص به. يجب عليك تحديد تكوين واحد على الأقل. تمت مناقشة الطرق الأخرى لتسجيل أدوات قطع الأشجار في قسم التسجيل أدناه.
انتقل إلى الأعلى
يمكنك تخصيص تنسيق التسجيل باستخدام المحددات التالية:
محدد | تم استبداله بـ |
---|---|
%logger | معرف المسجل |
%thread | معرف الموضوع - يستخدم std::thread إذا كان متاحًا، وإلا فإن GetCurrentThreadId() على النوافذ |
%thread_name | استخدم Helpers::setThreadName لتعيين اسم الموضوع الحالي (حيث تقوم بتشغيل setThreadName منه). راجع نموذج أسماء المواضيع |
%level | مستوى الخطورة (معلومات، تصحيح، خطأ، تحذير، فادح، مطول، تتبع) |
%levshort | مستوى الخطورة (الإصدار القصير، أي I للمعلومات وعلى التوالي D وE وW وF وV وT) |
%vlevel | مستوى الإسهاب (ينطبق على التسجيل المطول) |
%datetime | التاريخ و/أو الوقت - النمط قابل للتخصيص - راجع محددات تنسيق التاريخ/الوقت أدناه |
%user | المستخدم يقوم بتشغيل التطبيق حاليا |
%host | تطبيق اسم الكمبيوتر قيد التشغيل |
%file * | اسم الملف للملف المصدر (المسار الكامل) - تخضع هذه الميزة لتوفر ماكرو __FILE__ للمترجم |
%fbase * | اسم الملف للملف المصدر (الاسم الأساسي فقط) |
%line * | رقم السطر المصدر - تخضع هذه الميزة لتوافر ماكرو __LINE__ للترجمة |
%func * | وظيفة التسجيل |
%loc * | اسم الملف المصدر ورقم سطر التسجيل (مفصولاً بنقطتين) |
%msg | رسالة السجل الفعلية |
% | حرف الهروب (على سبيل المثال، %%level سوف يكتب %level) |
__LINE__
، __FILE__
إلخ انتقل إلى الأعلى
يمكنك تخصيص تنسيق التاريخ/الوقت باستخدام المحددات التالية
محدد | تم استبداله بـ |
---|---|
%d | يوم من الشهر (مبطن صفر) |
%a | يوم الأسبوع - قصير (الإثنين، الثلاثاء، الأربعاء، الخميس، الجمعة، السبت، الأحد) |
%A | يوم الأسبوع - طويل (الاثنين، الثلاثاء، الأربعاء، الخميس، الجمعة، السبت، الأحد) |
%M | الشهر (صفر مبطن) |
%b | الشهر - قصير (يناير، فبراير، مارس، أبريل، مايو، يونيو، يوليو، أغسطس، سبتمبر، أكتوبر، نوفمبر، ديسمبر) |
%B | الشهر - طويل (يناير، فبراير، مارس، أبريل، مايو، يونيو، يوليو، أغسطس، سبتمبر، أكتوبر، نوفمبر، ديسمبر) |
%y | السنة - رقمين (13، 14، إلخ) |
%Y | السنة - أربعة أرقام (2013، 2014، إلخ) |
%h | الساعة (تنسيق 12 ساعة) |
%H | الساعة (تنسيق 24 ساعة) |
%m | الدقيقة (صفر مبطنة) |
%s | الثانية (صفر مبطن) |
%g | الجزء الفرعي (يتم تكوين الدقة بواسطة ConfigurationType::Sub SecondPrecision) |
%F | تعيين صباحا / مساءا |
% | شخصية الهروب |
يرجى ملاحظة أن التاريخ/الوقت يقتصر على 30
حرفًا على الأكثر.
انتقل إلى الأعلى
يمكنك أيضًا تحديد محددات التنسيق الخاصة بك. للقيام بذلك يمكنك استخدام el::Helpers::installCustomFormatSpecifier
. المثال المثالي هو %ip_addr
لتطبيق خادم TCP؛
const char * getIp ( const el::LogMessage*) {
return " 192.168.1.1 " ;
}
int main ( void ) {
el::Helpers::installCustomFormatSpecifier ( el::CustomFormatSpecifier ( " %ip_addr " , getIp));
el::Loggers::reconfigureAllLoggers (el::ConfigurationType::Format, " %datetime %level %ip_addr : %msg " );
LOG (INFO) << " This is request from client " ;
return 0 ;
}
انتقل إلى الأعلى
من خلال تشكيل بعض أجزاء التسجيل، يمكنك تعيين علامات التسجيل؛ هنا الأعلام المدعومة:
علَم | وصف |
---|---|
NewLineForContainer (1) | التأكد من وجود سطر جديد لكل إدخال في سجل الحاوية |
AllowVerboseIfModuleNotSpecified (2) | يتأكد من استخدام -vmodule ولم يحدد وحدة نمطية، فيُسمح بالتسجيل المطول عبر تلك الوحدة. لنفترض أن المعلمة كانت -vmodule=main*=3 ويتم كتابة سجل مطول من ملف يسمى Something.cpp، ثم إذا تم تمكين هذه العلامة، فسيتم كتابة السجل وإلا فسيتم عدم السماح به. ملاحظة: وجود هذا يهزم الغرض من -vmodule |
LogDetailedCrashReason (4) | عند التعامل مع الأعطال افتراضيًا، سيتم تسجيل سبب التعطل التفصيلي أيضًا (معطل افتراضيًا) (الإصدار رقم 90) |
DisableApplicationAbortOnFatalLog (8) | يسمح بتعطيل إجهاض التطبيق عند تسجيل الدخول باستخدام مستوى FATAL. لاحظ أن هذا لا ينطبق على معالجات الأعطال الافتراضية حيث يجب إلغاء التطبيق بعد معالجة إشارة الأعطال. (لا تتم إضافتها بشكل افتراضي) (الإصدار رقم 119) |
ImmediateFlush (16) | يمسح السجل مع كل إدخال سجل (حساس للأداء) - معطل افتراضيًا |
StrictLogFileSizeCheck (32) | يتأكد من فحص حجم ملف السجل مع كل سجل |
ColoredTerminalOutput (64) | سيكون الإخراج الطرفي ملونًا إذا كان مدعومًا بالمحطة الطرفية. |
MultiLoggerSupport (128) | تمكين الدعم لاستخدام أدوات تسجيل متعددة لتسجيل رسالة واحدة. (على سبيل المثال، CLOG(INFO, "default", "network") << This will be logged using default and network loggers; ) |
DisablePerformanceTrackingCheckpointComparison (256) | تعطيل مقارنة نقاط التفتيش |
DisableVModules (512) | تعطيل استخدام vmodules |
DisableVModulesExtensions (1024) | تعطيل ملحق vmodules. هذا يعني أنه إذا كان لديك vmodule -vmodule=main*=4 فسوف يغطي كل شيء يبدأ بـ main، حيث كما لو لم يكن لديك هذا التعريف، سيتم تغطيتك لأي ملف يبدأ بـ main وينتهي بأحد الامتدادات التالية؛ .h .c .cpp .cc .cxx .-inl-.h .hxx .hpp. يرجى ملاحظة أن vmodule التالي غير صحيح -vmodule=main.=4 مع عدم تعريف هذا الماكرو لأن هذا سيتحقق من main..c، لاحظ النقاط المزدوجة. إذا كنت تريد أن يكون هذا صحيحًا، فقم بإلقاء نظرة على علامة التسجيل أعلاه:allowVerboseIfModuleNotSpecified '?' و '' أحرف البدل مدعومة |
HierarchicalLogging (2048) | تمكين التسجيل الهرمي. هذا لا ينطبق على التسجيل المطول. |
CreateLoggerAutomatically (4096) | يقوم بإنشاء المسجل تلقائيًا عندما لا يكون متاحًا. |
AutoSpacing (8192) | يضيف مسافات تلقائيا. على سبيل المثال، LOG(INFO) << "DODGE" << "THIS!"; سوف يخرج "دودج هذا!" |
FixedTimeFormat (16384) | ينطبق على تتبع الأداء فقط - وهذا يمنع وقت التنسيق. على سبيل المثال، سيتم تسجيل 1001 ms كما هي، بدلاً من تنسيقها على أنها 1.01 sec |
IgnoreSigInt (32768) | عند تعطل التطبيق تجاهل إشارة الانقطاع |
يمكنك تعيين/إلغاء تعيين هذه العلامات باستخدام el::Loggers::addFlag
و el::Loggers::removeFlag
الثابت. يمكنك التحقق لمعرفة ما إذا كانت علامة معينة متاحة باستخدام el::Loggers::hasFlag
، كل هذه الوظائف تأخذ تعدادًا مكتوبًا بقوة el::LoggingFlag
يمكنك تعيين هذه العلامات باستخدام
--logging-flags
سطر الأوامر arg. تحتاج إلى تمكين هذه الوظيفة عن طريق تحديد الماكروELPP_LOGGING_FLAGS_FROM_ARG
(ستحتاج إلى التأكد من استخدامSTART_EASYLOGGINGPP(argc, argv)
لتكوين الوسائط).
يمكنك أيضًا تعيين العلامات الافتراضية (الأولية) باستخدام
ELPP_DEFAULT_LOGGING_FLAGS
وتعيين القيمة الرقمية للأعلام الأولية
انتقل إلى الأعلى
سيوضح الجدول التالي جميع وسيطات سطر الأوامر التي قد تستخدمها لتحديد سلوك معين؛ ستحتاج إلى تهيئة وسيطات التطبيق باستخدام START_EASYLOGGINGPP(argc, argv)
في وظيفتك main(int, char**)
.
دعوى | وصف |
---|---|
-v | ينشط أقصى قدر من الإسهاب |
--v=2 | تنشيط الإسهاب حتى المستوى المطول 2 (النطاق الصالح: 0-9) |
--verbose | ينشط أقصى قدر من الإسهاب |
-vmodule=MODULE_NAME | يقوم بتنشيط الإسهاب للملفات بدءًا من المستوى الرئيسي إلى المستوى 1، وتعتمد بقية الملفات على علامة التسجيل AllowVerboseIfModuleNotSpecified يرجى الاطلاع على قسم علامات التسجيل أعلاه. يمكن فصل وحدتين بفاصلة. برجاء ملاحظة أن وحدات vmodules تأتي في المرتبة الأخيرة من حيث أسبقية فحص وسيطات التسجيل المطول، على سبيل المثال، إذا كان لدينا -v في وسيطات التطبيق قبل وحدات vmodules، فسيتم تجاهل وحدات vmodules. |
--logging-flags=3 | تعيين علامة التسجيل. في المثال ie, 3 ، يقوم بتعيين إشارة التسجيل إلى NewLineForContainer و AllowVerboseIfModuleNotSpecified . راجع قسم علامات التسجيل أعلاه لمزيد من التفاصيل والقيم. راجع قسم وحدات الماكرو لتعطيل هذه الوظيفة. |
--default-log-file=FILE | يقوم بتعيين ملف السجل الافتراضي للمسجلين الحاليين والمستقبليين. قد ترغب في التفكير في تحديد ELPP_NO_DEFAULT_LOG_FILE لمنع إنشاء ملف سجل فارغ افتراضي أثناء المعالجة المسبقة. راجع قسم وحدات الماكرو لتعطيل هذه الوظيفة. |
انتقل إلى الأعلى
يمكن تعيين بعض خيارات التسجيل بواسطة وحدات الماكرو، وهذا قرار مدروس، على سبيل المثال، إذا قمنا بتحديد ELPP_THREAD_SAFE
، فسيتم تمكين جميع وظائف مؤشر الترابط الآمن وإلا فسيتم تعطيلها (التأكد من أن الإفراط في أمان مؤشر الترابط يصاحبها). لتسهيل التذكر ومنع التعارضات المحتملة، تبدأ كافة وحدات الماكرو بـ ELPP_
ملاحظة: يمكن تعريف كافة وحدات الماكرو بإحدى الطرق التالية:
حدد وحدات الماكرو باستخدام خيار -D
للمترجم، على سبيل المثال في حالة g++
ستفعل g++ source.cpp ... -DELPP_SYSLOG -DELPP_THREAD_SAFE ...
( طريقة موصى بها )
تحديد وحدات الماكرو داخل "easylogging++.h"
(لن يعمل تحديد وحدات الماكرو في الملفات الأخرى)
اسم الماكرو | وصف |
---|---|
ELPP_DEBUG_ASSERT_FAILURE | إحباط التطبيق عند فشل التأكيد الأول. يرجع هذا التأكيد إلى إدخال غير صالح، على سبيل المثال، ملف تكوين غير صالح وما إلى ذلك. |
ELPP_UNICODE | تمكين دعم Unicode عند التسجيل. يتطلب START_EASYLOGGINGPP |
ELPP_THREAD_SAFE | تمكين سلامة الخيط - تأكد من ربط lpthread لنظام التشغيل Linux. |
ELPP_FORCE_USE_STD_THREAD | يفرض استخدام مكتبة C++ القياسية للترابط (مفيد فقط عند استخدام ELPP_THREAD_SAFE |
ELPP_FEATURE_CRASH_LOG | ينطبق على دول مجلس التعاون الخليجي فقط. تمكين خاصية التتبع المكدس عند تعطل التطبيق |
ELPP_DISABLE_DEFAULT_CRASH_HANDLING | تعطيل معالجة الأعطال الافتراضية. يمكنك استخدام el::Helpers::setCrashHandler لاستخدام المعالج الخاص بك. |
ELPP_DISABLE_LOGS | تعطيل جميع السجلات - (المعالجة المسبقة) |
ELPP_DISABLE_DEBUG_LOGS | تعطيل سجلات التصحيح - (المعالجة المسبقة) |
ELPP_DISABLE_INFO_LOGS | تعطيل سجلات المعلومات - (المعالجة المسبقة) |
ELPP_DISABLE_WARNING_LOGS | تعطيل سجلات التحذير - (المعالجة المسبقة) |
ELPP_DISABLE_ERROR_LOGS | تعطيل سجلات الأخطاء - (المعالجة المسبقة) |
ELPP_DISABLE_FATAL_LOGS | تعطيل السجلات القاتلة - (المعالجة المسبقة) |
ELPP_DISABLE_VERBOSE_LOGS | تعطيل السجلات المطولة - (المعالجة المسبقة) |
ELPP_DISABLE_TRACE_LOGS | تعطيل سجلات التتبع - (المعالجة المسبقة) |
ELPP_FORCE_ENV_VAR_FROM_BASH | إذا تعذر العثور على متغير البيئة، فافرض استخدام أمر bash البديل للعثور على القيمة، على سبيل المثال، whoami لاسم المستخدم. (لا تستخدم هذا الماكرو مع LD_PRELOAD للمكتبات التي تستخدم بالفعل Easylogging++ وإلا سينتهي بك الأمر في تجاوز سعة المكدس للعمليات ( popen ) (راجع الإصدار رقم 87 لمزيد من التفاصيل)) |
ELPP_DEFAULT_LOG_FILE | اسم الملف الكامل حيث تريد إنشاء الملفات الأولية. تحتاج إلى تضمين قيمة هذا الماكرو مع علامات الاقتباس، على سبيل المثال، -DELPP_DEFAULT_LOG_FILE='"logs/el.gtest.log"' لاحظ علامات الاقتباس المزدوجة داخل علامات الاقتباس المفردة، وعلامات الاقتباس المزدوجة هي قيم const char* وعلامات الاقتباس المفردة تحدد قيمة ماكرو |
ELPP_NO_LOG_TO_FILE | قم بتعطيل التسجيل للملف في البداية |
ELPP_NO_DEFAULT_LOG_FILE | إذا كنت لا تريد تهيئة المكتبة باستخدام ملف السجل الافتراضي، فحدد هذا الماكرو. سيؤدي هذا إلى تسجيل الدخول إلى جهاز فارغ لنظام التشغيل Unix وWindows. في الأنظمة الأساسية الأخرى، قد تحصل على خطأ وستحتاج إلى استخدام ELPP_DEFAULT_LOG_FILE . (العلاقات العامة للأجهزة الفارغة الخاصة بالمنصة الأخرى هي موضع ترحيب كبير) |
ELPP_FRESH_LOG_FILE | لا تقم مطلقًا بإلحاق ملف السجل عندما يتم إنشاء ملف السجل (استخدمه بحذر لأنه قد يتسبب في نتائج غير متوقعة لبعض المستخدمين) |
ELPP_DEBUG_ERRORS | إذا كنت ترغب في اكتشاف الأخطاء الداخلية التي أثارها Easylogging++ والتي يمكن أن تكون بسبب التكوين أو أي شيء آخر، فيمكنك تمكينها عن طريق تحديد هذا الماكرو. سوف تحصل على الأخطاء الخاصة بك على الإخراج القياسي، أي المحطة الطرفية أو موجه الأوامر. |
ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS | تعطيل محددات التنسيق المخصصة بالقوة |
ELPP_DISABLE_LOGGING_FLAGS_FROM_ARG | يعطل القدرة على تعيين إشارات التسجيل باستخدام وسيطات سطر الأوامر |
ELPP_DISABLE_LOG_FILE_FROM_ARG | تعطيل القدرة على تعيين ملف السجل الافتراضي من وسائط سطر الأوامر بالقوة |
ELPP_WINSOCK2 | في نظام Windows يفرض استخدام winsock2.h بدلاً من winsock.h عند تعريف WIN32_LEAN_AND_MEAN |
ELPP_CUSTOM_COUT (متقدم) | يتم الحل إلى قيمة، على سبيل المثال، #define ELPP_CUSTOM_COUT qDebug() أو #define ELPP_CUSTOM_COUT std::cerr . سيستخدم هذا قيمة الإخراج القياسي (بدلاً من استخدام std::cout |
ELPP_CUSTOM_COUT_LINE (متقدم) | يُستخدم مع ELPP_CUSTOM_COUT لتحديد كيفية كتابة سطر سجل باستخدام cout مخصص. على سبيل المثال، #define ELPP_CUSTOM_COUT_LINE(msg) QString::fromStdString(msg).trimmed() |
ELPP_NO_CHECK_MACROS | لا تقم بتعريف وحدات الماكرو CHECK |
ELPP_NO_DEBUG_MACROS | لا تقم بتعريف وحدات الماكرو DEBUG |
ELPP_UTC_DATETIME | يستخدم توقيت UTC بدلاً من التوقيت المحلي (يستخدم بشكل أساسي gmtime بدلاً من localtime والوظائف العائلية) |
ELPP_NO_GLOBAL_LOCK | لا تقفل التخزين بالكامل عند الإرسال. وينبغي استخدام هذا بحذر. راجع العدد رقم 580 |
انتقل إلى الأعلى
إذا كنت ترغب في قراءة تكوينات مسجل معين، فيمكنك القيام بذلك باستخدام وظيفة typedConfigurations()
في فئة المسجل.
el::Logger* l = el::Loggers::getLogger( " default " );
bool enabled = l-> typedConfigurations ()->enabled(el::Level::Info);
// Or to read log format/pattern
std::string format =
l-> typedConfigurations ()->logFormat(el::Level::Info).format();
انتقل إلى الأعلى
يتم تسجيل الدخول easylogging++ باستخدام مجموعة من وحدات الماكرو. هذا لتسهيل الأمر على المستخدم ومنعه من معرفة تفاصيل أكبر غير ضرورية حول كيفية القيام بالأشياء.
يتم تزويدك بوحدتي ماكرو أساسيتين يمكنك استخدامهما لكتابة السجلات:
LOG(LEVEL)
CLOG(LEVEL, logger ID)
يستخدم LOG
المسجل "الافتراضي" بينما في CLOG (سجل مخصص) تحدد معرف المسجل. للحصول على المستويات، يرجى الرجوع إلى قسم التكوينات - المستويات أعلاه. قد تحتوي أدوات التسجيل المختلفة على تكوينات مختلفة حسب حاجتك، ويمكنك أيضًا كتابة ماكرو مخصص للوصول إلى المسجل المخصص. لديك أيضًا وحدات ماكرو مختلفة للتسجيل المطول الموضح في القسم أدناه. فيما يلي مثال بسيط جدًا لاستخدام وحدات الماكرو هذه بعد تهيئة easylogging++.
LOG (INFO) << "This is info log";
CLOG (ERROR, " performance " ) << "This is info log using performance logger";
هناك طريقة أخرى لاستخدام نفس الماكرو، أي LOG
(ووحدات الماكرو المرتبطة به). هذا هو أنك تحدد الماكرو ELPP_DEFAULT_LOGGER
و ELPP_DEFAULT_PERFORMANCE_LOGGER
بمعرف المسجل المسجل بالفعل، والآن عند استخدام ماكرو LOG
، فإنه تلقائيًا سيستخدم المسجل المحدد بدلاً من المسجل default
. يرجى ملاحظة أنه يجب تحديد ذلك في الملف المصدر بدلاً من ملف الرأس. وذلك حتى عندما نقوم بتضمين الرأس، فإننا لا نستخدم مسجلاً غير صالح عن طريق الخطأ.
مثال سريع هنا
# ifndef ELPP_DEFAULT_LOGGER
# define ELPP_DEFAULT_LOGGER " update_manager "
# endif
# ifndef ELPP_DEFAULT_PERFORMANCE_LOGGER
# define ELPP_DEFAULT_PERFORMANCE_LOGGER ELPP_DEFAULT_LOGGER
# endif
# include " easylogging++.h "
UpdateManager::UpdateManager {
_TRACE; // Logs using LOG(TRACE) provided logger is already registered - i.e, update_manager
LOG (INFO) << " This will log using update_manager logger as well " ;
}
# include " easylogging++.h "
UpdateManager::UpdateManager {
_TRACE; // Logs using LOG(TRACE) using default logger because no `ELPP_DEFAULT_LOGGER` is defined unless you have it in makefile
}
يمكنك أيضًا كتابة السجلات باستخدام فئة
Logger
مباشرةً. تتوفر هذه الميزة على المترجمين الذين يدعمون القوالب المتنوعة. يمكنك استكشاف المزيد من خلال النظر إلىsamples/STL/logger-log-functions.cpp
.
انتقل إلى الأعلى
يوفر Easylogging++ جوانب معينة من التسجيل، أحد هذه الجوانب هو التسجيل المشروط، أي أنه سيتم كتابة السجل فقط في حالة استيفاء شرط معين. وهذا مفيد جدًا في بعض المواقف. تنتهي وحدات الماكرو المساعدة بـ _IF؛
LOG_IF(condition, LEVEL)
CLOG_IF(condition, LEVEL, logger ID)
LOG_IF (condition, INFO) << "Logged if condition is true";
LOG_IF ( false , WARNING) << "Never logged";
CLOG_IF ( true , INFO, " performance " ) << "Always logged (performance logger)"
نفس وحدات الماكرو متاحة للتسجيل المطول باستخدام V
في البداية، على سبيل المثال، VLOG_IF
و CVLOG_IF
. راجع قسم التسجيل المطول أدناه للحصول على مزيد من المعلومات. قد يكون لديك شروط معقدة كما تريد اعتمادا على حاجتك.
انتقل إلى الأعلى
يعد التسجيل من حين لآخر جانبًا مفيدًا آخر للتسجيل باستخدام Easylogging++. وهذا يعني أنه سيتم كتابة السجل إذا تم الوصول إليه في أوقات معينة أو جزء من أوقات معينة، على سبيل المثال، كل ضربة عاشرة أو ضربة 100 أو إصابة ثانية. تنتهي وحدات الماكرو المساعدة بـ _EVERY_N
;
LOG_EVERY_N(n, LEVEL)
CLOG_EVERY_N(n, LEVEL, logger ID)
هناك بعض الطرق الأخرى للتسجيل أيضًا بناءً على عدد مرات الدخول. هذه وحدات الماكرو المفيدة هي
LOG_AFTER_N(n, LEVEL)
; السجلات فقط عندما نصل إلى عدد مرات الوصول إلى n
LOG_N_TIMES(n, LEVEL)
; سجلات ن مرات for ( int i = 1 ; i <= 10 ; ++i) {
LOG_EVERY_N ( 2 , INFO) << " Logged every second iter " ;
}
// 5 logs written; 2, 4, 6, 7, 10
for ( int i = 1 ; i <= 10 ; ++i) {
LOG_AFTER_N ( 2 , INFO) << " Log after 2 hits; " << i;
}
// 8 logs written; 3, 4, 5, 6, 7, 8, 9, 10
for ( int i = 1 ; i <= 100 ; ++i) {
LOG_N_TIMES ( 3 , INFO) << " Log only 3 times; " << i;
}
// 3 logs writter; 1, 2, 3
تتوفر نفس إصدارات وحدات الماكرو لوضع
DEBUG
فقط، وتبدأ وحدات الماكرو هذه بـD
(للتصحيح) متبوعًا بنفس الاسم. على سبيل المثال،DLOG
لتسجيل الدخول فقط في وضع التصحيح (على سبيل المثال، عندما يتم تعريف_DEBUG
أو يكونNDEBUG
غير محدد)
انتقل إلى الأعلى
printf
مثل التسجيل بالنسبة للمترجمين الذين يدعمون قوالب C++ 11 المتنوعة، تتوفر القدرة على التسجيل مثل "printf". يتم ذلك باستخدام فئة Logger
. هذه الميزة آمنة للخيط والكتابة (حيث أننا لا نستخدم أي وحدات ماكرو مثل LOG(INFO)
وما إلى ذلك)
ويتم ذلك في خطوتين:
el::Loggers::getLogger(<logger_id>);
الاختلاف الوحيد عن printf
هو أن التسجيل باستخدام هذه الوظائف يتطلب %v
لكل وسيطة (هذا من أجل سلامة النوع)؛ بدلاً من محددات التنسيق المخصصة. يمكنك الهروب من هذا بواسطة %%v
فيما يلي التوقيعات الوظيفية المختلفة:
info(const char*, const T&, const Args&...)
warn(const char*, const T&, const Args&...)
error(const char*, const T&, const Args&...)
debug(const char*, const T&, const Args&...)
fatal(const char*, const T&, const Args&...)
trace(const char*, const T&, const Args&...)
verbose(int vlevel, const char*, const T&, const Args&...)
// Use default logger
el::Logger* defaultLogger = el::Loggers::getLogger( " default " );
// STL logging (`ELPP_STL_LOGGING` should be defined)
std::vector< int > i;
i.push_back( 1 );
defaultLogger-> warn ( " My first ultimate log message %v %v %v " , 123 , 222 , i);
// Escaping
defaultLogger-> info ( " My first ultimate log message %% %%v %v %v " , 123 , 222 );
لن تعمل محددات التنسيق
%file
و%func
%line
و%loc
معprintf
مثل التسجيل.
انتقل إلى الأعلى
يمكنك إرسال رسائلك إلى الشبكة. ولكن سيتعين عليك تنفيذ طريقتك الخاصة باستخدام واجهة برمجة تطبيقات مرسل السجل. لقد كتبنا عينة عمل كاملة لهذا الغرض. يرجى الاطلاع على نموذج الإرسال إلى الشبكة
انتقل إلى الأعلى
يعد التسجيل المطول مفيدًا في كل برنامج لتسجيل معلومات أكثر من المعتاد. مفيد جدًا لاستكشاف الأخطاء وإصلاحها. فيما يلي وحدات ماكرو محددة للتسجيل المطول؛
VLOG(verbose-level)
CVLOG(verbose-level, logger ID)
انتقل إلى الأعلى
يحتوي التسجيل المطول أيضًا على جوانب التسجيل المشروط والعرضي، على سبيل المثال،
VLOG_IF(condition, verbose-level)
CVLOG_IF(condition, verbose-level, loggerID)
VLOG_EVERY_N(n, verbose-level)
CVLOG_EVERY_N(n, verbose-level, loggerID)
VLOG_AFTER_N(n, verbose-level)
CVLOG_AFTER_N(n, verbose-level, loggerID)
VLOG_N_TIMES(n, verbose-level)
CVLOG_N_TIMES(n, verbose-level, loggerID)
انتقل إلى الأعلى
مستوى الإسهاب هو مستوى الإسهاب الذي يمكن أن يتراوح من 1 إلى 9. لن يكون المستوى المطول نشطًا إلا إذا قمت بتعيين وسيطات التطبيق له. يرجى قراءة قسم وسيطات التطبيق لفهم المزيد حول التسجيل المطول.
من أجل تغيير المستوى المطول بشكل سريع، يرجى استخدام Loggers::setVerboseLevel(base::type::VerboseLevel)
المعروفة أيضًا باسم وظيفة Loggers::setVerboseLevel(int)
. (يمكنك التحقق من المستوى المطول الحالي بواسطة Loggers::verboseLevel()
انتقل إلى الأعلى
يمكنك استخدام ماكرو VLOG_IS_ON(verbose-level)
للتحقق مما إذا كان هناك تسجيل معين قيد التشغيل للملف المصدر لمستوى مطول محدد. يؤدي هذا إلى إرجاع قيمة منطقية يمكنك تضمينها في حالة الشرط.
if (VLOG_IS_ON( 2 )) {
// Verbosity level 2 is on for this file
}
انتقل إلى الأعلى
VModule هي وظيفة للتسجيل المطول (كما هو مذكور في الجدول أعلاه) حيث يمكنك تحديد الإسهاب حسب الوحدات النمطية/الملف المصدر. فيما يلي بعض الأمثلة مع الشرح؛ يبدأ أي من vmodule أدناه بـ -vmodule=
ولم يتم تعيين علامة LoggingFlag::DisableVModulesExtensions
. يمكن تعطيل Vmodule بالكامل عن طريق إضافة علامة LoggingFlag::DisableVModules
مثال مع LoggingFlag::AllowVerboseIfModuleNotSpecified
؛
main=3,parser*=4
:
main{.h, .c, .cpp, .cc, .cxx, -inl.h, .hxx, .hpp}
parser{.h, .c, .cpp, .cc, .cxx, -inl.h, .hxx, .hpp}