কম্পিউটার

Logger এবং Lograge সঙ্গে রুবি লগ ইন করুন

রুবিতে লগের সাথে কাজ করা

লগিং হল প্রাথমিক কাজগুলির মধ্যে একটি যা একটি অ্যাপ্লিকেশন সাধারণত সম্বোধন করে। লগ ব্যবহার করা হয় যখন আপনার প্রয়োজন হয়, উদাহরণস্বরূপ,

  • আপনার অ্যাপের ভিতরে কী ঘটছে তা দেখুন,
  • তাদের মনিটর করুন, অথবা
  • কিছু ​​নির্দিষ্ট ডেটার জন্য মেট্রিক্স সংগ্রহ করুন।

একটি নতুন প্রোগ্রামিং ভাষা শেখার সময়, তথ্য লগ করার প্রথম সুস্পষ্ট বাছাই হল নেটিভ মেকানিজম। এটি সাধারণত সহজ, নথিভুক্ত এবং সমগ্র সম্প্রদায় জুড়ে ভালভাবে ছড়িয়ে পড়ে৷

লগ ডেটা কোম্পানি, ব্যবসা এবং আপনি যে অ্যাপ্লিকেশনের সাথে কাজ করছেন তার উপর নির্ভর করে অনেক পরিবর্তিত হয়। অতএব, আপনি এবং আপনার দল যে লগিং সমাধানটি বেছে নিয়েছেন তা কীভাবে এর সামগ্রিক ব্যবহারকে প্রভাবিত করবে তা বোঝা খুবই গুরুত্বপূর্ণ৷

এই নিবন্ধে, আমরা রুবি এবং রেলের জন্য লগিং করার উপলব্ধ বিকল্পগুলির মাধ্যমে একটি যাত্রা করব, অন্তর্নির্মিতগুলি থেকে প্রিয় তৃতীয়-পক্ষের কমিউনিটি ফ্রেমওয়ার্ক পর্যন্ত। চলুন!

রুবির অন্তর্নির্মিত বিকল্পগুলি

লগিং পরিচালনা করার জন্য রুবি দুটি অন্তর্নির্মিত বিকল্পের সাথে আসে:প্রিন্টিং কমান্ড (বিশেষভাবে কমান্ড-লাইন পরিস্থিতির জন্য ডিজাইন করা হয়েছে) এবং লগার ক্লাস।

আসুন সেগুলিকে একটু অন্বেষণ করি৷

কনসোলে মুদ্রণ

রুবির কাছে কনসোলে পাঠ্য মুদ্রণের চারটি সাধারণ উপায় রয়েছে:puts , print , p , এবং pp .

puts পদ্ধতিতে আপনি যা পাস করেন তা মুদ্রণ করে, তার পরে একটি নতুন লাইন:

2.7.0 :001 > puts "Hey, I'm a log!"
Hey, I'm a log!
 => nil

print পদ্ধতি puts এর মত , তবে এটি সর্বদা to_s ব্যবহার করে আর্গুমেন্টকে স্ট্রিংয়ে রূপান্তর করে পদ্ধতি।

অবশেষে, p এবং pp উভয় পদ্ধতিই রূপান্তর না করেই আপনি যে কাঁচা বস্তুটি তাদের কাছে দিচ্ছেন তা মুদ্রণ করবে; একমাত্র পার্থক্য হল যে পরেরটি আউটপুটকে আরও ইন্ডেন্ট করে ফর্ম্যাট করে, যখন আগেরটি করে না৷

অ্যাপ্লিকেশন লগ

সার্ভারে চলমান অ্যাপ্লিকেশানগুলির জন্য, কনসোলে প্রিন্ট করার কোন মানে হয় না৷

পরিবর্তে, আমরা Logger ব্যবহার করি ক্লাস, যা অনেক বেশি নমনীয়।

একটি "ডিবাগ" লগ প্রিন্ট করার জন্য আপনি কীভাবে এটি ব্যবহার করতে পারেন তা এখানে:

require "logger"
logger = Logger.new(STDOUT)
logger.debug("I'm a debug log")

