Java.util.logging ব্যবহার করবেন না কেন?


351

আমার জীবনে প্রথমবারের মতো আমি নিজেকে এমন অবস্থানে দেখতে পেলাম যেখানে আমি একটি জাভা এপিআই লিখছি যা খোলা উত্সাহিত হবে। আশা করি আরও অনেক প্রকল্পের অন্তর্ভুক্ত হবে।

লগিংয়ের জন্য আমি (এবং প্রকৃতপক্ষে আমি যাদের সাথে কাজ করি) সর্বদা JUL (java.util.logging) ব্যবহার করেছি এবং এর সাথে কখনও কোনও সমস্যা হয়নি। তবে এখন আমার এপিআই বিকাশের জন্য আমার কী করা উচিত তা আরও বিশদে বুঝতে হবে। আমি এ নিয়ে কিছু গবেষণা করেছি এবং যে তথ্য পেয়েছি সেগুলি নিয়ে আমি আরও বিভ্রান্ত হয়ে পড়েছি। অতএব এই পোস্ট।

যেহেতু আমি জুলু থেকে এসেছি আমি সে বিষয়ে পক্ষপাতদুষ্ট। বাকিটা সম্পর্কে আমার জ্ঞান এত বড় নয়।

আমি যে গবেষণাটি করেছি তা থেকেই আমি এই কারণগুলি নিয়ে এসেছি কেন লোকেরা JUL পছন্দ করে না:

  1. "আমি জাভা উন্নয়নশীল অনেক আগে সূর্যের জুলাই মুক্তি শুরু এটা শুধু আমার বদলে লগিং-কাঠামোর-এক্স চালিয়ে যাওয়ার জন্য নতুন কিছু শিখতে সহজ ছিল" । হুম। আমি মজা করছি না, এটি আসলে লোকেরা বলে। এই যুক্তি দিয়ে আমরা সবাই কোবল করতে পারি। (তবে আমি অবশ্যই এটি একটি অলস বন্ধু হিসাবে নিজেকে সম্পর্কিত করতে পারি)

  2. "আমি জুলেতে লগিং স্তরের নাম পছন্দ করি না" । ঠিক আছে, গুরুত্ব সহকারে, এটি একটি নতুন নির্ভরতা প্রবর্তনের কারণ হিসাবে যথেষ্ট নয়।

  3. "আমি জুল থেকে আউটপুট মানক বিন্যাস পছন্দ করি না" । হুম। এটি কেবল কনফিগারেশন। আপনাকে কোড-ভিত্তিক কিছু করতে হবে না। (সত্য, পুরানো দিনগুলি ফিরে আসার জন্য আপনার নিজের ফর্ম্যাটর ক্লাসটি তৈরি করতে হতে পারে)।

  4. "আমি অন্যান্য লাইব্রেরি ব্যবহার করি যা লগিং-ফ্রেমওয়ার্ক-এক্সও ব্যবহার করে তাই আমি কেবল এটি ব্যবহার করা সহজ বলে মনে করি" । এটি একটি বিজ্ঞপ্তি যুক্তি, তাই না? 'প্রত্যেকে' কেন লগিং-ফ্রেমওয়ার্ক-এক্স ব্যবহার করে এবং জুল নয়?

  5. "অন্য প্রত্যেকে লগিং-ফ্রেমওয়ার্ক-এক্স ব্যবহার করছে" । এটি আমার কাছে উপরের একটি বিশেষ কেস। সংখ্যাগরিষ্ঠতা সবসময় সঠিক হয় না।

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

একই জিনিস (লগিং) করার একাধিক উপায়ে আলিঙ্গন করার পরিবর্তে আমাদের প্রশ্ন করা উচিত নয় যে এগুলি প্রথম স্থানে কেন প্রয়োজনীয় ছিল? (এবং দেখুন যে কারণগুলি এখনও বিদ্যমান কিনা)

