CodeGym /Java Blog /এলোমেলো /লগিং: কি, কিভাবে, কোথায়, এবং কি দিয়ে?
John Squirrels
লেভেল 41
San Francisco

লগিং: কি, কিভাবে, কোথায়, এবং কি দিয়ে?

এলোমেলো দলে প্রকাশিত
CodeGym সম্প্রদায়ের সবাইকে হ্যালো! লগিং: কি, কিভাবে, কোথায়, এবং কি দিয়ে?  - ১ আজ লগিং সম্পর্কে কথা বলা যাক:
  1. এটি কী, কেন এটি বিদ্যমান, কখন এটি ব্যবহার করা উচিত, কখন এটি এড়ানো উচিত।
  2. জাভাতে কি লগিং ইমপ্লিমেন্টেশন পাওয়া যায় এবং এই সমস্ত লগিং অপশনের সাথে আপনার কি করা উচিত।
  3. এবং লগ স্তর. অ্যাপেন্ডার কী এবং কীভাবে এটি সঠিকভাবে কনফিগার করা যায় তা নিয়ে আলোচনা করব।
  4. লগিং নোডগুলি এবং কীভাবে সেগুলিকে সঠিকভাবে কনফিগার করা যায় যাতে সবকিছু আমাদের ইচ্ছামত কাজ করে।
এই উপাদান একটি বিস্তৃত দর্শকদের জন্য উদ্দেশ্যে করা হয়. এটা যে কেউ জাভা জানলেই পরিষ্কার হয়ে যাবে, সেইসাথে যারা ইতিমধ্যেই কাজ করছেন কিন্তু শুধুমাত্র অন্বেষণ করেছেন logger.info("log something"); লেটস গো!

কেন আপনি লগিং প্রয়োজন?

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

জাভা লগ ইন করার জন্য টুল

জাভাতে সুপরিচিত লগিং সমাধানগুলির মধ্যে, আমরা নিম্নলিখিতগুলি হাইলাইট করতে পারি:
  • Log4j
  • JUL — java.util.logging
  • JCL — জাকার্তা কমন্স লগিং
  • লগব্যাক
  • SLF4J — জাভার জন্য সহজ লগিং সম্মুখভাগ
আমরা তাদের প্রতিটি একটি ওভারভিউ প্রদান করবে. তারপরে আমরা একটি ব্যবহারিক আলোচনার ভিত্তি হিসাবে একটি slf4j - log4j বাইন্ডিং নেব । এটি এখন অদ্ভুত মনে হতে পারে, কিন্তু চিন্তা করবেন না: নিবন্ধের শেষে, সবকিছু পরিষ্কার হয়ে যাবে।

System.err.println

শুরুতে, System.err.println ছিল (কনসোলে লগ এন্ট্রি প্রদর্শন করা)। আজও, এই কৌশলটি ডিবাগ করার সময় দ্রুত লগ করতে ব্যবহৃত হয়। অবশ্যই, এখানে আলোচনা করার জন্য কোন সেটিংস নেই, তাই এই পদ্ধতিটি মনে রাখবেন এবং আমরা এগিয়ে যাব।

Log4j

এটি একটি সম্পূর্ণ সমাধান যা বিকাশকারীরা প্রয়োজনের বাইরে তৈরি করেছেন। ফলাফলটি একটি সত্যিই আকর্ষণীয় টুল যা আপনি ব্যবহার করতে পারেন। বিভিন্ন পরিস্থিতির কারণে, এই সমাধানটি JDK-তে শেষ হয়নি, একটি সত্য যা সমগ্র সম্প্রদায়কে ব্যাপকভাবে বিচলিত করেছে। Log4j-এর কনফিগারেশন বিকল্প রয়েছে যা আপনাকে প্যাকেজে লগিং সক্ষম করতে com.example.typeএবং সাবপ্যাকেজে এটি বন্ধ করতে দেয় com.example.type.generic। এটি লগ ইন করার প্রয়োজন নেই এমন কোডগুলি দ্রুত বাদ দেওয়া সম্ভব করে তোলে। এখানে উল্লেখ করা গুরুত্বপূর্ণ যে Log4j এর দুটি সংস্করণ রয়েছে: 1.2.x এবং 2.xx, এবং তারা একে অপরের সাথে বেমানানLog4j অ্যাপেন্ডারের ধারণা যোগ করেছে(লগ লিখতে ব্যবহৃত একটি টুল) এবং লেআউট (লগ বিন্যাস)। এটি আপনাকে শুধুমাত্র আপনার যা প্রয়োজন তা লগ করতে দেয় এবং আপনার প্রয়োজন অনুযায়ী লগ করতে দেয়৷ আমরা একটু পরে অ্যাপেন্ডার সম্পর্কে আরও কথা বলব।

