Java.util.logging [বন্ধ] ব্যবহার করে ভাল উদাহরণ


273

আমি আমার প্রোগ্রামে লগগুলি ব্যবহার করতে চাই। আমি java.util.logging সম্পর্কে শুনেছি , তবে কীভাবে শুরু করব তা আমি জানি না।

লগিংয়ের মাধ্যমে আমি কী করতে পারি তার কোনও উদাহরণ রয়েছে? আমি কীভাবে নিজের প্রোগ্রামে লগিং ব্যবহার করব?


7
আপনি এখানে শুরু করতে পারেন: slf4j.org/manual.html
জেরেমি

1
আমি স্টিভেন ভ্যাসেল্লারোর সাথে একমত টপিক পলিসিংয়ের ব্যবহারিক পরিণতি না হওয়ার কারণে সহায়ক আইটেমগুলি ধ্বংস হয়ে দেখে আমি ক্লান্ত হয়ে পড়েছি। অতিরিক্ত হিসাবে, জেরেমির সাথে শ্রদ্ধার সাথে একমত নন, যেমন ওপি java.util.logging সম্পর্কে জিজ্ঞাসা করেছিল। আমি নেটিভ লগিংয়েও আগ্রহী (উত্তরের জন্য ধন্যবাদ, www.www!)
NOP

এক লাইনে ডেটা লগ করার জন্য: লগ.লগ (স্তর.আইএনএফও, "আমার বার্তা {0}", নতুন অবজেক্ট [] {myDataId});
মিটজা গুস্টিন

উত্তর:


335

java.util.logging আপনাকে আপনার অ্যাপ্লিকেশনটির সাথে আরও একটি জার ফাইল টোটানো থেকে বিরত রাখে এবং এটি একটি ভাল ফর্ম্যাটারের সাথে ভালভাবে কাজ করে।

সাধারণভাবে, প্রতিটি শ্রেণীর শীর্ষে আপনার থাকা উচিত:

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

তারপরে, আপনি কেবল লগার শ্রেণির বিভিন্ন সুবিধা ব্যবহার করতে পারেন ।


এক্সিকিউশন প্রবাহের শীর্ষ স্তরে ডিবাগিংয়েরLevel.FINE জন্য যে কোনও কিছুই ব্যবহার করুন :

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

ব্যবহারের Level.FINER/ Level.FINESTলুপ এর এবং স্থান যেখানে আপনি সবসময় যে অনেক বিস্তারিত দেখতে যখন মৌলিক প্রবাহ সমস্যা ডিবাগ প্রয়োজন হবে না পারে ভিতরে:

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

টন স্ট্রিং কনটেনটেশন আবর্জনা তৈরি করা থেকে বিরত রাখতে লগিং সুবিধাগুলির প্যারামিটারাইজড সংস্করণগুলি ব্যবহার করুন যা জিসি রাখতে হবে। Object[]উপরের হিসাবে সস্তা, সাধারণত স্ট্যাক বরাদ্দ উপর।


ব্যতিক্রম হ্যান্ডলিং সহ, সর্বদা সম্পূর্ণ ব্যতিক্রম বিশদটি লগ করুন:

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

আমি সর্বদা ex.toString()এখানে বার্তা হিসাবে পাস করি , কারণ যখন তখন আমি লগ ফাইলগুলিতে grep -n" Exception" " " জন্য থাকি, আমি বার্তাটিও দেখতে পাই। অন্যথায়, এটি স্ট্যাক ডাম্প দ্বারা উত্পাদিত আউটপুট পরবর্তী লাইনে হতে চলেছে, এবং আপনারও সেই লাইনটি মেলাতে আরও উন্নত RegEx থাকতে হবে, যা প্রায়শই আপনাকে দেখার প্রয়োজনের চেয়ে বেশি আউটপুট দেয়।


3
এটি কি কোনও প্রকারের একটি ফাইলকে লিখবে। আমার প্রোগ্রামে এটি এখনও কাজ করতে পারি না। আপনার কাছে আমার কাছে প্রাথমিক লাইন রয়েছে তবে এখন পর্যন্ত কোনও কিছুই কার্যকর হয়নি।
ডগ হাউফ

5
আপনি লগগুলি কীভাবে দেখেন? আমি একটি লাইব্রেরি লোগর অবজেক্টগুলিকে আরম্ভ করি এবং .fine()লগ করার পদ্ধতিটি ব্যবহার করি, তবে আমি বার্তাগুলি প্রদর্শন করতে পারি না ...
আনুবিয়ান নুব

