يقوم LogStashLogger بتوسيع فئة Logger
الخاصة بـ Ruby لتسجيل الدخول مباشرة إلى Logstash. وهو يدعم الكتابة إلى مخرجات مختلفة بتنسيق logstash JSON. يعد هذا تحسينًا على الكتابة إلى ملف أو سجل نظام حيث يمكن لـ Logstash تلقي البيانات المنظمة مباشرة.
يمكن الكتابة مباشرة إلى مستمع logstash عبر اتصال UDP أو TCP/SSL.
يمكن الكتابة إلى ملف أو Redis أو Kafka أو Kinesis أو Firehose أو مقبس Unix أو syslog أو stdout أو stderr.
يمكن للمسجل أن يأخذ رسالة سلسلة، أو تجزئة، أو LogStash::Event
، أو كائن، أو سلسلة JSON كمدخلات.
تتم تعبئة الأحداث تلقائيًا بالرسالة والطابع الزمني والمضيف والخطورة.
يكتب بتنسيق logstash JSON، ولكنه يدعم التنسيقات الأخرى أيضًا.
يمكن الكتابة إلى مخرجات متعددة.
يتم تخزين رسائل السجل مؤقتًا وإعادة إرسالها تلقائيًا في حالة وجود مشكلة في الاتصال.
يتكامل بسهولة مع Rails عبر التكوين.
أضف هذا السطر إلى ملف Gemfile الخاص بالتطبيق الخاص بك:
gem 'logstash-logger'
ومن ثم تنفيذ:
$ bundle
أو قم بتثبيته بنفسك على النحو التالي:
$ gem install logstash-logger
تتطلب 'logstash-logger'# الإعدادات الافتراضية لـ UDP على 0.0.0.0logger = LogStashLogger.new(port: 5228)# حدد المضيف والنوع (UDP أو TCP) بوضوحudp_logger = LogStashLogger.new(type: :udp, host: 'localhost' المنفذ: 5228)tcp_logger = LogStashLogger.new(النوع: :tcp, host: 'localhost', port: 5229)# أنواع أخرى من loggersfile_logger = LogStashLogger.new(type: :file, path: 'log/development.log', sync: true)unix_logger = LogStashLogger.new(type: :unix، المسار: '/tmp/sock')syslog_logger = LogStashLogger.new(type: :syslog)redis_logger = LogStashLogger.new(type: :redis)kafka_logger = LogStashLogger.new(type: :kafka)stdout_logger = LogStashLogger.new(type: :stdout)stderr_logger = LogStashLogger.new(type: :stderr)io_logger = LogStashLogger .new(النوع: :io, io: io)# استخدم formattercee_logger مختلفًا = LogStashLogger.new( النوع: :تكب، المضيف: "logsene-receiver-syslog.sematext.com"، المنفذ: 514, المنسق: :cee_syslog)custom_formatted_logger = LogStashLogger.new( النوع: :ريديس، المنسق: MyCustomFormatter)lambda_formatted_logger = LogStashLogger.new( النوع: :stdout، المنسق: ->(الخطورة، الوقت، اسم البرنامج، الرسالة) { "[#{progname}] #{msg}" })ruby_default_formatter_logger = LogStashLogger.new( النوع: :ملف، المسار: "سجل/development.log"، formatter: ::Logger::Formatter)# إرسال رسائل إلى مخرجات متعددة. سيكون لكل مخرج نفس التنسيق. # لا يمكن أن يكون Syslog مخرجًا لأنه يتطلب مسجلاً منفصلاً.multi_delegating_logger = LogStashLogger.new( النوع: :multi_delegator، المخرجات: [{ النوع: :ملف، المسار: 'log/development.log' }،{ النوع: :udp، المضيف: 'localhost'، المنفذ: 5228 } ])# موازنة الرسائل بين عدة مخرجات.# يعمل بنفس طريقة عمل المفوض المتعدد، ولكنه يختار عشوائيًا مخرجًا لإرسال كل رسالة.balancer_logger = LogStashLogger.new( النوع: :موازن، المخرجات: [{ النوع: :udp، المضيف: 'host1'، المنفذ: 5228 }، { النوع: :udp، المضيف: 'host2'، المنفذ: 5228 } ])# أرسل رسائل إلى عدة مسجلين.# استخدم هذا إذا كنت تريد إرسال تنسيقات مختلفة إلى مخرجات مختلفة.# إذا كنت بحاجة إلى تسجيل الدخول إلى سجل النظام، فيجب عليك استخدام this.multi_logger = LogStashLogger.new( النوع: :multi_logger، المخرجات: [{ النوع: :ملف، المسار: 'log/development.log'، المنسق: ::Logger::Formatter }، { النوع: :tcp، المضيف: 'localhost'، المنفذ: 5228، المنسق: :json } ])# تتم كتابة الرسائل التالية على منفذ UDP رقم 5228:logger.info 'test'# {"message":test"،@timestamp":":2014-05-22T09:37:19.204-07:00"، "@version":":"1"، "severity": "INFO"، "host": "[hostname]"}logger.error '{"message": "error"}'# {"message "": "خطأ"، "@timestamp": "2014-05-22T10:10:55.877-07:00"،@version":"1"، "severity": "ERROR"، "المضيف" :"[اسم المضيف]"}رسالة logger.debug: 'test'، foo: 'bar'# {"message": "test"، "foo": "bar"، "@timestamp": "2014-05-22T09:43:24.004-07:00"،@version": "1"، "الخطورة" :"DEBUG"، "host": "[hostname]"}logger.warn LogStash::Event.new(message: 'test', foo: 'bar')# {"message": "test"، "foo": "bar"، "@timestamp": "2014-05-22T16:44:37.364Z"،@version":"1"، "severity": "تحذير" ""، "host": "[hostname]"}# Tagged logginglogger.tagged('foo') { logger.fatal('bar') }# {"message": "bar"، "@timestamp": "2014-05-26T20:35:14.685-07:00"،@version":"1"، "severity": "FATAL"، "host" :"[اسم المضيف]"،"العلامات":["foo"]}
يمكنك استخدام URI لتكوين مسجل logstash الخاص بك بدلاً من التجزئة. يعد هذا مفيدًا في بيئات مثل Heroku حيث قد ترغب في قراءة قيم التكوين من البيئة. مخطط URI هو type://host:port/path?key=value
. بعض نماذج تكوينات URI موضحة أدناه.
udp://localhost:5228 tcp://localhost:5229 unix:///tmp/socket file:///path/to/file redis://localhost:6379 kafka://localhost:9092 stdout:/ stderr:/
قم بتمرير URI إلى مسجل logstash الخاص بك كما يلي:
# اقرأ URI من متغير البيئة = LogStashLogger.new(uri: ENV['LOGSTASH_URI'])
لكي يتمكن logstash من استقبال الأحداث وتحليلها بشكل صحيح، ستحتاج إلى تكوين وتشغيل مستمع يستخدم برنامج الترميز json_lines
. على سبيل المثال، لتلقي الأحداث عبر UDP على المنفذ 5228:
مدخل { UDP {المضيف => "0.0.0.0" المنفذ => 5228codec => json_lines }}
يجب أن تستخدم مدخلات الملف وRedis برنامج الترميز json
بدلاً من ذلك. لمزيد من المعلومات، اقرأ مستندات Logstash.
راجع دليل العينات لمزيد من نماذج التكوين.
إذا كنت تستخدم TCP، فهناك خيار إضافة شهادة SSL إلى تجزئة الخيارات عند التهيئة.
LogStashLogger.new(النوع: :tcp، المنفذ: 5228، ssl_certificate: "/path/to/certificate.crt")
يمكن إنشاء شهادة ومفتاح SSL باستخدام
openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout logstash.key -out logstash.crt
يمكنك أيضًا تمكين SSL بدون شهادة:
LogStashLogger.new (النوع: :tcp، المنفذ: 5228، ssl_enable: صحيح)
حدد سياق SSL للحصول على مزيد من التحكم في السلوك. على سبيل المثال، قم بتعيين وضع التحقق:
ctx = OpenSSL::SSL::SSLContext.newctx.set_params(verify_mode: OpenSSL::SSL::VERIFY_NONE)LogStashLogger.new(النوع: :tcp، المنفذ: 5228، ssl_context: ctx)
تكوين Logstash التالي مطلوب لـ SSL:
مدخل { tcp {host => "0.0.0.0"port => 5228codec => json_linesssl_enable => truessl_cert => "/path/to/certificate.crt"ssl_key => "/path/to/key.key" }}
يتم تمكين التحقق من اسم المضيف بشكل افتراضي. بدون مزيد من التكوين، سيتم استخدام اسم المضيف المقدم إلى :host
للتحقق من هوية شهادة الخادم.
إذا لم تقم بتمرير :ssl_context
أو تمرير قيمة خاطئة إلى خيار :verify_hostname
، فلن يتم التحقق من اسم المضيف.
تحقق من اسم المضيف من خيار :host
ctx = OpenSSL::SSL::SSLContext.newctx.cert = '/path/to/cert.pem'ctx.verify_mode = OpenSSL::SSL::VERIFY_PEERLogStashLogger.new النوع: :تكب، المضيف: "logstash.example.com" المنفذ: 5228، ssl_context: ctx
تحقق من اسم مضيف مختلف عن خيار :host
LogStashLogger.new النوع: :تكب، المضيف: '1.2.3.4' المنفذ: 5228، ssl_context: CTX، اسم المضيف التحقق: "server.example.com"
قم بتعطيل التحقق من اسم المضيف بشكل صريح
LogStashLogger.new النوع: :تكب، المضيف: '1.2.3.4' المنفذ: 5228، ssl_context: CTX، اسم المضيف التحقق: خطأ
سيقوم LogStashLogger
افتراضيًا بتسجيل كائن JSON بالتنسيق أدناه.
{ "message": "بعض الرسائل"، "@timestamp": "2015-01-29T10:43:32.196-05:00"، "@version": "1"، "الخطورة": "INFO"، "المضيف" المضيف "اسم"}
قد تحتاج بعض التطبيقات إلى إرفاق بيانات تعريف إضافية بكل رسالة. يمكن معالجة LogStash::Event
مباشرة عن طريق تحديد كتلة customize_event
في تكوين LogStashLogger
.
config = LogStashLogger.configure |config| config.customize_event do |event|event["other_field"] = "some_other_value" نهاية
سيؤدي هذا التكوين إلى الإخراج التالي.
{"message": "بعض الرسائل"،@timestamp": "2015-01-29T10:43:32.196-05:00"،@version": "1"، "الخطورة": "معلومات"، "مضيف" ": "اسم المضيف"، "other_field": "some_other_value"}
تتمتع هذه الكتلة بحق الوصول الكامل إلى الحدث، لذا يمكنك إزالة الحقول وتعديل الحقول الموجودة وما إلى ذلك. على سبيل المثال، لإزالة الطابع الزمني الافتراضي:
config = LogStashLogger.configure |config| config.customize_event تفعل |الحدث|event.remove('@timestamp') نهاية
يمكنك أيضًا تخصيص الأحداث على أساس كل مُسجل عن طريق تمرير كائن قابل للاستدعاء (lambda أو proc) إلى خيار customize_event
عند إنشاء مُسجل:
LogStashLogger.new(customize_event: ->(event){ events['other_field'] = 'other_field' })
بالنسبة للأجهزة التي تقوم بإنشاء اتصال بخدمة عن بعد، يتم تخزين رسائل السجل مؤقتًا داخليًا ويتم مسحها في سلسلة محادثات في الخلفية. في حالة وجود مشكلة في الاتصال، يتم الاحتفاظ بالرسائل في المخزن المؤقت ويتم إعادة إرسالها تلقائيًا حتى تتم العملية بنجاح. ستقوم المخرجات التي تدعم الكتابة المجمعة (Redis وKafka) بكتابة رسائل السجل بشكل مجمّع من المخزن المؤقت. يتم تنفيذ هذه الوظيفة باستخدام شوكة Stud::Buffer. يمكنك تكوين سلوكه عن طريق تمرير الخيارات التالية إلى LogStashLogger:
:buffer_max_items - الحد الأقصى لعدد العناصر التي سيتم تخزينها مؤقتًا قبل التنظيف. الافتراضي إلى 50.
:buffer_max_interval - أقصى عدد من الثواني للانتظار بين عمليات التدفق. الافتراضي إلى 5.
:drop_messages_on_flush_error - قم بإسقاط الرسائل عند وجود خطأ في التدفق. الافتراضيات كاذبة.
:drop_messages_on_full_buffer - قم بإسقاط الرسائل عندما يكون المخزن المؤقت ممتلئًا. الافتراضيات إلى صحيح.
:sync - يقوم بمسح المخزن المؤقت في كل مرة يتم فيها تلقي رسالة (حظر). الافتراضيات كاذبة.
:buffer_flush_at_exit - تدفق الرسائل عند الخروج من البرنامج. الافتراضيات إلى صحيح.
:buffer_logger - مسجل لكتابة رسائل تصحيح/خطأ المخزن المؤقت إليه. الافتراضات إلى لا شيء.
يمكنك إيقاف تشغيل التخزين المؤقت عن طريق ضبط sync = true
.
يرجى العلم بالتحذيرات التالية لهذا السلوك:
من الممكن إرسال رسائل سجل مكررة عند إعادة المحاولة. بالنسبة للمخرجات مثل Redis وKafka التي يتم كتابتها على دفعات، يمكن إعادة إرسال الدفعة بأكملها. إذا كانت هذه مشكلة، يمكنك إضافة حقل UUID إلى كل حدث لتعريفه بشكل فريد. يمكنك إما القيام بذلك في كتلة customize_event
، أو باستخدام مرشح UUID الخاص بـ logstash.
لا يزال من الممكن فقدان رسائل السجل. لن يكتشف روبي مشكلة اتصال TCP/UDP على الفور. في الاختبار الذي أجريته، استغرق الأمر من روبي حوالي 4 ثوانٍ لتلاحظ أن الطرف المتلقي كان معطلاً وتبدأ في رفع الاستثناءات. نظرًا لأن مستمعي logstash عبر TCP/UDP لا يتعرفون على الرسائل المستلمة، فمن غير الممكن معرفة رسائل السجل التي سيتم إعادة إرسالها.
عند إيقاف تشغيل sync
، قد تقوم روبي بتخزين البيانات داخليًا قبل الكتابة إلى جهاز الإدخال/الإخراج. ولهذا السبب قد لا ترى الرسائل المكتوبة على الفور إلى مقبس UDP أو TCP، على الرغم من مسح المخزن المؤقت لـ LogStashLogger بشكل دوري.
افتراضيًا، يتم تجاهل الرسائل عند امتلاء المخزن المؤقت. يمكن أن يحدث هذا إذا كان مصدر الإخراج معطلاً لفترة طويلة جدًا أو يتم تلقي رسائل السجل بسرعة كبيرة جدًا. إذا تم إنهاء تطبيقك فجأة (على سبيل المثال، بسبب SIGKILL أو انقطاع التيار الكهربائي)، فسيتم فقدان المخزن المؤقت بالكامل.
يمكنك تقليل احتمالية فقدان الرسالة عن طريق زيادة buffer_max_items
(بحيث يمكن الاحتفاظ بمزيد من الأحداث في المخزن المؤقت)، وتقليل buffer_max_interval
(للانتظار وقتًا أقل بين عمليات التدفق). سيؤدي هذا إلى زيادة ضغط الذاكرة على تطبيقك حيث تتراكم رسائل السجل في المخزن المؤقت، لذا تأكد من تخصيص ذاكرة كافية لعمليتك.
إذا كنت لا تريد فقدان الرسائل عند امتلاء المخزن المؤقت، فيمكنك تعيين drop_messages_on_full_buffer = false
. لاحظ أنه إذا امتلأ المخزن المؤقت، فسيتم حظر أي رسالة سجل واردة، وهو ما قد يكون غير مرغوب فيه.
تدعم كافة مخرجات المسجل إعداد sync
. وهذا مشابه لإعداد "وضع المزامنة" على كائنات Ruby IO. عند التعيين على true
، يتم مسح الإخراج على الفور ولا يتم تخزينه مؤقتًا داخليًا. عادةً، بالنسبة للأجهزة التي تتصل بخدمة عن بعد، يعد التخزين المؤقت أمرًا جيدًا لأنه يحسن الأداء ويقلل من احتمالية حدوث أخطاء تؤثر على البرنامج. بالنسبة لهذه الأجهزة، تكون قيمة sync
هي false
، ويوصى بترك القيمة الافتراضية. قد ترغب في تشغيل وضع المزامنة للاختبار، على سبيل المثال، إذا كنت تريد رؤية رسائل السجل مباشرة بعد كتابتها.
يوصى بتشغيل وضع المزامنة للملفات ومخرجات مقبس Unix. وهذا يضمن كتابة رسائل السجل من سلاسل العمليات أو العمليات المختلفة بشكل صحيح على أسطر منفصلة.
انظر رقم 44 لمزيد من التفاصيل.
في حالة حدوث استثناء أثناء كتابة رسالة إلى الجهاز، يتم تسجيل الاستثناء باستخدام مسجل داخلي. بشكل افتراضي، يقوم هذا بتسجيل الدخول إلى $stderr. يمكنك تغيير مسجل الأخطاء عن طريق تعيين LogStashLogger.configuration.default_error_logger
أو عن طريق تمرير كائن المسجل الخاص بك في مفتاح التكوين :error_logger
عند إنشاء مثيل LogStashLogger.
يوفر LogStashLogger الدعم لإسكات المسجل على نمط Rails. تم استخراج التنفيذ من Rails، ولكن ليس له تبعيات، لذا يمكن استخدامه خارج تطبيق Rails. الواجهة هي نفسها الموجودة في Rails:
logger.silence(temporary_level) افعل ...نهاية
بشكل افتراضي، يقوم LogStashLogger بإنشاء مُسجل يمتد إلى فئة Logger
المضمنة في Ruby. إذا كنت تحتاج إلى تنفيذ مُسجل مختلف، فيمكنك استخدام فئة مختلفة عن طريق تمرير الفئة باستخدام خيار logger_class
.
لاحظ أنه بالنسبة لسجل النظام، فإن فئة Syslog::Logger
مطلوبة ولا يمكن تغييرها.
يدعم القضبان 4.2 و5.x.
افتراضيًا، ستتم كتابة كل رسالة سجل ريلز إلى logstash بتنسيق LogStash::Event
JSON.
للحصول على الحد الأدنى من أحداث logstash الأكثر تنظيمًا، جرب أحد العناصر التالية:
سجل
يارد
تقوم هذه الأحجار الكريمة حاليًا بإخراج سلسلة JSON، والتي يقوم LogStashLogger بعد ذلك بتحليلها. من المحتمل أن تتمتع الإصدارات المستقبلية من هذه الأحجار الكريمة بتكامل أعمق مع LogStashLogger (على سبيل المثال، عن طريق كتابة كائنات LogStash::Event
مباشرة).
أضف ما يلي إلى config/environments/production.rb
:
# اختياري، يضبط Rails القيمة الافتراضية على :infoconfig.log_level = :debug# اختياري، إعدادات Rails 4 الافتراضية هي true في التطوير وfalse في productionconfig.autoflush_log = true# اختياري، استخدم URI للتكوين. مفيد في Herokuconfig.logstash.uri = ENV['LOGSTASH_URI']# اختياري. الافتراضي هو :json_lines. إذا كان هناك عدة مخرجات،# فسوف تشترك جميعها في نفس formatter.config.logstash.formatter = :json_lines# اختياري، المُسجل الذي سيتم تسجيل أخطاء الكتابة إليه. الإعدادات الافتراضية هي تسجيل الدخول إلى $stderrconfig.logstash.error_logger = Logger.new($stderr)# اختياري، الحد الأقصى لعدد العناصر التي سيتم تخزينها مؤقتًا قبل التنظيف. الإعدادات الافتراضية هي 50config.logstash.buffer_max_items = 50# اختياري، أقصى عدد من الثواني للانتظار بين عمليات التدفق. الإعدادات الافتراضية هي 5config.logstash.buffer_max_interval = 5# اختياري، قم بإسقاط الرسالة عند حدوث خطأ في الاتصال. الإعدادات الافتراضية هي falseconfig.logstash.drop_messages_on_flush_error = false# اختياري، قم بإسقاط الرسائل عندما يكون المخزن المؤقت ممتلئًا. الإعدادات الافتراضية هي trueconfig.logstash.drop_messages_on_full_buffer = true
# اختياري، الافتراضي هو '0.0.0.0'config.logstash.host = 'localhost'# اختياري، الافتراضي هو :udp.config.logstash.type = :udp# مطلوب، المنفذ للاتصال بـconfig.logstash.port = 5228
# اختياري، الإعداد الافتراضي هو '0.0.0.0'config.logstash.host = 'localhost'# مطلوب، المنفذ للاتصال بـconfig.logstash.port = 5228# Requiredconfig.logstash.type = :tcp# اختياري، يمكّن SSLconfig.logstash. ssl_enable = صحيح
# Requiredconfig.logstash.type = :unix# Requiredconfig.logstash.path = '/tmp/sock'
إذا كنت تستخدم الإصدار Ruby 1.9، فأضف Syslog::Logger
v2 إلى ملف Gemfile الخاص بك:
gem 'SyslogLogger', '2.0'
إذا كنت تستخدم Ruby 2+، Syslog::Logger
مدمج بالفعل في المكتبة القياسية.
# Requiredconfig.logstash.type = :syslog# اختياري. الإعدادات الافتراضية هي 'ruby'config.logstash.program_name = 'MyApp'# مستوى المنشأة الافتراضي الاختياري. يعمل فقط في Ruby 2+config.logstash.facility = Syslog::LOG_LOCAL0
أضف جوهرة redis إلى ملف Gemfile الخاص بك:
gem 'redis'
# Requiredconfig.logstash.type = :redis# اختياري، سيكون افتراضيًا في قائمة 'logstash' config.logstash.list = 'logstash'# يتم تمرير جميع الخيارات الأخرى إلى عميل Redis# تشمل الخيارات المدعومة المضيف والمنفذ والمسار وكلمة المرور ، url# مثال:# اختياري، سيكون Redis هو المنفذ الافتراضي localhostconfig.logstash.host = 'localhost'# اختياري، سيكون Redis هو المنفذ الافتراضي 6379config.logstash.port = 6379
أضف جوهرة بوسيدون إلى ملف Gemfile الخاص بك:
gem 'poseidon'
# Requiredconfig.logstash.type = :kafka# اختياري، سيكون افتراضيًا إلى 'logstash' subjectconfig.logstash.path = 'logstash'# اختياري، سيكون افتراضيًا إلى 'logstash-logger' Producerconfig.logstash.producer = 'logstash-logger '# اختياري، سيكون الإعداد الافتراضي هو localhost:9092 host/portconfig.logstash.hosts = ['localhost:9092']# اختياري، سوف الافتراضي هو 1s backoffconfig.logstash.backoff = 1
أضف جوهرة aws-sdk إلى ملف Gemfile الخاص بك:
# aws-sdk >= 3.0 gem 'aws-sdk-kinesis' # aws-sdk < 3.0 gem 'aws-sdk'
# Requiredconfig.logstash.type = :kinesis# اختياري، سيكون افتراضيًا إلى 'logstash'streamconfig.logstash.stream = 'my-stream-name'# اختياري، سيكون افتراضيًا إلى 'us-east-1'config.logstash.aws_region = 'us-west-2'# اختياري، سيكون متغير البيئة AWS_ACCESS_KEY_ID افتراضيًاconfig.logstash.aws_access_key_id = 'ASKASKHLD12341'# اختياري، سيكون الإعداد الافتراضي لبيئة AWS_SECRET_ACCESS_KEY متغيرconfig.logstash.aws_secret_access_key = 'ASKASKHLD1234123412341234'
أضف جوهرة aws-sdk إلى ملف Gemfile الخاص بك:
# aws-sdk >= 3.0 gem 'aws-sdk-firehose' # aws-sdk < 3.0 gem 'aws-sdk'
# Requiredconfig.logstash.type = :firehose# اختياري، سيكون افتراضيًا لتسليم "logstash"streamconfig.logstash.stream = 'my-stream-name'# اختياري، سيكون افتراضيًا لتكوين منطقة AWS الافتراضية chainconfig.logstash.aws_region = ' us-west-2'# اختياري، سيكون افتراضيًا هو موفر بيانات الاعتماد الافتراضي لـ AWS chainconfig.logstash.aws_access_key_id = 'ASKASKHLD12341'# اختياري، سيكون افتراضيًا موفر بيانات الاعتماد الافتراضي لـ AWS chainconfig.logstash.aws_secret_access_key = 'ASKASKHLD1234123412341234'
# Requiredconfig.logstash.type = :file# اختياري، الإعداد الافتراضي هو سجل Rails pathconfig.logstash.path = 'log/production.log'
# Requiredconfig.logstash.type = :io# Requiredconfig.logstash.io = io
# Requiredconfig.logstash.type = :multi_delegator# Requiredconfig.logstash.outputs = [ {النوع: :ملف، المسار: "سجل/production.log" }, {النوع: :udp، المنفذ: 5228، المضيف: "المضيف المحلي" }]
# Requiredconfig.logstash.type = :multi_logger# مطلوب. قد يكون لكل مسجل formatter.config.logstash.outputs الخاص به = [ {النوع: :ملف، المسار: 'log/production.log'، المنسق: ::Logger::Formatter }, {النوع: :udp، المنفذ: 5228، المضيف: "المضيف المحلي" }]
في تطبيقات الويب، يمكنك تسجيل البيانات من طلبات HTTP (مثل الرؤوس) باستخدام البرنامج الوسيط RequestStore. المثال التالي يفترض Rails.
# في Gemfilegem "request_store"
# في application.rbLogStashLogger.configure |config| config.customize_event do |event|event["session_id"] = RequestStore.store[:load_balancer_session_id] نهاية
# في التطبيق/وحدات التحكم/application_controller.rbbefore_filter:track_load_balancer_session_iddef المسار_load_balancer_session_id RequestStore.store[:load_balancer_session_id] = request.headers["X-LOADBALANCER-SESSIONID"]end
إذا تشعب تطبيقك (كما هو شائع في العديد من خوادم الويب)، فستحتاج إلى إدارة تنظيف الموارد في مثيلات LogStashLogger الخاصة بك. طريقة المثيل #reset
متاحة لهذا الغرض. فيما يلي نموذج لتكوين العديد من خوادم الويب الشائعة المستخدمة مع Rails:
راكب:
::PhusionPassenger.on_event(:starting_worker_process) تفعل |متشعب| Rails.logger.resetend
بوما:
# في config/puma.rbon_worker_boot افعل ذلك Rails.logger.resetend
يونيكورن
# في ملف config/unicorn.rbafter_fork، قم بتنفيذ |الخادم، العامل| Rails.logger.resetend
تم التحقق للعمل مع:
التصوير بالرنين المغناطيسي روبي 2.2 - 2.5
جي روبي 9.x
روبينيوس
إصدارات Ruby <2.2 تم تحديثها بموسوعة الحياة ولم تعد مدعومة.
يعتمد ذلك على احتياجاتك الخاصة، ولكن معظم التطبيقات يجب أن تستخدم الإعداد الافتراضي (UDP). وإليك مميزات وعيوب كل نوع:
UDP أسرع من TCP لأنه غير متزامن (إطلاق النار والنسيان). ومع ذلك، هذا يعني أنه قد يتم إسقاط رسائل السجل. هذا جيد للعديد من التطبيقات.
يتحقق TCP من استلام كل رسالة عبر اتصال ثنائي الاتجاه. كما أنه يدعم SSL للنقل الآمن لرسائل السجل عبر الشبكة. قد يؤدي هذا إلى إبطاء تطبيقك إلى حد الزحف إذا كان مستمع TCP تحت حمل ثقيل.
الملف سهل الاستخدام، ولكن لا داعي للقلق بشأن تدوير السجل ونفاد مساحة القرص.
تعد الكتابة إلى مقبس Unix أسرع من الكتابة إلى منفذ TCP أو UDP، ولكنها تعمل محليًا فقط.
تعد الكتابة إلى Redis أمرًا جيدًا للإعدادات الموزعة التي تولد عددًا كبيرًا من السجلات. ومع ذلك، سيكون لديك جزء متحرك آخر ويجب أن تقلق بشأن نفاد ذاكرة Redis.
يوصى بالكتابة إلى stdout فقط لأغراض التصحيح.
للحصول على مناقشة أكثر تفصيلاً حول UDP مقابل TCP، أوصي بقراءة هذا المقال: UDP مقابل TCP
إذا كنت تستخدم جهازًا مدعومًا بكائن Ruby IO (مثل ملف أو مقبس UDP أو مقبس TCP)، فيرجى العلم أن Ruby يحتفظ بمخزن مؤقت داخلي خاص به. على الرغم من حقيقة أن LogStashLogger يقوم بتخزين الرسائل مؤقتًا ومسحها بشكل دوري، إلا أن البيانات المكتوبة إلى كائن الإدخال/الإخراج يمكن تخزينها مؤقتًا بواسطة روبي داخليًا إلى أجل غير مسمى، وقد لا يتم كتابتها حتى ينتهي البرنامج. إذا كان هذا يزعجك أو إذا كنت بحاجة إلى رؤية رسائل السجل على الفور، فإن خيارك الوحيد هو تعيين خيار sync: true
.
من المحتمل أن تطبيقك يحاول تسجيل بيانات غير مشفرة بطريقة صحيحة. عندما يحدث هذا، ستثير مكتبة JSON القياسية الخاصة بـ Ruby استثناءً. قد تتمكن من التغلب على ذلك عن طريق تبديل برنامج تشفير JSON مختلف مثل Oj. استخدم جوهرة oj_mimic_json لاستخدام Oj لإنشاء JSON.
توصي Heroku بتثبيت Rails_12factor بحيث يتم إرسال السجلات إلى STDOUT. لسوء الحظ، يؤدي هذا إلى تجاوز LogStashLogger، مما يمنع إرسال السجلات إلى الوجهة التي تم تكوينها. الحل هو إزالة rails_12factor
من ملف Gemfile الخاص بك.
هذه على الأرجح ليست مشكلة في LogStashLogger، ولكنها جوهرة مختلفة تغير مستوى السجل لـ Rails.logger
. هذا محتمل بشكل خاص إذا كنت تستخدم خادمًا مترابطة مثل Puma، نظرًا لأن الأحجار الكريمة غالبًا ما تغير مستوى سجل Rails.logger
بطريقة غير آمنة للسلسلة. انظر رقم 17 لمزيد من المعلومات.
إذا كنت تستخدم مخرجات UDP وتكتب إلى مستمع logstash، فمن المرجح أنك تواجه خطأً في تنفيذ UDP لمستمع logstash. لا يوجد أي إصلاح معروف في هذا الوقت. انظر رقم 43 لمزيد من المعلومات.
من العيوب المعروفة لاستخدام TCP أو UDP هو الحد الأقصى البالغ 65535 بايت على إجمالي حجم الرسالة. للتغلب على هذه المشكلة، سيتعين عليك اقتطاع الرسالة عن طريق تعيين الحد الأقصى لحجم الرسالة:
LogStashLogger.configure |config| config.max_message_size = 2000end
سيؤدي هذا إلى اقتطاع حقل message
الخاص بحدث LogStash فقط. لذا تأكد من ضبط الحد الأقصى لحجم الرسالة على أقل بكثير من 65535 بايت لإفساح المجال للحقول الأخرى.
لم تعد Rails 3.2 وMRI Ruby < 2.2 وJRuby 1.7 مدعومة، حيث تم تحديثها في EOL. إذا كنت تستخدم إصدارًا أقدم من Ruby، فستحتاج إلى استخدام الإصدار 0.24 أو أقل.
تم استبدال مفتاح الحدث source
host
ليتوافق بشكل أفضل مع أحدث سجل.
تم إهمال مُنشئ (host, port, type)
لصالح مُنشئ تجزئة الخيارات.
يستخدم LogStash::Event
تنسيق v1 بدءًا من الإصدار 1.2+. إذا كنت تستخدم الإصدار 1، فستحتاج إلى تثبيت الإصدار 0.4+ من LogStashLogger. هذا غير متوافق مع الإصدار القديم LogStash::Event
v1.1.5، والذي يستخدم التنسيق v0.
الإصدارات السابقة من هذه الجوهرة (<= 0.2.1) نفذت اتصال TCP فقط. الإصدارات الأحدث (>= 0.3) تطبق أيضًا UDP، وتستخدمه كإعداد افتراضي جديد. يرجى العلم إذا كنت تستخدم المنشئ الافتراضي وما زلت بحاجة إلى TCP، فيجب عليك إضافة وسيطة إضافية:
# الآن الافتراضي هو UDP بدلاً من TCPlogger = LogStashLogger.new('localhost', 5228)# حدد TCP بشكل صريح بدلاً من UDPlogger = LogStashLogger.new('localhost', 5228, :tcp)
ديفيد بتلر
pctj101
غاري ريني
نيك اثير
آرون مابري
جان شولت
كورت بريستون
كريس بلاتشلي
فيليكس بيكشتاين
فاديم كازاكوف
أنيل ريمتولا
نيكيتا فوروبي
fireboy1919
مايك جوندرلوي
فيتالي جوروديتسكي
كورتلاند كالدويل
بيبيك شريستا
اليكس يانوس
كريج ريد
جلازج
بن لان
جواو فرنانديز
CoolElvis
سيرجي بيانكوف
أليك هوي
أليكسي كراسنوبروف
غابرييل دي أوليفيرا
فلاديسلاف سيابروك
ماتوس فاكولا
شوكة ذلك
قم بإنشاء فرع الميزات الخاص بك ( git checkout -b my-new-feature
)
تنفيذ تغييراتك ( git commit -am 'Add some feature'
)
ادفع إلى الفرع ( git push origin my-new-feature
)
إنشاء طلب سحب جديد