স্ট্রিং কনটেনটেশনের পরিবর্তে ger with দিয়ে ফর্ম্যাট করার সুবিধাগুলি লগার lf


105

{}স্ট্রিং কনটেন্টেশনের পরিবর্তে ব্যবহারের কোনও সুবিধা আছে ?

Slf4j থেকে একটি উদাহরণ

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

পরিবর্তে

logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);

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

উত্তর:


77

এটা তোলে হয় স্ট্রিং সংযুক্তকরণের কর্মক্ষমতা সম্পর্কে। আপনার ঘন লগিং বিবৃতি থাকলে এটি সম্ভাব্য তাৎপর্যপূর্ণ।

(এসএলএফ 4 জে 1.7 এর আগে) তবে কেবল দুটি পরামিতিই সম্ভব

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

এই ক্ষেত্রে যেখানে আপনার 2 টিরও বেশি প্রয়োজন এবং আপনি প্রাক-1.7 এসএলএফ 4 জে আটকে আছেন, তারপরে কেবল স্ট্রিং কনকেন্টেশন বা ব্যবহার করুন new Object[] { param1, param2, param3, ... }। তাদের মধ্যে পর্যাপ্ত পরিমাণে থাকতে হবে যে পারফরম্যান্সটি তেমন গুরুত্বপূর্ণ নয়।


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

slf4j এর লগারের অনুরূপ অনুসরণ করার জন্য কেন System.out.println () এর জন্য অতিরিক্ত লোড পরিবর্তনগুলি করা হয় না, যাতে এটি স্ট্রিং সংমিশ্রণ এড়ায়?
a3.14_ ইনফিনিটি

45

সংক্ষিপ্ত সংস্করণ: হ্যাঁ এটি দ্রুত, কম কোড সহ!

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

আপনি যে কোনও সংখ্যক যুক্তি সরবরাহ করতে পারেন। মনে রাখবেন যে আপনি যদি sljf4j এর একটি পুরানো সংস্করণ ব্যবহার করেন এবং আপনার কাছে দুটিরও বেশি যুক্তি রয়েছে {}তবে new Object[]{a,b,c,d}তার পরিবর্তে অ্যারে পাস করার জন্য আপনাকে সিনট্যাক্সটি ব্যবহার করতে হবে। উদাহরণস্বরূপ http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String, java.lang.Object []) দেখুন

গতি সম্পর্কে: তালিকাগুলির একটিতে কিছুক্ষণ আগে সেকি একটি বেঞ্চমার্ক পোস্ট করেছিলেন।


6
দ্রষ্টব্য: সর্বশেষ জাভাডোকটি নতুনতর-আরগ সিনট্যাক্সটি দেখায় debug(String format, Object... arguments),। Slf4j.org/faq.html#logging_performance
মাইকেল 25

কনটেনটেশন পারফরম্যান্স ছাড়াও .toString () মূল্যায়নের উল্লেখ করার কারণে উত্সাহিত। এটি এমন কিছু যা লগারের অভ্যন্তরে ঘটে এবং লगर সিদ্ধান্ত নিতে পারে যে সেই পদ্ধতিটি চালানোর প্রয়োজন কি না। লগিং স্তরের বারটি পূরণ না হলে এটি হয় না।
চেতন নরসুদ

6

যেহেতু, স্ট্রিং জাভাতে অপরিবর্তনীয় , তাই বাম এবং ডান স্ট্রিংকে প্রতিটি জোড় যুক্ত করার জন্য নতুন স্ট্রিংয়ে অনুলিপি করতে হবে। সুতরাং, আরও ভাল স্থানধারকের জন্য যান।


4
যদি একটি একক জুড়ি থাকে তবে এটি সঠিক, তবে সাধারণত ভুল, কারণ সংকলকটি স্ট্রিং-বিল্ডার কলগুলিতে কনট্যাক্টেশনকে রূপান্তরিত করে, ফলে আরও দ্রুত কোড আসে যা তত বরাদ্দ করে না।
সিডেসাক

3

আর একটি বিকল্প হ'ল String.format()। আমরা এটি jcabi-log ( slf4j এর আশেপাশে স্থির ইউটিলিটি র‌্যাপার) ব্যবহার করছি।

Logger.debug(this, "some variable = %s", value);

এটি অনেক বেশি রক্ষণাবেক্ষণযোগ্য এবং প্রসারণযোগ্য। তদ্ব্যতীত, এটি অনুবাদ করা সহজ।


4
আমি মনে করি না এটি আরও রক্ষণাবেক্ষণযোগ্য। যদি valueপরিবর্তনের ধরণ থাকে তবে আপনাকে আবার যেতে হবে এবং লগিংয়ের বিবৃতিটিও পরিবর্তন করতে হবে। আইডিইগুলি আপনাকে এমন কিছু করতে সহায়তা করবে না। লগারদের ডিবাগিংয়ে সহায়তা করা উচিত এবং এটির পথে না আসা উচিত। :-)
চেতন নরসুদ

4
@ চেটাননসুড ইন্টেলিজজে 2016 কমপক্ষে আমাকে জানায় যে ফর্ম্যাট স্ট্রিংটি ফর্ম্যাটিং আর্গুমেন্টগুলির সাথে খাপ খায় না। উদাহরণস্বরূপ: String.format("%d", "Test")IntelliJ সতর্কতা উত্পাদন করে Argument type 'String' does not match the type of the format specifier '%d'.। যদিও, আমি নিশ্চিত নই যে উপরের সমাধানটির সাথে কাজ করার সময় এটি এখনও এই বুদ্ধিমান প্রতিক্রিয়া সরবরাহ করতে সক্ষম হবে।
ক্রাশ করুন



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

2

আমি লেখকের দৃষ্টিকোণ থেকে মনে করি, মূল কারণটি স্ট্রিং কনটেনটেশনের জন্য ওভারহেড হ্রাস করা I

/**
* <p>This form avoids superfluous string concatenation when the logger
* is disabled for the DEBUG level. However, this variant incurs the hidden
* (and relatively small) cost of creating an <code>Object[]</code> before 
  invoking the method,
* even if this logger is disabled for DEBUG. The variants taking
* {@link #debug(String, Object) one} and {@link #debug(String, Object, Object) two}
* arguments exist solely in order to avoid this hidden cost.</p>
*/
*
 * @param format    the format string
 * @param arguments a list of 3 or more arguments
 */
public void debug(String format, Object... arguments);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.