7
আমি ১৯৯৯ সাল থেকে জাভাতে প্রোগ্রামিং করছি Java আমি যে জাভাটি পড়েছি তাতে কীভাবে লগ ইন করা যায় তার এটি এখন পর্যন্ত সবচেয়ে সরল ব্যাখ্যা। সংক্ষিপ্ত।
স্টিভ ম্যাকলিড

30
এটি আকর্ষণীয় যে কেউ উল্লেখ করেনি, যেখানে লগ ফাইলগুলি খুঁজে পেতে পারে।
আহমেদভ

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

67

লগারটি এই জাতীয়ভাবে ঘোষণা করা উচিত:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

সুতরাং আপনি যদি নিজের শ্রেণীর নামটি রিফেক্টর করেন তবে তা অনুসরণ করে।

আমি উদাহরণ সহ জাভা লগার সম্পর্কে একটি নিবন্ধ লিখেছিলাম ।


53

লগিংয়ের জন্য অনেকগুলি উদাহরণ এবং বিভিন্ন ধরণের রয়েছে। কটাক্ষপাত java.util.logging প্যাকেজ।

উদাহরণ কোড:

import java.util.logging.Logger;

public class Main {

  private static Logger LOGGER = Logger.getLogger("InfoLogging");

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

ক্লাসের নামটি হার্ড-কোডিং ছাড়াই :

import java.util.logging.Logger;

public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

15
কেন লগ নাম হিসাবে সেট না Main.class.getSimpleName()? এইভাবে রিফ্যাক্টরিং সরঞ্জামটি প্রয়োজনে এটি যথাযথভাবে পরিবর্তন করতে চলেছে এবং এখনও এটি আপনার দ্বিতীয় সমাধানের মতো চতুর নয়।
পাইজুসন

3
লগার নামের জন্য স্ট্যাকট্র্যাস করা হ্যাক, ধীর এবং অপ্রচলিত। এটি এওপি প্রক্সি বা অন্যান্য বাইট কোডিং অসাধারণের জন্য অদ্ভুত নামগুলিও ভেঙে দেবে।
অ্যাডাম জেন্ট

9
স্ট্যাকট্রেস ব্যবসায়ের জন্য -1। এটি ধীর এবং সম্ভাব্যভাবে সংকলক অপ্টিমাইজেশন প্রতিরোধ করে।
ফুজি 21

4
লগার শুরু করার সময় কেন "স্বচ্ছলতা" ব্যাপার হবে? মন্থরতার উল্লেখগুলি হ'ল বেশিরভাগ লোকেরা অকাল অপটিমাইজেশন বলবেন (হ্যাঁ, কোডটি কিছুটা হ্যাকিশ দেখাচ্ছে)।
মিকম

3
@ অ্যান্ড্রুএমসি কিনলে কোন পরিস্থিতিতে এটি কোনও কিছু ভেঙে দেয়? যদি লগার ট্যাগটি বর্গের নামের মতো হয় বলে মনে হয় তবে এটি করা পুরোপুরি ঠিক আছে। রিফ্যাক্টরিং সরঞ্জামগুলি স্বয়ংক্রিয়ভাবে এটির পুনঃনামকরণ করতে চলেছে, যদি এটি একটি হার্ড-কোডেড স্ট্রিং ছিল তবে রিফ্যাক্টরিং সরঞ্জামটি এটি এড়িয়ে যেতে পারে বা "আপনি কি এটিরও নাম পরিবর্তন করতে চান?" বলে রাখতে পারেন।
পাইজুসন

23

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

এসএলএফ 4 জে বিভিন্ন লগিং বাস্তবায়ন সমর্থন করে। এটি স্ট্যান্ডার্ড-আউট, লগ 4 জে বা লগব্যাক (লগ 4 জে সুপারিশ করা) ব্যবহার করতে পারে।

http://www.slf4j.org/

http://logback.qos.ch/


9

আমি ব্যক্তিগতভাবে মিনলগ ব্যবহার করব personally এটি অত্যন্ত সহজ, লগিং ক্লাসটি কোডের কয়েকশ লাইনের মতো।


3
নূন্যতম পদচিহ্নগুলির জন্য, এটি চয়ন করার জন্য লাইব্রেরি।
এইচ

0

আমি আপনাকে পরামর্শ দেব যে আপনি অ্যাপাচি-এর কমন্স লগিং ইউটিলিটি ব্যবহার করুন use এটি অত্যন্ত স্কেলেবল এবং বিভিন্ন লগারের জন্য পৃথক লগ ফাইলগুলি সমর্থন করে। এখানে দেখুন


11
ভাল পরামর্শ! তবুও তারা যা জিজ্ঞাসা করেছে তার জবাব দেওয়ার চেষ্টা করুন, অন্যথায় কেবল একটি মন্তব্য দিন;)
অর্ডিয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.