JUL — java.util.logging

এই সমাধানের মূল সুবিধাগুলির মধ্যে একটি হল JUL JDK (জাভা ডেভেলপমেন্ট কিট) এর অন্তর্ভুক্ত। দুর্ভাগ্যবশত, যখন এটি তৈরি করা হয়েছিল, তখন এর নির্মাতারা এটিকে জনপ্রিয় Log4j ইউটিলিটির উপর ভিত্তি করে তৈরি করেননি, বরং আইবিএমের একটি সমাধান। সেই সিদ্ধান্তের পরিণতি হয়েছে। বাস্তবতা হল এখন কেউ JUL ব্যবহার করে না। JUL-এ লগের স্তরগুলি Logback, Log4j, এবং Slf4j-এর থেকে আলাদা। এটি তাদের একে অপরকে বোঝা কঠিন করে তোলে। লগার তৈরি করা কমবেশি একই রকম। এটি করার জন্য, আপনাকে একটি আমদানি করতে হবে:

java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggingJul.class.getName());
ক্লাসের নাম পাস, তাই আমরা জানি আমাদের লগিং কোথা থেকে আসবে। Java 8 দিয়ে শুরু করে, আপনি পাস করতে পারেন Supplier<String>। এটি আমাদেরকে পড়তে এবং একটি লাইন তৈরি করতে সাহায্য করে যখন আমাদের সত্যিই এটির প্রয়োজন হয়, প্রতিবারের চেয়ে, যেমনটি আগে ছিল। শুধুমাত্র জাভা 8 প্রকাশের সাথে সাথে ডেভেলপাররা অবশেষে গুরুত্বপূর্ণ সমস্যার সমাধান করেছে এবং JUL কে সত্যিকারের ব্যবহারযোগ্য করে তুলেছে। যথা, একটি পরামিতি সহ পদ্ধতি Supplier<String> msgSupplier, নীচে দেখানো হিসাবে:

public void info(Supplier<String> msgSupplier) {
   log(Level.INFO, msgSupplier);
}

JCL — জাকার্তা কমন্স লগিং

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

লগব্যাক

ওপেন-সোর্স পথটি কাঁটাযুক্ত... একই ডেভেলপার যে Log4j লিখেছে সেও লগব্যাককে উত্তরসূরি লগিং ফ্রেমওয়ার্ক হিসেবে লিখেছে। এটি Log4j হিসাবে একই ধারণার উপর ভিত্তি করে ছিল। লগব্যাকের পার্থক্যগুলি হল:
  • উন্নত কর্মক্ষমতা
  • Slf4j এর জন্য নেটিভ সমর্থন যোগ করা হয়েছে
  • প্রসারিত ফিল্টারিং বিকল্প
ডিফল্টরূপে, লগব্যাকের কোনো কনফিগারেশনের প্রয়োজন হয় না, এবং DEBUG স্তরে এবং উচ্চতর সমস্ত ইভেন্ট রেকর্ড করে। আপনার যদি কিছু কাস্টমাইজেশনের প্রয়োজন হয়, আপনি এটি একটি XML কনফিগারেশনের মাধ্যমে অর্জন করতে পারেন:

<configuration> 
    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
        <file>app.log</file> 
        <encoder> 
            <pattern>%d{HH:mm:ss,SSS} %-5p [%c] - %m%n</pattern> 
        </encoder> 
    </appender> 
    <logger name="org.hibernate.SQL" level="DEBUG" /> 
    <logger name="org.hibernate.type.descriptor.sql" level="TRACE" /> 
    <root level="info"> 
        <appender-ref ref="FILE" /> 
    </root> 
</configuration>

SLF4J — জাভার জন্য সহজ লগিং সম্মুখভাগ

2006-এর কোনো এক সময়ে, Log4j-এর প্রতিষ্ঠাতাদের মধ্যে একজন এই প্রকল্পটি ত্যাগ করেন এবং Slf4j (জাভার জন্য সহজ লগিং ফ্যাকেড), Log4j, JUL, কমন-লগিং এবং লগব্যাকের জন্য একটি মোড়ক তৈরি করেন। আপনি দেখতে পাচ্ছেন, আমরা একটি র‍্যাপারের উপর একটি মোড়ক তৈরি করার পর্যায়ে অগ্রসর হয়েছি... এই ক্ষেত্রে, এটি দুটি অংশে বিভক্ত: একটি এপিআই যা অ্যাপ্লিকেশনে ব্যবহৃত হয়, এবং একটি বাস্তবায়ন যা আলাদাভাবে যোগ করা হয় প্রতিটি ধরনের লগিংয়ের জন্য নির্ভরতা। উদাহরণস্বরূপ, slf4j-log4j12.jarএবং slf4j-jdk14.jar. আপনাকে সঠিক বাস্তবায়ন করতে হবে এবং এটিই: আপনার সম্পূর্ণ প্রকল্প এটি ব্যবহার করবে। Slf4j সমস্ত সাম্প্রতিক বৈশিষ্ট্যগুলিকে সমর্থন করে, যেমন লগিংয়ের জন্য স্ট্রিং ফর্ম্যাটিং। আগেও এমন সমস্যা ছিল। ধরা যাক আমরা এইরকম একটি লগ এন্ট্রি তৈরি করি:

log.debug("User " + user + " connected from " + request.getRemoteAddr());
কনক্যাটেনেশন অপারেটরের কারণে, userবস্তুটি নীরবে একটি স্ট্রিং হয়ে যায় ধন্যবাদ user.toString()। এটি সময় নেয় এবং সিস্টেমকে ধীর করে দেয়। এবং যে ঠিক হতে পারে যদি আমরা অ্যাপ্লিকেশন ডিবাগ করছি. এই শ্রেণীর লগ লেভেল INFO বা উচ্চতর হলে আমরা সমস্যার সম্মুখীন হতে শুরু করি। অন্য কথায়, আমাদের এই লগ এন্ট্রি লেখা উচিত নয় (INFO বা উচ্চতর জন্য), এবং আমাদের স্ট্রিং সংযোজন ব্যবহার করা উচিত নয়। তাত্ত্বিকভাবে, লগিং লাইব্রেরি নিজেই এটির সমাধান করা উচিত। এটি যেমন ঘটছে, এটি Log4j-এর প্রথম সংস্করণে সবচেয়ে বড় সমস্যা হয়ে দেখা দিয়েছে। এটি একটি শালীন সমাধান প্রদান করেনি, তবে পরিবর্তে এটির মতো কিছু করার পরামর্শ দিয়েছে:

if (log.isDebugEnabled()) {
    log.debug("User " + user + " connected from " + request.getRemoteAddr());
}
অর্থাৎ, লগিং করার জন্য কোডের এক লাইনের পরিবর্তে তারা 3 লেখার পরামর্শ দিয়েছে! লগিং কোড পরিবর্তনগুলিকে কমিয়ে আনতে হবে এবং তিনটি লাইন স্পষ্টভাবে সেই সাধারণ পদ্ধতির লঙ্ঘন করে৷ Slf4j এর JDK এবং API এর সাথে কোন সামঞ্জস্যপূর্ণ সমস্যা ছিল না, তাই একটি চমৎকার সমাধান অবিলম্বে আবির্ভূত হয়েছে:

log.debug("User {} connected from {}", user, request.getRemoteAddr());
যেখানে {}পদ্ধতিতে পাস করা আর্গুমেন্টের স্থানধারককে বোঝায়। অর্থাৎ, প্রথমটির {}সাথে সঙ্গতিপূর্ণ userএবং দ্বিতীয়টির {}সাথে সঙ্গতিপূর্ণ request.getRemoteAddr()। এইভাবে করলে, আমরা স্ট্রিং কনক্যাটেনেশন করতে পারব যদি লগ লেভেলে আমাদের লগ এন্ট্রি লিখতে হয়। এর পরে, Sjf4j দ্রুত জনপ্রিয়তা বৃদ্ধি পেতে শুরু করে। বর্তমানে, এটি সর্বোত্তম সমাধান। তদনুসারে, আসুন একটি slf4j-log4j12বাইন্ডিং ব্যবহার করে লগিং এর দিকে নজর দেওয়া যাক।

কি লগ করা প্রয়োজন

অবশ্যই, আপনি সবকিছু লগ করা উচিত নয়. এটি প্রায়শই প্রয়োজনীয় নয় এবং কখনও কখনও এমনকি বিপজ্জনক। উদাহরণস্বরূপ, আপনি যদি কারও ব্যক্তিগত ডেটা লগ করেন এবং এটি কোনওভাবে ফাঁস হয়ে যায়, তবে প্রকৃত সমস্যা হবে, বিশেষ করে পশ্চিমা বাজারগুলিতে ফোকাস করা প্রকল্পগুলিতে। কিন্তু এমন কিছু জিনিস রয়েছে যা আপনাকে অবশ্যই লগ করতে হবে :
  1. আবেদনের শুরু/শেষ। আমাদের জানতে হবে যে অ্যাপ্লিকেশনটি আসলেই প্রত্যাশিতভাবে শুরু হয়েছে এবং শেষ হয়েছে কিনা।
  2. নিরাপত্তা বিষয়ক. এখানে কারো পাসওয়ার্ড অনুমান করার প্রচেষ্টা, প্রশাসক সাইন ইন করার দৃষ্টান্ত ইত্যাদিতে লগ করা ভাল হবে৷
  3. নির্দিষ্ট আবেদন রাষ্ট্র . উদাহরণস্বরূপ, একটি ব্যবসায়িক প্রক্রিয়ায় এক রাজ্য থেকে অন্য রাজ্যে রূপান্তর।
  4. সংশ্লিষ্ট লগ স্তর সহ নির্দিষ্ট ডিবাগ তথ্য ।
  5. নির্দিষ্ট SQL স্ক্রিপ্ট। বাস্তব-বিশ্বের ক্ষেত্রে আছে যখন এটি প্রয়োজন হয়। কিন্তু আবার, দক্ষতার সাথে লগ লেভেল সামঞ্জস্য করে, আপনি চমৎকার ফলাফল অর্জন করতে পারেন।
  6. জিনিসগুলি সঠিকভাবে কাজ করছে কিনা তা যাচাই করার সময় চলমান থ্রেডগুলি লগ করা যেতে পারে।

লগিংয়ে জনপ্রিয় ত্রুটি