ঠিক আছে, আমার গবেষণাটি এখনও অবধি বেশ কয়েকটি জিনিস নিয়ে গেছে যা আমি দেখতে পাচ্ছি জুলের সাথে আসল সমস্যা হতে পারে :

  1. পারফরম্যান্স । কেউ কেউ বলেন যে এসএলএফ 4 জে পারফরম্যান্স বাকীগুলির চেয়ে সেরা। এটি আমার কাছে অকালীন অপ্টিমাইজেশনের একটি মামলা বলে মনে হচ্ছে। যদি আপনাকে প্রতি সেকেন্ডে কয়েকশ মেগাবাইট লগ করতে হয় তবে আমি নিশ্চিত নই যে আপনি যেভাবেই সঠিক পথে আছেন। জুল ইউএলও বিকশিত হয়েছে এবং জাভা ১.৪ এ আপনি যে পরীক্ষা করেছেন তা আর সত্য হতে পারে না। আপনি এটি সম্পর্কে এখানে পড়তে পারেন এবং এই ফিক্সটি এটি জাভা into-এ পরিণত করেছে Many তবে টেমপ্লেট ভিত্তিক লগিং এই ব্যয়টিকে এড়িয়ে চলে এবং এটি জুলিয়ায়ও বিদ্যমান। ব্যক্তিগতভাবে আমি কখনই টেমপ্লেট ভিত্তিক লগিং লিখি না। তার জন্য খুব অলস। উদাহরণস্বরূপ আমি যদি এটি JUL এর সাথে করি:

    log.finest("Lookup request from username=" + username 
       + ", valueX=" + valueX
       + ", valueY=" + valueY));
    

    আমার আইডিই আমাকে সতর্ক করবে এবং অনুমতি চাইবে যে এটিতে এটি পরিবর্তন করা উচিত:

    log.log(Level.FINEST, "Lookup request from username={0}, valueX={1}, valueY={2}", 
       new Object[]{username, valueX, valueY});
    

    .. যা আমি অবশ্যই গ্রহণ করব। অনুমতি দেওয়া ! আপনার সাহায্যের জন্য ধন্যবাদ।

    সুতরাং আমি আসলে এই জাতীয় বিবৃতি নিজেই লিখি না, এটি আইডিই দ্বারা সম্পন্ন হয়।

    পারফরম্যান্সের ইস্যুতে উপসংহারে আমি এমন কিছু পাইনি যা সুপারিশ করবে যে প্রতিযোগিতার তুলনায় জুলের পারফরম্যান্স ঠিক নয়।

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

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

    1. আউটপুট গন্তব্যগুলির জন্য 99.5% প্রয়োজনের বাক্সটি জুল-আউট-অফ-বক্সের দ্বারা আবৃত।
    2. বিশেষ প্রয়োজনগুলি অন্য কোনও কিছুর শীর্ষে না রেখে JUL এর শীর্ষে কাস্টম হ্যান্ডলারের দ্বারা সরবরাহ করা যেতে পারে। আমার কাছে এমন কিছুই নেই যা প্রস্তাব দেয় যে অন্য লগিং ফ্রেমওয়ার্কের তুলনায় জুলুলের জন্য সিসলগ আউটপুট হ্যান্ডলারটি লিখতে আরও বেশি সময় লাগে।

আমি সত্যিই উদ্বিগ্ন যে আমি কিছু উপেক্ষা করেছি। JUL ব্যতীত লগিং facades এবং লগিং বাস্তবায়নের ব্যবহার এত ব্যাপক যে আমাকে এই সিদ্ধান্তে পৌঁছাতে হবে যে কেবল আমি বুঝতে পারি না। এই প্রথম হবে না, আমি ভয় করি। :-)

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

পারফরম্যান্স পরীক্ষার

(07-জুলাই -২০২২ এ নোলান 00০০ দ্বারা বিভাগ যুক্ত করা হয়েছে)

এসএলএফ 4 জে'র প্যারামিট্রাইজেশন জুলের তুলনায় 10 গুণ বা আরও বেশি দ্রুতগতির বিষয়ে নীচে সেকির একটি উল্লেখ রয়েছে। তাই আমি কিছু সাধারণ পরীক্ষা করা শুরু করেছি। প্রথম নজরে দাবিটি অবশ্যই সঠিক। এখানে প্রাথমিক ফলাফল (তবে পড়ুন!):

  • কার্যকর করার সময় এসএলএফ 4 জে, ব্যাকএন্ড লগব্যাক: 1515
  • কার্যকর করার সময় এসএলএফ 4 জে, ব্যাকএন্ড জুল: 12938
  • ফাঁসির সময় জুল: 16911

উপরের সংখ্যাগুলি এমসেকস তাই কম ভাল। সুতরাং 10 গুণ পারফরম্যান্স পার্থক্য প্রথম আসলে বেশ কাছাকাছি হয়। আমার প্রাথমিক প্রতিক্রিয়া: এটি অনেক!