আমরা লগগুলিকে একটি ফাইলে সংরক্ষণ করার জন্য এটিকে কনফিগার করতে পারি, অথবা আমরা চাইলে STDOUT এ প্রিন্ট করার পরিবর্তে একটি লগ এগ্রিগেটরে পাঠাতে পারি৷

যদি আপনি ভাবছেন, "ডিবাগ" একটি লগ স্তর। লগ স্তরগুলি আপনাকে সিস্টেমকে বলতে দেয় "এই লগ বার্তাটি একটি নির্দিষ্ট ধরণের ইভেন্টের সাথে সম্পর্কিত।" ছয়টি অন্তর্নির্মিত লগ স্তর রয়েছে:মারাত্মক, ত্রুটি, সতর্কতা, তথ্য, ডিবাগ এবং অজানা৷

logger.debug("I'm a debug log")
logger.info("I'm an info log")
logger.warn("I'm a warn log")
logger.error("I'm an error log: error message")
logger.fatal("I'm a fatal log")

যখন আমরা লগ আউটপুট দেখি, আমরা দেখতে পাই যে প্রতিটি লাইনে লগ লেভেল, প্রসেস আইডি এবং টাইমস্ট্যাম্প যুক্ত করা হয়েছে:

Logger এবং Lograge সঙ্গে রুবি লগ ইন করুন

আরেকটি দুর্দান্ত বৈশিষ্ট্য হল আপনার Logger সেট করার ক্ষমতা একটি নির্দিষ্ট স্তরে বস্তু:

logger.level = Logger::WARN

আপনি যখন এটি করবেন, Logger শুধুমাত্র সতর্কিত করার সমান বা উচ্চতর লগগুলি পরিচালনা করবে৷ গুরুত্বের মধ্যে এটি উৎপাদনে খুবই উপযোগী, যেখানে আমরা আকার বা নিরাপত্তার কারণে "ডিবাগ" লগ সংরক্ষণ করতে চাই না।

এটি আউটপুট হওয়া উচিত:

Logger এবং Lograge সঙ্গে রুবি লগ ইন করুন

আপনার লগ কাস্টমাইজ করা

আপনি যদি আপনার লগগুলি কাস্টমাইজ করতে চান তবে প্রচুর বিকল্প রয়েছে। তারিখ এবং সময় পরিবর্তন করতে, উদাহরণস্বরূপ, শুধুমাত্র ডিফল্টটি ওভাররাইট করুন:

logger.datetime_format = "%Y-%m-%d %H:%M"

এখানে আউটপুটের একটি উদাহরণ:

W, [2020-07-28 10:50#87786]  WARN -- : I'm a warn log

date_time ফরম্যাট স্ট্যান্ডার্ড স্পেসিফিকেশন অনুসরণ করে, তাই এই ধরনের পরিবর্তন করার সময় এটি উল্লেখ করতে ভুলবেন না।

কখনও কখনও, যাইহোক, আপনাকে আপনার লগগুলির বিন্যাস সম্পূর্ণরূপে পরিবর্তন করতে হতে পারে৷ এই উদ্দেশ্যে, রুবি ফর্ম্যাটার ক্লাস প্রদান করে। এটি devs-কে Logger ডিফল্ট টেমপ্লেট ওভাররাইট করার অনুমতি দিয়ে কাজ করে লগ প্রিন্ট করতে ব্যবহার করে।

কল্পনা করুন যে আপনার অ্যাপটি একটি কেন্দ্রীভূত লগ বিশ্লেষণ টুল ব্যবহার করে এবং আপনার সমস্ত লগ name=value-এ প্রিন্ট করতে হবে বিন্যাস এটি হবে নতুন ফর্ম্যাটার কোড:

logger.formatter = proc do |severity, datetime, progname, msg|
    date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
    "date=[#{date_format}] severity=#{severity.ljust(5)} pid=##{Process.pid} message='#{msg}'\n"
end

এখানে, আমরা একটি proc ব্যবহার করছি সমস্ত লগ আটকাতে এবং পছন্দসই একটিতে প্রিন্ট করার ডিফল্ট উপায় পরিবর্তন করতে। এখন, আমাদের নিম্নলিখিত ফলাফল আছে:

Logger এবং Lograge সঙ্গে রুবি লগ ইন করুন

কোডের মাত্র কয়েকটি লাইনের সাথে, আপনার সমস্ত অ্যাপ লগ এখন টুল দ্বারা সূচিত করা যেতে পারে৷

JSON এ লগ করা হচ্ছে

Formatter এর ক্ষমতা সহ হাতে, আপনি যে আউটপুট প্রকার চান তাতে আপনার লগগুলি কাস্টমাইজ করা সহজ। উদাহরণস্বরূপ, আমরা সেই বিন্যাসে আমাদের লগ আউটপুট করতে JSON মডিউল ব্যবহার করতে পারি।

require "json"
logger.formatter = proc do |severity, datetime, progname, msg|
    date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
    JSON.dump(date: "#{date_format}", severity:"#{severity.ljust(5)}", pid:"##{Process.pid}", message: msg) + "\n"
end

এবং, এখানে ফলস্বরূপ লগগুলি রয়েছে:

Logger এবং Lograge সঙ্গে রুবি লগ ইন করুন

একটি ফাইলে লগ করা

আগে দেখা যায়, Logger কনস্ট্রাক্টর, প্রথম আর্গুমেন্ট হিসাবে, সেই জায়গাটি পায় যেখানে লগ সংরক্ষণ করা উচিত।

আপনি যদি একটি ফাইলে আপনার লগ সংরক্ষণ করতে চান, তাহলে শুধু তাই বলুন:

require 'logger'
logger = Logger.new('my_logs.log')

এটি একটি নতুন ফাইল my_logs.log তৈরি করবে৷ একই ফোল্ডারে যেখানে এই কোডটি ধারণকারী আপনার রুবি ফাইলটি অবস্থিত:

Logger এবং Lograge সঙ্গে রুবি লগ ইন করুন

যাইহোক, ক্লাসটি একগুচ্ছ কাস্টম বিকল্পের অনুমতি দেয়, যেমন একটি ধারণ নীতি কনফিগারেশন। নিম্নলিখিত উদাহরণ নিন:

# Keep data for the current week.
Logger.new('my_weekly_logs.log', 'weekly')
# Keep data for today and the past 2 months.
Logger.new('my_latest_2_months_logs.log', 2, 'monthly')
# Restarts the log over when it exceeds 26GB in size.
Logger.new('my_custom_logs.log', 0, 20 * 1024 * 1024 * 1024)

দ্বিতীয় প্যারাম হিসাবে, Logger কত ঘন ঘন লগ রাখা বা মুছে ফেলা উচিত তার একটি সংজ্ঞা গ্রহণ করে।

প্রথম বস্তুতে, লগগুলি শুধুমাত্র এক সপ্তাহের জন্য রাখা হবে। দ্বিতীয়টি সেগুলিকে দুই মাসের জন্য সংরক্ষণ করবে, যখন সর্বশেষটি তৃতীয় প্যারামের উপর ভিত্তি করে ফাইলের আকার বিশ্লেষণ করবে (যেমন, যখনই এটি 20GB তে পৌঁছাবে, এটি বাতিল করা হবে)৷

রুবি অন রেলে লগ ইন করা

Logger এর বেশিরভাগ সুবিধা আমরা এখন পর্যন্ত দেখেছি সবগুলো রেল অ্যাপের সাথে ব্যবহার করা যায়। Logger এর রেল সংস্করণ রুবির নেটিভ ক্লাসের একটি সাধারণ এক্সটেনশন মাত্র।

তা ছাড়াও, devsকে একাধিক লগারে তাদের লগ সম্প্রচার করার অনুমতি দেওয়ার জন্য Rails একটি চমৎকার বৈশিষ্ট্য যোগ করে। এইভাবে, আপনি যদি একাধিক লগিং লাইব্রেরির সাথে কাজ করতে চান, তাহলে আপনি Rails logger এর মধ্যে তা করতে পারেন :

custom_logger = Logger.new(STDOUT)
Rails.logger.extend(ActiveSupport::Logger.broadcast(custom_logger))

আপনার লগগুলি কোথায় যাওয়া উচিত সে সম্পর্কে আপনার কিছু বুদ্ধিমত্তার প্রয়োজন হলে এটিও কার্যকর হতে পারে। আপনার অ্যাপের কিছু অংশের বিভিন্ন অবস্থানে বা বিভিন্ন ফরম্যাটে লগের প্রয়োজন হতে পারে।

একটি তৃতীয় পক্ষের লগিং ফ্রেমওয়ার্ক নির্বাচন করা

যদি রুবির অন্তর্নির্মিত লগার ঠিক আপনার যা প্রয়োজন তা না করে, আপনার কাছে বিকল্প রয়েছে৷

তৃতীয় পক্ষের লগিং ফ্রেমওয়ার্ক বাছাই করার ক্ষেত্রে প্রচুর বিকল্প রয়েছে। এর মধ্যে সবচেয়ে জনপ্রিয় হল Lograge। আসুন এটি একবার দেখে নেওয়া যাক!

লগ্রেজের সাথে প্রথম ধাপ

Lograge Rails অ্যাপের জন্য তৈরি করা হয়েছিল। আপনি যদি ভ্যানিলা রুবির সাথে কাজ করেন তবে এটি একটি ভাল পছন্দ নাও হতে পারে।

এটি ইনস্টল করতে, শুধুমাত্র নিম্নলিখিত রত্ন যোগ করুন:

bundle add lograge

তারপর, config/initializers/lograge.rb এ একটি নতুন কনফিগারেশন ফাইল তৈরি করুন নিম্নলিখিত কোড সহ:

Rails.application.configure do
    config.lograge.enabled = true
    config.lograge.custom_options = lambda do |event|
        { time: event.time }
    end
end

এই কনফিগারেশন Lograge সক্ষম করে এবং একটি লগ, ফ্রেমওয়ার্কের একটি ইভেন্ট হিসাবে বিবেচিত, প্রিন্ট করার সময় নির্ধারণ করে৷

আপনি যখন Rails অ্যাপ শুরু করবেন এবং প্রথম এন্ডপয়েন্ট অ্যাক্সেস করবেন, Lograge অনুরোধের সারাংশ প্রিন্ট করবে। লগরেজ সেটআপের আগে এবং পরে লগের তুলনা করলে, নিচের মত কিছু দেখায়:

Logger এবং Lograge সঙ্গে রুবি লগ ইন করুন

আবার, Lograge একটি রূপালী বুলেট নয়; এটা আসলে একটি খুব মতামত ফ্রেমওয়ার্ক. সুতরাং, আপনাকে সম্ভবত বিল্ট-ইন Logger এর সাথে এটি ব্যবহার করতে হবে (বা আপনার পছন্দের অন্যান্য কাঠামো)।

র্যাপিং আপ

শেষ পর্যন্ত, এটা আরও পরিষ্কার হয়ে যায় যে লগিং করা শুধুমাত্র আপনার প্রকল্পগুলির একটি গুরুত্বপূর্ণ অংশ নয় বরং এটি অত্যন্ত অবমূল্যায়িত। আপনি যে সরঞ্জামগুলি ব্যবহার করছেন তা আরও ভালভাবে বোঝার জন্য, সেগুলি স্থানীয় হোক না কেন, আপনাকে আরও ভাল ফলাফল অর্জন করতে সহায়তা করবে৷

একটি নতুন কাঠামো গ্রহণ করার জন্য সর্বদা প্রচুর পরীক্ষা পরিচালনা করতে ভুলবেন না। কখনও কখনও আপনার প্ল্যাটফর্ম ইতিমধ্যে দুর্দান্ত অন্তর্নির্মিত বিকল্পগুলির সাথে একত্রিত হয়ে আসে। যদি তা না হয়, তাহলে নির্ধারণ করুন যে এটি ইতিমধ্যে ভিতরে থাকা ফ্রেমওয়ার্কের সাথে একত্রিত অন্যান্য ফ্রেমওয়ার্ক ব্যবহারের অনুমতি দেয় কিনা৷

শুভকামনা!


  1. রুবির সাথে সিলেকশন সর্ট বোঝা

  2. Fluentd এবং ObjectRocket দিয়ে একটি হাইব্রিড ক্লাউড লগ ইন করা

  3. TCmalloc-এর সাথে রুবির মেমরি বরাদ্দের প্রোফাইলিং

  4. রুবি দিয়ে কীভাবে পার্সার তৈরি করবেন