এখানে অনেক সূক্ষ্মতা রয়েছে, তবে আমরা কয়েকটি সাধারণ ভুলের বিশেষ উল্লেখ করব:
  1. অত্যধিক লগিং. তাত্ত্বিকভাবে গুরুত্বপূর্ণ হতে পারে এমন প্রতিটি পদক্ষেপে আপনার লগ করা উচিত নয়। এখানে থাম্বের একটি ভাল নিয়ম: লগগুলি লোডের 10% এর বেশি হওয়া উচিত নয়। অন্যথায়, কর্মক্ষমতা সমস্যা হবে।
  2. একটি ফাইলে সমস্ত ডেটা লগ করা হচ্ছে। কিছু সময়ে, এটি লগ পড়া/লিখতে খুব কঠিন করে তুলবে, নির্দিষ্ট সিস্টেমের ফাইলের আকারের সীমাবদ্ধতা রয়েছে তা উল্লেখ না করে।
  3. ভুল লগ স্তর ব্যবহার করে. প্রতিটি লগ স্তরের স্পষ্ট সীমানা রয়েছে এবং তাদের সম্মান করা উচিত। যদি একটি সীমানা অস্পষ্ট হয়, আপনি কোন স্তরটি ব্যবহার করবেন সে সম্পর্কে একটি চুক্তিতে আসতে পারেন।

লগ লেভেল

x: দৃশ্যমান
মারাত্মক ত্রুটি সতর্ক করুন তথ্য ডিবাগ ট্রেস সমস্ত
বন্ধ
মারাত্মক এক্স
ত্রুটি এক্স এক্স
সতর্ক করুন এক্স এক্স এক্স
তথ্য এক্স এক্স এক্স এক্স
ডিবাগ এক্স এক্স এক্স এক্স এক্স
ট্রেস এক্স এক্স এক্স এক্স এক্স এক্স
সমস্ত এক্স এক্স এক্স এক্স এক্স এক্স এক্স
লগ লেভেল কি? কোনোভাবে লগ এন্ট্রিগুলির একটি শ্রেণিবিন্যাস তৈরি করার জন্য, নির্দিষ্ট নিয়মাবলী এবং সীমাবদ্ধতা প্রয়োজন। এই কারণেই লগ লেভেল চালু করা হয়েছিল। স্তরটি অ্যাপ্লিকেশনটিতে সেট করা আছে। যদি একটি এন্ট্রি একটি নির্দিষ্ট স্তরের নিচে হয়, তাহলে এটি লগ করা হয় না। উদাহরণস্বরূপ, আমাদের কাছে লগ আছে যা আমরা অ্যাপ্লিকেশন ডিবাগ করার সময় ব্যবহার করি। স্বাভাবিক ক্রিয়াকলাপের সময় (যখন অ্যাপ্লিকেশনটি তার উদ্দেশ্যমূলক উদ্দেশ্যে ব্যবহার করা হয়), এই জাতীয় লগগুলির প্রয়োজন হয় না। তাই, লগ লেভেল ডিবাগিংয়ের চেয়ে বেশি। আসুন Log4j ব্যবহার করে লগ লেভেল দেখি। JUL ছাড়াও, অন্যান্য সমাধান একই লগ স্তর ব্যবহার করে। এখানে তারা হ্রাস ক্রমে আছে:
  • বন্ধ: কোন লগ এন্ট্রি রেকর্ড করা হয় না; সবকিছু উপেক্ষা করা হয়।
  • মারাত্মক: একটি ত্রুটি যা অ্যাপ্লিকেশনটিকে চলতে চলতে বাধা দেয়৷ যেমন, "JVM আউট অফ মেমরি ত্রুটি"।
  • ত্রুটি: এই স্তরে ত্রুটিগুলি নির্দেশ করে যে সমস্যাগুলি সমাধান করা প্রয়োজন৷ ত্রুটি সম্পূর্ণরূপে অ্যাপ্লিকেশন বন্ধ করে না. অন্যান্য অনুরোধ সঠিকভাবে কাজ করতে পারে.
  • সতর্কতা: লগ এন্ট্রি যা একটি সতর্কতা প্রতিনিধিত্ব করে। অপ্রত্যাশিত কিছু ঘটেছে, তবে সিস্টেমটি মোকাবেলা করতে এবং অনুরোধটি পূরণ করতে সক্ষম হয়েছিল
  • INFO: লগ এন্ট্রি যা অ্যাপ্লিকেশনে গুরুত্বপূর্ণ ক্রিয়াগুলি নির্দেশ করে৷ এগুলি ত্রুটি বা সতর্কতা নয়। তারা প্রত্যাশিত সিস্টেম ইভেন্ট.
  • DEBUG: লগ এন্ট্রি অ্যাপ্লিকেশন ডিবাগ করতে হবে. অ্যাপ্লিকেশনটি ঠিক যা প্রত্যাশিত তা নিশ্চিত করার জন্য বা অ্যাপ্লিকেশন দ্বারা গৃহীত পদক্ষেপগুলি বর্ণনা করার জন্য, যেমন "Entered method1"।
  • TRACE: ডিবাগিংয়ের জন্য নিম্ন-অগ্রাধিকার লগ এন্ট্রি। সর্বনিম্ন লগ স্তর.
  • সমস্ত: অ্যাপ্লিকেশনের সমস্ত লগ এন্ট্রি লেখার জন্য একটি লগ স্তর।