এখানে পরীক্ষার মূল বিষয়। যেমন একটি পূর্ণসংখ্যা দেখা যায় এবং একটি লুপে একটি স্ট্রিং তৈরি করা হয় যা লগ স্টেটমেন্টে ব্যবহৃত হয়:

    for (int i = 0; i < noOfExecutions; i++) {
        for (char x=32; x<88; x++) {
            String someString = Character.toString(x);
            // here we log 
        }
    }

(আমি লগ স্টেটমেন্টটিতে আদিম উপাত্ত টাইপ (এই ক্ষেত্রে কোনও ইনট) এবং আরও জটিল ডেটা টাইপ (এক্ষেত্রে একটি স্ট্রিং) রাখতে চেয়েছিলাম wanted এটি নিশ্চিত নয় তবে এটি আপনার কাছে রয়েছে))

এসএলএফ 4 জে লগের বিবৃতি:

logger.info("Logging {} and {} ", i, someString);

জুলুলের জন্য লগ স্টেটমেন্ট:

logger.log(Level.INFO, "Logging {0} and {1}", new Object[]{i, someString});

প্রকৃত পরিমাপ হওয়ার আগে একবার পরীক্ষা করা একই পরীক্ষা দিয়ে জেভিএম 'ওয়ার্ম আপ' হয়েছিল। জাভা 1.7.03 উইন্ডোজ 7. এ ব্যবহৃত হয়েছিল এসএলএফ 4 জে (v1.6.6) এবং লগব্যাক (v1.0.6) এর সর্বশেষ সংস্করণ ব্যবহার করা হয়েছিল। স্টডআউট এবং স্ট্ডার নাল ডিভাইসে পুনঃনির্দেশিত হয়েছিল।

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

বিটিডব্লিউ: আমি প্রথমবারের মতো এসএলএফ 4 জে বা লগব্যাকের সাথে কাজ করেছি The একটি মনোরম অভিজ্ঞতা। আপনি যখন শুরু করছেন তখন অবশ্যই জুল ইউএসএল অবশ্যই অনেক কম স্বাগত।

পরীক্ষার পারফরম্যান্স (অংশ 2)

(08-JUL-2012-এ nolan600 দ্বারা বিভাগ যুক্ত করা হয়েছে)

যেহেতু এটি দেখা যাচ্ছে যে আপনি জেআুলএলগুলিতে কীভাবে আপনার প্যাটার্নটি কনফিগার করেন তা কার্য সম্পাদনের জন্য গুরুত্বপূর্ণ নয়, অর্থাত্ এতে উত্সের নাম অন্তর্ভুক্ত রয়েছে কি না। আমি খুব সাধারণ প্যাটার্ন দিয়ে চেষ্টা করেছি:

java.util.logging.SimpleFormatter.format="%4$s: %5$s [%1$tc]%n"

এবং এটি উপরের সময়গুলিতে মোটেও পরিবর্তন করে নি। আমার প্রোফাইলার প্রকাশ করেছেন যে লগার এখনও কলগুলিতে প্রচুর সময় ব্যয় করেছিল getSourceClassName()এমনকি এটি আমার প্যাটার্নের অংশ না হলেও। প্যাটার্নটি কোনও বিষয় নয়।

অতএব আমি পারফরম্যান্সের ইস্যুতে শেষ করছি যে কমপক্ষে পরীক্ষিত টেম্পলেট ভিত্তিক লগ স্টেটমেন্টের জন্য মোটামুটি 10 ​​টির একটি ফ্যাক্টর বলে মনে হচ্ছে JUL (ধীর) এবং এসএলএফ 4 জে + লগব্যাক (দ্রুত) এর মধ্যে বাস্তব পারফরম্যান্সের পার্থক্যের ক্ষেত্রে। ঠিক যেমন সিকি বলেছিলেন।

আমি আর একটি জিনিসও দেখতে পাচ্ছি যে এসএলএফ 4 জে getLogger()কলটি জুলের ডাইটোর চেয়ে অনেক বেশি ব্যয়বহুল। (আমার প্রোফাইলার সঠিক হলে 95 এমএস বনাম 0.3 এমএস)। এইবার বুঝতে পারছি. এসএলএফ 4 জে অন্তর্নিহিত লগিং প্রয়োগের বাঁধাইয়ের জন্য কিছু সময় করতে হবে। এটি আমাকে ভয় দেয় না। কোনও অ্যাপ্লিকেশন চলাকালীন এই কলগুলি কিছুটা বিরল হওয়া উচিত। দৃness়তা আসল লগ কলগুলিতে হওয়া উচিত।

চূড়ান্ত উপসংহার

(08-JUL-2012-এ nolan600 দ্বারা বিভাগ যুক্ত করা হয়েছে)

আপনার সমস্ত উত্তরের জন্য আপনাকে ধন্যবাদ। আমি প্রথমে যা ভেবেছিলাম তার বিপরীতে আমি আমার API এর জন্য SLF4J ব্যবহার করার সিদ্ধান্ত নিয়েছে। এটি বিভিন্ন জিনিস এবং আপনার ইনপুট উপর ভিত্তি করে:

  1. এটি স্থাপনার সময়ে লগ প্রয়োগকরণ চয়ন করার জন্য নমনীয়তা দেয়।

  2. অ্যাপ্লিকেশন সার্ভারের ভিতরে চলাকালীন JUL এর কনফিগারেশনের নমনীয়তার অভাবজনিত সমস্যা।

  3. আপনি যদি লগব্যাকের সাথে দম্পতি করেন তবে এসএলএফ 4 জে অবশ্যই উপরে উপরে বিস্তারিত হিসাবে অনেক দ্রুতগতিযুক্ত। এমনকি এটি যদি মোটামুটি পরীক্ষা ছিল তবেও আমার বিশ্বাস করার কারণ আছে যে জুলুয়ালের চেয়ে এসএলএফ 4 জে + লগব্যাকের ক্ষেত্রে আরও অনেক প্রচেষ্টা অপ্টিমাইজেশনে চলে গেছে।

  4. নথিপত্র। এসএলএফ 4 জেয়ের জন্য ডকুমেন্টেশনটি কেবল আরও অনেক বিস্তৃত এবং সুনির্দিষ্ট।

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

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

সুতরাং অদ্ভুত যে ঘটনাটি ঘটেছে তা হ'ল আমি আসলে এসএলএফ 4 জে কিছুটা কাজ করার পরে জুলুলের সাথে বেশ বিরক্ত হয়েছিলাম। আমি এখনও আফসোস করছি যে এটি জুলাইয়ের সাথে এইভাবেই হতে হবে। JUL নিখুঁত থেকে দূরে কিন্তু ধরনের কাজ করে। যথেষ্ট যথেষ্ট ভাল না। Propertiesউদাহরণ হিসাবে এটি সম্পর্কেও বলা যেতে পারে তবে আমরা বিমূর্ত সম্পর্কে চিন্তা করি না যাতে লোকেরা তাদের নিজস্ব কনফিগারেশন লাইব্রেরিতে এবং আপনার কাছে কী থাকতে পারে। আমি মনে করি যে কারণটি Propertiesবারের ঠিক উপরে এসেছিল যখন বিপরীতে আজকের জুলের পক্ষে সত্য ... এবং অতীতে এটি শূন্যে এসেছিল কারণ এটি বিদ্যমান ছিল না।


8
আমি একটি সমাপ্তি জিজ্ঞাসা করব না, কারণ এই ভালভাবে উপস্থাপিত প্রশ্নটি আকর্ষণীয়, তবে আপনি এফএকিউ পড়েন তবে এটি বর্ডারলাইন: মতামতের উপর ভিত্তি না করে একটি নির্দিষ্ট অনন্য উত্তর খুঁজে পাওয়া শক্ত হবে hard
সাগুরেট

আপনি যা মিস করতে পারেন তা হ'ল অনেক কাঠামো লেখক JUL ব্যবহার করার চেষ্টা ছেড়ে দিয়েছিলেন এবং আপনি ভ্যানিলা জাভা তৈরি না করলে এটি ব্যবহার করা প্রায়শই শক্ত।
সাগুরেট

3
জনপ্রিয় লগিং ফ্রেমওয়ার্ক (গুলি) এর পূর্বে জুল উল্লেখ করার সময় জেনেরিক শব্দটি "লগিং-ফ্রেমওয়ার্ক-এক্স" ব্যবহার করা বিভ্রান্তিকর। এই ক্ষেত্রে আপনার "log4j" ব্যবহার করা উচিত। জুলিয়া প্রকাশের পরে অন্যান্য জনপ্রিয় ফ্রেমওয়ার্ক যেমন এসএলএফ 4 জে এবং লগব্যাক ভাল এসেছে came
Ceki

1
@Acuariano। নেট প্রকল্পটি ক্লাসপথে কোন লগিং ফ্রেমওয়ার্কটি উপলব্ধ তা পরীক্ষা করার জন্য কেবল প্রতিচ্ছবি ব্যবহার করছে। উত্স জন্য এখানে দেখুন । দেখুন InternalLoggerFactory.java
পেরের

1
@ এক্সেনোটেরাক্সাইড আরও গুরুত্বপূর্ণ হবে জাভা 9-র আপডেট java.lang.System.Logger, যা এটি চালু হয়েছিল , এটি একটি ইন্টারফেস , যা আপনি যতটা প্রকৃত লগিং ফ্রেমওয়ার্কটি চান তা পুনঃনির্দেশিত করা যেতে পারে, যতক্ষণ না সেই কাঠামোটি ধরা পড়ে এবং সেই ইন্টারফেসটির বাস্তবায়ন সরবরাহ করে। মডুলারাইজেশনের সাথে সম্মিলিত, আপনি এমনকি java.util.loggingযদি কোনও আলাদা কাঠামো পছন্দ করেন তবে আপনি একটি বান্ডিলযুক্ত জেআরই নেই এমন একটি অ্যাপ্লিকেশন স্থাপন করতে পারেন।
হলগার

উত্তর:


207

দাবি অস্বীকার: আমি লগ 4 জে, এসএলএফ 4 জে এবং লগব্যাক প্রকল্পগুলির প্রতিষ্ঠাতা।

এসএলএফ 4 জে পছন্দ করার জন্য উদ্দেশ্যমূলক কারণ রয়েছে। একটির জন্য, এসএলএফ 4 জে শেষ-ব্যবহারকারীর স্বাধীনতাকে অন্তর্নিহিত লগিং ফ্রেমওয়ার্কটি চয়ন করতে দেয় । তদতিরিক্ত, তাত্পর্যপূর্ণ ব্যবহারকারীরা লগব্যাক পছন্দ করেন যা লগ 4j এর বাইরে ক্ষমতা সরবরাহ করে , জুল পিছিয়ে যাওয়ার পথে। বৈশিষ্ট্য অনুসারে জুল বেশ কয়েকটি ব্যবহারকারীর পক্ষে পর্যাপ্ত হতে পারে তবে অন্য অনেকের পক্ষে এটি ঠিক নয়। সংক্ষেপে, যদি লগিং আপনার পক্ষে গুরুত্বপূর্ণ হয় তবে আপনি অন্তর্নিহিত বাস্তবায়ন হিসাবে লগব্যাক সহ এসএলএফ 4 জে ব্যবহার করতে চান। লগিং যদি গুরুত্বহীন হয় তবে জুল ভাল আছে।

তবে ওএস বিকাশকারী হিসাবে আপনার নিজের ব্যবহারকারীর পছন্দগুলি কেবল আপনার নিজেরাই নয় account এটি অনুসরণ করে যে আপনার এসএলএফ 4 জে গ্রহণ করা উচিত নয় কারণ আপনি নিশ্চিত যে SLF4J জুলার চেয়ে ভাল তবে এটি বেশিরভাগ জাভা বিকাশকারীরা বর্তমানে (জুলাই ২০১২) এসএলএফ 4 জে তাদের লগিং এপিআই হিসাবে পছন্দ করেন। যদি শেষ পর্যন্ত আপনি জনপ্রিয় মতামত সম্পর্কে যত্ন না নেওয়ার সিদ্ধান্ত নেন তবে নিম্নলিখিত বিষয়গুলি বিবেচনা করুন:

  1. যারা জুলকে বেশি পছন্দ করেন তারা সুবিধার্থে এটি করেন কারণ জুলকে জেডিকে দিয়ে বান্ডিল করা হয়। আমার জানা মতে জুলের পক্ষে অন্য কোন উদ্দেশ্যমূলক যুক্তি নেই
  2. জুলের জন্য আপনার নিজের পছন্দটি কেবল এটিই একটি পছন্দ

সুতরাং, আপাতদৃষ্টিতে সাহসী হওয়া সত্ত্বেও জনগণের মতামতের "র্ধ্বে "শক্ত তথ্য" রাখা এই ক্ষেত্রে একটি যৌক্তিক ভুল।

যদি এখনও নিশ্চিত না হন, জেবি নিজেট একটি অতিরিক্ত এবং শক্তিশালী যুক্তি দিয়েছিলেন:

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

যদি আপনি যে কোনও কারণে এসএলএফ 4 জ এপিআইকে ঘৃণা করেন এবং এটির ব্যবহারটি আপনার কাজ থেকে মজাদার স্নিগ্ধ হয়ে যায়, তবে সমস্ত উপায়ে জুলের দিকে যাবেন, জুল-এসএলএফ 4 জে পুনর্নির্দেশ করার উপায় রয়েছে

যাইহোক, জুল প্যারামিট্রাইজেশনটি এসএলএফ 4 জ এর চেয়ে কমপক্ষে 10 গুণ কম ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়।


2
@ সেকি আপনি আপনার দাবি অস্বীকার করার বিষয়ে কিছুটা ব্যাখ্যা করতে চাইতে পারেন যাতে এটি লগ 4 জে, এসএলএফ 4 জে এবং লগব্যাক প্রকল্পগুলিতে আপনার বর্তমান ভূমিকার উল্লেখ করে। স্বাভাবিকভাবে আপনার পক্ষপাতিত্ব ব্যাখ্যা করা হয়।
থরবজর্ন রাভন অ্যান্ডারসন

2
এই দাবিটির জন্য কি কিছু সমর্থন আছে যে বেশিরভাগ জাভা বিকাশকারীরা তাদের লগিং এপিআই হিসাবে এসএলএফ 4 জে পছন্দ করে?
অলিভিয়ার কিলিক্স

3
আমার পোস্টের সারমর্মটি হ'ল বিভিন্ন বিকাশকারীদের আলাদা আলাদা পছন্দ থাকে যা বিতর্কের বাইরে বলে মনে হয়। হ্যাঁ?
Ceki

1
সত্যই যদিও, আমি জাভা 11 (বা যা শেষ হতে পারে) এর 2018 বেনমার্কগুলি দেখতে এবং অ্যাসিঙ্ক মোডে লগ 4 জ 2 এর বিপরীতে দেখতে চাই।
xenoterracide

5
আমি এখানে, এসএলএফ 4 জে ব্যবহার করছি এবং এখনও আমার অন্যান্য লাইব্রেরি ব্যবহারের লগিং ফ্রেমওয়ার্কগুলি মোকাবেলা করতে হবে। এসএলএফ 4 জে ব্যবহার করে ভিন্ন ভিন্ন লগার সমস্যা সমাধান হয় না, এটি কেবল এটি আরও খারাপ করে তোলে। xkcd.com/927
চার্লি

34
  1. java.util.loggingজাভা 1.4 চালু হয়েছিল। এর আগে লগিংয়ের জন্য অনেকগুলি ব্যবহার ছিল, এ কারণেই আরও অনেক লগিং এপিআই বিদ্যমান। সেই সমস্ত API গুলি যেখানে জাভা 1.4 এর আগে ভারী ব্যবহৃত হয়েছিল এবং এইভাবে একটি দুর্দান্ত মার্কেটশেয়ার ছিল যা 1.4 প্রকাশের সময় কেবল 0 এ নেমে আসে না।

  2. জুলুল এত বড় কিছু শুরু করে নি, আপনি উল্লেখ করেছেন এমন অনেক কিছুই যেখানে আপনি উল্লেখ করেছেন 1.4 তে অনেক খারাপ এবং কেবল 1.5 তে উন্নত হয়েছে (এবং আমি 6 সালেও অনুমান করি তবে আমি খুব বেশি নিশ্চিত নই)।

  3. JUL একই JVM- এ বিভিন্ন কনফিগারেশন সহ একাধিক অ্যাপ্লিকেশনগুলির জন্য ভাল উপযুক্ত নয় (মনে করুন একাধিক ওয়েব অ্যাপ্লিকেশন যাতে ইন্টারঅ্যাক্ট করা উচিত নয়)। টমক্যাটকে সেই কাজটি করার জন্য কয়েকটি হুপের মধ্য দিয়ে ঝাঁপিয়ে পড়তে হবে (আমি সঠিকভাবে বুঝতে পারলে JUL কে কার্যকরভাবে পুনরায় বাস্তবায়ন করা)।

  4. আপনার গ্রন্থাগারগুলি কী লগিং ফ্রেমওয়ার্ক ব্যবহার করে তা আপনি সর্বদা প্রভাবিত করতে পারবেন না। সুতরাং এসএলএফ 4 জে (যা অন্যান্য লাইব্রেরির উপরে যা আসলে খুব পাতলা এপিআই স্তর) ব্যবহার করে সমগ্র লগিং ওয়ার্ল্ডের কিছুটা সামঞ্জস্যপূর্ণ ছবি রাখতে সহায়তা করে (যাতে আপনি একই সিস্টেমে লাইব্রেরি লগইন করার সময় অন্তর্নিহিত লগিং ফ্রেমওয়ার্কটি স্থির করতে পারেন)।

  5. গ্রন্থাগারগুলি সহজেই পরিবর্তন করতে পারে না। যদি কোনও লাইব্রেরির পূর্ববর্তী সংস্করণ লগিং-লাইব্রেরি-এক্স ব্যবহার করতে ব্যবহৃত হয় তবে এটি সহজেই লগিং-গ্রন্থাগার-ওয়াইতে স্যুইচ করতে পারে না (উদাহরণস্বরূপ জুলুল), যদিও পরবর্তীটি স্পষ্টতই সুপারিয়াস হয়: সেই লাইব্রেরির যে কোনও ব্যবহারকারীর শিখতে হবে নতুন লগিং কাঠামো এবং (কমপক্ষে) তাদের লগিং পুনরায় কনফিগার করুন। এটি একটি বড় সংখ্যা নেই, বিশেষত যখন এটি বেশিরভাগ লোকের কাছে কোনও লাভ হয় না।

আমার মনে হয় যা কিছু বলেছে তা হল এই দিনগুলিতে অন্যান্য লগিং ফ্রেমওয়ার্কের জন্য কমপক্ষে JUL হ'ল কমপক্ষে বৈধ বিকল্প।


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

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

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

3
@ নোলান 000০০০: এই বাক্যাংশটি সম্পর্কে বিশদে যাওয়ার জন্য আমি নির্দিষ্টকরণগুলি সম্পর্কে পর্যাপ্ত পরিমাণে জানি না এবং এটি আমি যে বক্তব্য করছি তা আসলে নয়। এমনকি যদি জেএল এখন তৃতীয় পক্ষের কাঠামোর সাথে সমান হয় তবে জড়তা এবং বিদ্যমান অবকাঠামোটি স্যুইচ না করার দৃ a় কারণ। উদাহরণস্বরূপ, যদি গ্রন্থাগার এক্স সংস্করণ ১.১ এ slf4j ব্যবহার করে, 1.2 টিতে (বা আরও 2.0) JUL এ স্যুইচ করা অনেক ব্যবহারকারীদের জন্য বড় সমস্যা হয়ে উঠবে (যারা ইতিমধ্যে সঠিকভাবে পুরানো সিস্টেমটি কনফিগার করেছেন এবং কোনও আপাত লাভের জন্য এটি পুনরায় করতে হবে) ।
জোচিম সৌর

@ nolan6000 এমনকি আপনি ইতিহাসের যত্ন না নিলেও , আপনার অ্যাপ্লিকেশনগুলিতে আপনি যে লাইব্রেরিগুলি ব্যবহার করেন তা অবশ্যই করেন certainly এটি আপনার চেয়ে আলাদা লগিং কাঠামোটি ব্যবহার করার কারণে কোনও লাইব্রেরি ফেলে দেওয়ার কোনও মজা নেই।
থরবজর্ন রাভন অ্যান্ডারসন

29

আইএএমএইচও, slf4j এর মতো লগিং ফ্যাকাস ব্যবহারের প্রধান সুবিধাটি হ'ল আপনি লাইব্রেরির শেষ ব্যবহারকারীকে শেষের ব্যবহারকারীর কাছে আপনার পছন্দ চাপিয়ে দেওয়ার পরিবর্তে কোন কংক্রিট লগিং বাস্তবায়ন চান তা চয়ন করতে দিন।

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


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

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

6

আমি আপনার মতো আমার অনুভবের মতো জুল ইউএল শুরু করেছিলাম কারণ তাৎক্ষণিকভাবে যাওয়া সবচেয়ে সহজ ছিল was তবে বছরের পর বছর ধরে, আমি এই ইচ্ছাটি করতে এসেছি যে আমি বেছে নিতে আরও কিছুটা সময় কাটিয়েছি।

আমার এখন প্রধান সমস্যাটি হ'ল আমাদের কাছে প্রচুর পরিমাণে 'লাইব্রেরি' কোড রয়েছে যা অনেকগুলি অ্যাপ্লিকেশনে ব্যবহৃত হয় এবং তারা সকলেই জুল ব্যবহার করে। আমি যখনই কোনও ওয়েব-পরিষেবা টাইপ অ্যাপ্লিকেশনটিতে এই সরঞ্জামগুলি ব্যবহার করি তখনই লগিংটি কেবল অদৃশ্য হয়ে যায় বা অনুমানযোগ্য বা অদ্ভুত কোনও জায়গায় যায়।

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

আমাদের আফসোস - অবশ্যই - গ্রন্থাগার কোডটি প্যারামিটারাইজড লগিং ব্যবহার করে না তবে এটি এখন এবং যখন প্রয়োজন হিসাবে পুনরায় তৈরি করা যেতে পারে।

আমরা মুখোমুখি তৈরি করতে slf4j ব্যবহার করেছি।


1
কোনও কারণ আপনি কেবল slf4j বিতরণে "reddax java.util.logging to slf4j" প্যাকেজটি ব্যবহার করেন নি?
থরবজর্ন রাভন অ্যান্ডারসন

2
আমরা করেছি, তবে খুব কম মূল্যবান কারণ slf4j এ যাওয়ার প্রাথমিক সুবিধাটি দক্ষ প্যারামিটারাইজড লগিং ging আমরা যদি প্রথম থেকেই এটি ব্যবহার করতাম তবে এখন আমাদের কোনও কাজ করার দরকার পড়েনি।
ওল্ডরুকমুডিজিয়ন

1
আমি সম্মত হই যে এটি slf4j এর কম ঝুলন্ত ফল।
থরবজর্ন রাভন অ্যান্ডারসন

3

লগব্যাক -১.১..7 ওভার এসএলডি, জাভা ১.৮, উইন 64৪ এ আমি slf4j-1.7.21 এর বিপরীতে জুল দৌড়েছি

জুল 130 এম লুপের জন্য 48449 এমএস, লগব্যাক 27185 এমএস ছুটেছিল।

তবুও, আমার জন্য আরও কিছু গতি এবং কিছুটা ভাল এপিআই 3 লাইব্রেরি এবং 800K এর মূল্য নয়।

package log;

import java.util.logging.Level;
import java.util.logging.Logger;

public class LogJUL
{
    final static Logger logger = Logger.getLogger(LogJUL.class.getSimpleName());

    public static void main(String[] args) 
    {
        int N = 1024*1024;

        long l = System.currentTimeMillis();

        for (int i = 0; i < N; i++)
        {
            Long lc = System.currentTimeMillis();

            Object[] o = { lc };

            logger.log(Level.INFO,"Epoch time {0}", o);
        }

        l = System.currentTimeMillis() - l;

        System.out.printf("time (ms) %d%n", l);
    }
}

এবং

package log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogSLF
{
    static Logger logger = LoggerFactory.getLogger(LogSLF.class);


    public static void main(String[] args) 
    {
        int N = 1024*1024;

        long l = System.currentTimeMillis();

        for (int i = 0; i < N; i++)
        {
            Long lc = System.currentTimeMillis();

            logger.info("Epoch time {}", lc);
        }

        l = System.currentTimeMillis() - l;

        System.out.printf("time (ms) %d%n", l);
    }

}

2
আপনি পছন্দ মতো পছন্দ তুলনা করছেন না। আপনি কেন স্পষ্টভাবে জুলের জন্য একটি অ্যারে তৈরি করছেন? আমার ধারণা এটি কারণ কারণ slf4j এর এক-তর্ক-ওভারলোডের অভাব রয়েছে logger.info()। সুতরাং আপনি ইচ্ছাকৃতভাবে slf4j এর ইন্টারফেসের একটি ঘাটতি পূরণ করতে জুল পারফরম্যান্সকে পঙ্গু করছেন। পরিবর্তে আপনার উভয় পদ্ধতি কোডিং করা উচিত যেভাবে তারা idiomatic কোড করে।
ক্লিটোস কিরিয়াকু

2
আপনি এটি ভুল বুঝেছেন। আপনাকে অতিরিক্ত 800 কে ব্যবহার করতে হবে না। ঐক্যমত্য যে খুব পাতলা SLF4J API- টি ব্যবহার করার মূল্য শুধুমাত্র ~ 28K কারণ তারপর আপনি (বা অন্যান্য যারা হয়তো পুনঃব্যবহারের একদিন আপনার কোড!) জুলাই, Logback, Log4j ইত্যাদি SLF4J মধ্যে অবাধে স্যুইচ করতে পারেন। SLF4J থেকে JUL ব্রিজ (slf4j-jdk ... জার) কেবল ~ 9 কে।
ঝুঁকিপূর্ণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.