INFO লগ লেভেল অ্যাপ্লিকেশনের কোথাও সক্রিয় করা আছে, তারপর প্রতিটি স্তরের জন্য এন্ট্রি লগ করা হবে, INFO থেকে FATAL পর্যন্ত। FATAL লগ লেভেল সেট করা থাকলে, শুধুমাত্র সেই লেভেলের লগ এন্ট্রি লেখা হবে।

লগ করা এবং লগ পাঠানো: Appender

আসুন বিবেচনা করি কিভাবে আমরা Log4j ব্যবহার করি, যা লগ লেখা/পাঠানোর জন্য যথেষ্ট সুযোগ প্রদান করে:
  • একটি ফাইলে লিখতে -DailyRollingFileAppender
  • কনসোলে তথ্য লিখতে -ConsoleAppender
  • একটি ডাটাবেসে লগ লিখতে -JDBCAppender
  • TCP/IP এর মাধ্যমে লগ পাঠানোর ব্যবস্থা করতে —TelnetAppender
  • লগিং যাতে নেতিবাচকভাবে কর্মক্ষমতা প্রভাবিত না করে তা নিশ্চিত করার জন্য -AsyncAppender
আরও কয়েকটি বাস্তবায়ন আছে: একটি সম্পূর্ণ তালিকা এখানে উপলব্ধ । যাইহোক, যদি আপনার প্রয়োজনীয় অ্যাপেন্ডারটি বিদ্যমান না থাকে তবে কোন সমস্যা নেই। আপনি অ্যাপেন্ডার ইন্টারফেস প্রয়োগ করে আপনার নিজের অ্যাপেন্ডার লিখতে পারেন , যা Log4j সমর্থন করে।

লগিং নোড

প্রদর্শনের উদ্দেশ্যে, আমরা Log4j থেকে একটি বাস্তবায়ন সহ একটি Slf4j ইন্টারফেস ব্যবহার করব। একটি লগার তৈরি করা খুবই সহজ: নামের একটি ক্লাসে MainDemo, যা কিছু লগিং করবে, আমাদের নিম্নলিখিত যোগ করতে হবে:

org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MainDemo.class);
এটি আমাদের জন্য একটি লগার তৈরি করবে। একটি লগ এন্ট্রি করার জন্য, বেশ কয়েকটি উপলব্ধ পদ্ধতি রয়েছে যার নামগুলি প্রতিফলিত করে কোন লগ স্তর ব্যবহার করা হবে৷ উদাহরণ স্বরূপ:

logger.trace("Method 1 started with argument={}", argument);
logger.debug("Database updated with script = {}", script);
logger.info("Application has started on port = {}", port);
logger.warn("Log4j didn't find the log4j.properties file. Please fix this.");
logger.error("Connection refused to host = {}", host);
যদিও আমরা ক্লাস পাস করছি, চূড়ান্ত নাম হল ক্লাসের পুরো নাম, প্যাকেজ সহ। এটি করা হয় যাতে পরে আপনি লগিংটিকে নোডগুলিতে ভাগ করতে পারেন এবং প্রতিটি নোডের জন্য লগিং স্তর এবং অ্যাপেন্ডার কনফিগার করতে পারেন। উদাহরণস্বরূপ, ক্লাসে লগার তৈরি করা হয়েছিল com.github.romankh3.logginglecture.MainDemo। নামটি লগিং নোডগুলির একটি অনুক্রম তৈরি করার জন্য ভিত্তি প্রদান করে। প্রধান নোড হল টপ-লেভেল রুটলগার । এটি সেই নোড যা সমগ্র অ্যাপ্লিকেশনের জন্য সমস্ত লগ এন্ট্রি গ্রহণ করে। অবশিষ্ট নোডগুলি নীচে দেখানো হিসাবে চিত্রিত করা যেতে পারে: লগিং: কি, কিভাবে, কোথায়, এবং কি দিয়ে?  - 3পরিশিষ্টগুলি নির্দিষ্ট লগিং নোডের জন্য কনফিগার করা হয়েছে। এখন আমরা log4j.properties ফাইলটি দেখতে যাচ্ছি কিভাবে সেগুলো কনফিগার করতে হয় তার একটি উদাহরণ দেখতে।

log4j.properties ফাইলের একটি ধাপে ধাপে নির্দেশিকা

আমরা একবারে এক ধাপ সবকিছু সেট আপ করব এবং কী সম্ভব তা দেখব:

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
এই লাইনটি বলে যে আমরা কনসোল অ্যাপেন্ডার নিবন্ধন করছি, যা org.apache.log4j.ConsoleAppender বাস্তবায়ন ব্যবহার করে। এই অ্যাপেন্ডার কনসোলে তথ্য লেখে। এর পরে, আমরা অন্য অ্যাপেন্ডার নিবন্ধন করি। এটি একটি ফাইলে লিখবে:

log4j.appender.FILE=org.apache.log4j.RollingFileAppender
এটি লক্ষ করা গুরুত্বপূর্ণ যে অ্যাপেন্ডারগুলিকে এখনও কনফিগার করা দরকার। একবার আমরা আমাদের অ্যাপেন্ডারগুলি নিবন্ধিত করার পরে, আমরা নির্ধারণ করতে পারি কোন লগ লেভেল এবং কোন অ্যাপেন্ডার নোডগুলিতে ব্যবহার করা হবে।

log4j.rootLogger=ডিবাগ, কনসোল, ফাইল

  • log4j.rootLogger মানে আমরা রুট নোড কনফিগার করছি, যাতে সমস্ত লগ এন্ট্রি রয়েছে
  • সমান চিহ্নের পরে প্রথম শব্দটি লিখতে সর্বনিম্ন লগ স্তর নির্দেশ করে (আমাদের ক্ষেত্রে, এটি DEBUG)
  • কমা অনুসরণ করে, আমরা ব্যবহার করা সমস্ত পরিশিষ্ট নির্দেশ করি।
একটি আরো নির্দিষ্ট লগিং নোড কনফিগার করতে, আপনি এই মত একটি এন্ট্রি ব্যবহার করবেন:

log4j.logger.com.github.romankh3.logginglecture=TRACE, OWN, CONSOLE
যেখানে log4j.logger.একটি নির্দিষ্ট নোড উল্লেখ করতে ব্যবহৃত হয়। আমাদের ক্ষেত্রে, com.github.romankh3.logginglecture. এখন কনসোল অ্যাপেন্ডার কনফিগার করার বিষয়ে কথা বলা যাক:

# CONSOLE appender customization
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.threshold=DEBUG
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p] : %c:%L : %m%n
এখানে আমরা দেখতে পাচ্ছি যে অ্যাপেন্ডারটি কোন নির্দিষ্ট স্তরে কাজ শুরু করবে তা নির্ধারণ করা সম্ভব। এখানে আসলে কী ঘটে তার একটি উদাহরণ: ধরুন INFO স্তর সহ একটি বার্তা লগিং নোড দ্বারা গৃহীত হয় এবং এটিকে নির্ধারিত অ্যাপেন্ডারে প্রেরণ করা হয়। যদি অ্যাপেন্ডারের থ্রেশহোল্ড WARN-এ সেট করা থাকে, তাহলে এটি লগ এন্ট্রি পায় কিন্তু এর সাথে কিছুই করে না। এর পরে, বার্তাটি কোন লেআউটটি ব্যবহার করবে তা আমাদের সিদ্ধান্ত নিতে হবে। আমি উদাহরণে PatternLayout ব্যবহার করি, কিন্তু অন্যান্য অনেক বিকল্প আছে। আমরা এই নিবন্ধে তাদের কভার করব না। ফাইল অ্যাপেন্ডার কনফিগার করার উদাহরণ:

# File appender customization
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=./target/logging/logging.log
log4j.appender.FILE.MaxFileSize=1MB
log4j.appender.FILE.threshold=DEBUG
log4j.appender.FILE.MaxBackupIndex=2
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[ %-5p] - %c:%L - %m%n
আপনি নির্দিষ্ট ফাইলটি কনফিগার করতে পারেন যেখানে লগ এন্ট্রি লেখা হবে, যেমনটি এই লাইন থেকে দেখা যাবে:

log4j.appender.FILE.File=./target/logging/logging.log
এন্ট্রি ফাইলে লেখা হয় logging.log। ফাইলের আকার নিয়ে সমস্যা এড়াতে, আপনি সর্বাধিক কনফিগার করতে পারেন, যা এই ক্ষেত্রে 1MB। MaxBackupIndexএই ধরনের কতগুলি লগ ফাইল থাকবে তা নির্দেশ করে। আমাদের যদি এর চেয়ে বেশি ফাইল তৈরি করতে হয়, তবে প্রথম ফাইলটি মুছে ফেলা হবে। একটি বাস্তব উদাহরণ দেখতে যেখানে লগিং কনফিগার করা হয়েছে, আপনি গিটহাবের সর্বজনীন সংগ্রহস্থলে যেতে পারেন।

আমরা যা আলোচনা করেছি তা শক্তিশালী করুন

আমরা যা বর্ণনা করেছি তা করার জন্য নিজেরাই চেষ্টা করুন:
  • উপরের আমাদের উদাহরণের মতো আপনার নিজস্ব প্রকল্প তৈরি করুন।
  • আপনি যদি ম্যাভেন ব্যবহার করতে জানেন তবে এটি ব্যবহার করুন। যদি না হয়, তাহলে এই টিউটোরিয়ালটি পড়ুন, যা বর্ণনা করে কিভাবে লাইব্রেরি সংযোগ করতে হয়।

সংক্ষেপে

  1. আমরা জাভাতে বিদ্যমান লগিং সমাধান সম্পর্কে কথা বলেছি।
  2. প্রায় সব সুপরিচিত লগিং লাইব্রেরি এক ব্যক্তি দ্বারা লিখিত ছিল :D
  3. আমরা শিখেছি কি লগ করা উচিত এবং কি করা উচিত নয়।
  4. আমরা লগ লেভেল বের করেছি।
  5. আমরা লগিং নোডের সাথে পরিচয় করিয়ে দিয়েছিলাম।
  6. আমরা একটি পরিশিষ্ট কি এবং এটি কি জন্য তাকান.
  7. আমরা ধাপে ধাপে একটি log4j.proterties ফাইল তৈরি করেছি।

অতিরিক্ত উপকরণ

  1. কোডজিম: লগার পাঠ
  2. সাপ্তাহিক গীকলি: জাভা লগিং। ওহে বিশ্ব
  3. কোডিং হরর: লগিং এর সমস্যা
  4. ইউটিউব: জাভা লগিং হেল বোঝা - মূল বিষয়গুলি৷ জাভা লগিং হেল এবং কিভাবে এটি থেকে দূরে থাকা যায়
  5. Log4j: অ্যাপেন্ডার
  6. Log4j: লেআউট
এছাড়াও আমার অন্য নিবন্ধ দেখুন:
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION