লগ 4 জে, লগিংয়ের আগে চেক করা কি ডেগুগইনলেবল করা কর্মক্ষমতা উন্নত করে?


207

লগিংয়ের জন্য আমি আমার অ্যাপ্লিকেশনটিতে লগ 4 ব্যবহার করছি । পূর্বে আমি ডিবাগ কল যেমন ব্যবহার করছিলাম:

বিকল্প 1:

logger.debug("some debug text");

তবে কিছু লিঙ্ক প্রস্তাব দেয় যে isDebugEnabled()আগে যাচাই করা ভাল :

বিকল্প 2:

boolean debugEnabled = logger.isDebugEnabled();
if (debugEnabled) {
    logger.debug("some debug text");
}

সুতরাং আমার প্রশ্ন " বিকল্প 2 কি কোনওভাবেই কার্যকারিতা উন্নত করে? "।

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

  1. ডিবাগ-এনেবল ভেরিয়েবলের মান নির্ধারণের ক্ষেত্রে এবং
  2. আসলে logger.debug () পদ্ধতি দ্বারা কল করা হয়।

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

উত্তর:


247

এই বিশেষ ক্ষেত্রে, বিকল্প 1 আরও ভাল।

গার্ড স্টেটমেন্ট (চেকিং isDebugEnabled()) লগ বার্তাটির সম্ভাব্য ব্যয়বহুল গণনা রোধ করার জন্য যখন এতে toString()বিভিন্ন অবজেক্টের পদ্ধতিসমূহের আহ্বান এবং ফলাফলগুলি যুক্ত করে জড়িত থাকে ।

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

লগের বিবরণী একটি ফর্ম্যাট স্পেসিফিকেশন এবং লগারের পরিবর্তে যুক্তিগুলির একটি তালিকা গ্রহণ করে - তবে "অলসভাবে" কেবলমাত্র লগার সক্ষম থাকলেই আরও ভাল। এটি slf4j দ্বারা গৃহীত পদ্ধতির ।

দেখুন একটি সম্পর্কিত প্রশ্নের আমার উত্তর আরও তথ্যের জন্য, এবং log4j সঙ্গে ভালো কিছু করছেন একটি উদাহরণ।


3
লগ 5 জে লগ 4 জে slp4j এর মতোই প্রসারিত করে
বিল মিশেল

এটি java.util.Logging এর পদ্ধতিরও।
পল

@ গীক লগ ইভেন্টটি অক্ষম থাকাকালীন লগের স্তর উচ্চতর হওয়ার কারণে এটি আরও কার্যকর। আমার উত্তরে
এরিকসন

1
এই log4j 2 এ পরিবর্তন হয়েছে?
স্নেকডক

3
@ স্নেকডোক নং এটি পদ্ধতি কলিংয়ের জন্য মৌলিক: পদ্ধতির আরগ-তালিকার অভিব্যক্তিগুলি কল করার আগে কার্যকরভাবে মূল্যায়ন করা হয়। যদি এই এক্সপ্রেশনগুলি ক) ব্যয়বহুল হিসাবে বিবেচিত হয় এবং খ) কেবলমাত্র কিছু শর্তের অধীনে চেয়েছিল (উদাহরণস্বরূপ যখন ডিবাগ সক্ষম করা থাকে), তবে আপনার একমাত্র পছন্দটি কলটির চারপাশে একটি শর্ত পরীক্ষা করা, এবং ফ্রেমওয়ার্ক আপনার পক্ষে এটি করতে পারে না। ফর্ম্যাটর-ভিত্তিক লগ পদ্ধতির জিনিসটি হ'ল আপনি কয়েকটি অবজেক্ট (গুলি মূলত বিনামূল্যে) পাস করতে পারবেন এবং লগার toString()প্রয়োজনে কেবল তখনই কল করবে ।
সুসানডাব্লু 2'17

31

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


17

isDebugEnabled()স্ট্রিংসকে কনটেনেট করে আপনি যখন লগ বার্তা তৈরি করেন তখন এটি ব্যবহারের জন্য সংরক্ষিত থাকে:

Var myVar = new MyVar();
log.debug("My var is " + myVar + ", value:" + myVar.someCall());

তবে, আপনার উদাহরণে কোনও গতি লাভ নেই কারণ আপনি কেবল একটি স্ট্রিং লগইন করছেন এবং কনটেনটেশনের মতো ক্রিয়াকলাপ সম্পাদন করছেন না। অতএব আপনি কেবল আপনার কোডটিতে ব্লট যুক্ত করছেন এবং এটি পড়া আরও কঠিন করে তুলছেন।

আমি ব্যক্তিগতভাবে জাভা 1.5 ফর্ম্যাট কলগুলি স্ট্রিং ক্লাসে এভাবে ব্যবহার করি:

Var myVar = new MyVar();
log.debug(String.format("My var is '%s', value: '%s'", myVar, myVar.someCall()));

আমার সন্দেহ আছে অনেক অপ্টিমাইজেশন আছে তবে এটি পড়া সহজ।

নোট করুন যে সর্বাধিক লগিং এপিআইগুলি বাক্সের বাইরে এই জাতীয় বিন্যাস সরবরাহ করে: উদাহরণস্বরূপ slf4j নিম্নলিখিত সরবরাহ করে:

logger.debug("My var is {}", myVar);

যা পড়তে আরও সহজ।


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

2
String.format CONCAT & slf4j 40 বার ধীর 2 প্যারাম সীমাবদ্ধতা সংখ্যার এখানে দেখুন রয়েছে: stackoverflow.com/questions/925423/... আমি অনেক একটি প্রোফাইলার গ্রাফ যেখানে বিন্যাস অপারেশন ডিবাগ বিবৃতির নষ্ট হয় দেখেছি যখন উৎপাদন ব্যবস্থা INFO বা ERROR এর লগ স্তরে চলমান
আজটেকোয়ারিয়র_25

10

জাভা 8 এ, আপনাকে isDebugEnabled()পারফরম্যান্সটি উন্নত করতে ব্যবহার করতে হবে না ।

https://logging.apache.org/log4j/2.0/manual/api.html#Java_8_lambda_support_for_lazy_logging

import java.util.logging.Logger;
...
Logger.getLogger("hello").info(() -> "Hello " + name);

খুব ঠান্ডা. তবে সংস্করণ 2 (এখনও আলফায়) অবধি slft4j তে সমর্থিত নয় :(
অমলগোভিনাস

8

সংক্ষিপ্ত সংস্করণ: আপনি সম্ভবত বুলিয়ানটি ডেবুগইনেবল () চেক করতে পারেন।

কারণগুলি:
1- জটিল যুক্তি / স্ট্রিং কনক্যাট থাকলে। আপনার ডিবাগ বিবৃতিতে যুক্ত করা হয়েছে আপনার কাছে ইতিমধ্যে চেকটি থাকবে।
2- আপনাকে "জটিল" ডিবাগ স্টেটমেন্টগুলিতে বাছাই করে নির্বাচন করতে হবে না। সমস্ত বিবৃতি সেভাবে অন্তর্ভুক্ত করা হয়েছে।
3- কলিং লগ.দেবগ লগিংয়ের আগে নিম্নলিখিতগুলি সম্পাদন করে:

if(repository.isDisabled(Level.DEBUG_INT))
return;

এটি মূলত কলিং লগের সমান। বা বিড়াল। isDebugEnabled ()।

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

এই পদ্ধতি

public
  boolean isDebugEnabled() {
     if(repository.isDisabled( Level.DEBUG_INT))
      return false;
    return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
  }

এটি এর জন্য জাভাদোক

/**
*  Check whether this category is enabled for the <code>DEBUG</code>
*  Level.
*
*  <p> This function is intended to lessen the computational cost of
*  disabled log debug statements.
*
*  <p> For some <code>cat</code> Category object, when you write,
*  <pre>
*      cat.debug("This is entry number: " + i );
*  </pre>
*
*  <p>You incur the cost constructing the message, concatenatiion in
*  this case, regardless of whether the message is logged or not.
*
*  <p>If you are worried about speed, then you should write
*  <pre>
*    if(cat.isDebugEnabled()) {
*      cat.debug("This is entry number: " + i );
*    }
*  </pre>
*
*  <p>This way you will not incur the cost of parameter
*  construction if debugging is disabled for <code>cat</code>. On
*  the other hand, if the <code>cat</code> is debug enabled, you
*  will incur the cost of evaluating whether the category is debug
*  enabled twice. Once in <code>isDebugEnabled</code> and once in
*  the <code>debug</code>.  This is an insignificant overhead
*  since evaluating a category takes about 1%% of the time it
*  takes to actually log.
*
*  @return boolean - <code>true</code> if this category is debug
*  enabled, <code>false</code> otherwise.
*   */

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

7

যেহেতু অন্যরা গার্ড স্টেটমেন্ট ব্যবহার করে উল্লেখ করেছে কেবল তখনই কার্যকর যদি স্ট্রিং তৈরি করা সময়সাপেক্ষ কল হয়। এর নির্দিষ্ট উদাহরণগুলি স্ট্রিং তৈরি করার সময় কিছু অলস লোডকে ট্রিগার করবে।

এটি লক্ষণীয় যে জাভা বা (এসএলএফ 4 জে) জন্য সিম্পল লগিং ফেক্যাড - http://www.slf4j.org/manual.html ব্যবহার করে এই সমস্যাটি এড়ানো সম্ভব । এটি পদ্ধতির কলগুলিকে যেমন:

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

এটি কেবলমাত্র পরামিতিগুলিতে পাস হওয়া স্ট্রিংগুলিতে রূপান্তর করবে যদি ডিবাগ সক্ষম থাকে। এর নাম অনুসারে এসএলএফ 4 জে কেবল একটি মুখোমুখি এবং লগিং কলগুলি লগ 4 জে পাস করা যেতে পারে।

আপনি খুব সহজেই এর নিজের সংস্করণটি "আপনার নিজের রোল" করতে পারেন।

আশাকরি এটা সাহায্য করবে.


6

বিকল্প 2 আরও ভাল।

প্রতি সেফ এটি কর্মক্ষমতা উন্নতি করে না। তবে এটি নিশ্চিত করে যে কর্মক্ষমতা হ্রাস পাবে না। এখানে কিভাবে।

সাধারণত আমরা আশা করি logger.debug (কিছু স্ট্রিং);

তবে সাধারণত, অ্যাপ্লিকেশনটি বাড়ার সাথে সাথে অনেকগুলি হাত বদলে যায়, বিশেষত নবজাতক বিকাশকারীরা, আপনি দেখতে পাবেন

logger.debug (str1 + str2 + str3 + str4);

এবং পছন্দ.

এমনকি লগ স্তর যদি ERROR বা FATAL এ সেট করা থাকে তবে স্ট্রিংগুলির সংমিশ্রণ ঘটে! যদি অ্যাপ্লিকেশনটিতে স্ট্রিং কনটেনটেশনের সাথে প্রচুর DEBUG স্তরের বার্তা থাকে, তবে এটি অবশ্যই একটি পারফরম্যান্স হিট করবে বিশেষত jdk 1.4 বা নীচের সাথে। (আমি নিশ্চিত নই যে জেডিকি ইন্টারনালের পরবর্তী সংস্করণগুলি কোনও স্ট্রিংবফার.অ্যাপেন্ড ()) করে কিনা।

বিকল্প 2 নিরাপদ কেন তা জানায়। এমনকি স্ট্রিং কনটেনটেশনগুলি ঘটবে না।


3

@ এরিক্সনের মতো এটি নির্ভর করে। যদি আমি মনে করি, isDebugEnabledইতিমধ্যে debug()Log4j পদ্ধতিতে তৈরি build
যতক্ষণ না আপনি আপনার ডিবাগ স্টেটমেন্টগুলিতে কিছু ব্যয়বহুল গণনা করছেন না, যেমন বস্তুর লুপের মতো, গণনা সম্পাদন করে এবং স্ট্রিংটেট স্ট্রিং না করে থাকেন, আপনি আমার মতে ঠিক আছেন।

StringBuilder buffer = new StringBuilder();
for(Object o : myHugeCollection){
  buffer.append(o.getName()).append(":");
  buffer.append(o.getResultFromExpensiveComputation()).append(",");
}
log.debug(buffer.toString());

হিসাবে ভাল হবে

if (log.isDebugEnabled(){
  StringBuilder buffer = new StringBuilder();
  for(Object o : myHugeCollection){
    buffer.append(o.getName()).append(":");
    buffer.append(o.getResultFromExpensiveComputation()).append(",");
  }
  log.debug(buffer.toString());
}

3

একটি জন্য একক লাইন , আমি বার্তা লগিং এই ভাবে আমি সংযুক্তকরণের না সালে, একটি তিন ভিতরে ব্যবহার করুন:

ej:

logger.debug(str1 + str2 + str3 + str4);

আমি করি:

logger.debug(logger.isDebugEnable()?str1 + str2 + str3 + str4:null);

তবে কোডের একাধিক লাইনের জন্য

ej।

for(Message mess:list) {
    logger.debug("mess:" + mess.getText());
}

আমি করি:

if(logger.isDebugEnable()) {
    for(Message mess:list) {
         logger.debug("mess:" + mess.getText());
    }
}

3

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

লগ 4 জ 2 সরবরাহকারীদের সমর্থন করে (বর্তমানে তাদের নিজস্ব বাস্তবায়ন, তবে ডকুমেন্টেশন অনুসারে এটি জাভার সরবরাহকারী ইন্টারফেসটি 3.0 সংস্করণে ব্যবহার করার পরিকল্পনা করা হয়েছে)। ম্যানুয়ালটিতে আপনি এই সম্পর্কে আরও কিছুটা পড়তে পারেন । এটি আপনাকে সরবরাহকারী হিসাবে ব্যয়বহুল লগ বার্তা তৈরি করতে দেয় যা কেবল বার্তাটি তৈরি করে যদি এটি লগ হতে চলেছে:

LogManager.getLogger().debug(() -> createExpensiveLogMessage());

2

এটি গতির উন্নতি করে কারণ এটি ব্যয়বহুল যেমন ডিবাগ পাঠ্যে স্ট্রিংগুলি সংহত করা সাধারণ:

boolean debugEnabled = logger.isDebugEnabled();
if (debugEnabled) {
    logger.debug("some debug text" + someState);
}

1
যদি আমরা jdk 1.5 এবং এর পরে ব্যবহার করি তবে আমি মনে করি এত সংক্ষিপ্ত স্ট্রিংগুলি কোনও পার্থক্য করবে না।
নিরব যোদ্ধা

কিভাবে? জেডিকে 5 অন্যভাবে কী করবে?
জাভাশলুক

1
Jdk 1.5 এ, যদি আমরা একক বিবৃতিতে স্ট্রিংগুলি সংহত করি তবে অভ্যন্তরীণভাবে এটি কেবল স্ট্রিংবফার.অ্যাপেন্ড () পদ্ধতি ব্যবহার করে। সুতরাং এটি কর্মক্ষমতা উপর প্রভাব ফেলে না।
নিরব যোদ্ধা

2
স্ট্রিং কনটেনটেশন নিঃসন্দেহে সময় নেয়। তবে আমি নিশ্চিত নই যে আমি এটিকে 'ব্যয়বহুল' হিসাবে বর্ণনা করব। উপরের উদাহরণে কতটা সময় সাশ্রয় হয়? পার্শ্ববর্তী কোডটি আসলে কি করছে তার তুলনায়? (যেমন ডাটাবেস পাঠায় বা মেমরির গণনা)। আমি মনে করি এই ধরণের বিবৃতিগুলি যোগ্য হওয়া দরকার
ব্রায়ান অগ্নিউ

1
এমনকি জেডিকে ১.৪ সরল স্ট্রিং কনটেন্টেশন সহ নতুন স্ট্রিং অবজেক্ট তৈরি করবে না। পারফরম্যান্স পেনাল্টি স্ট্রিংবফার.অ্যাপেন্ড () ব্যবহার করে আসে যখন কোনও স্ট্রিং একেবারেই প্রদর্শিত হবে না।
জাভাসলুক

1

যেহেতু Log4j সংস্করণ 2.4(অথবা slf4j-api 2.0.0-alpha1) এটি অনেক ভালো ব্যবহার করবেন তা অনর্গল এপিআই (অথবা জাভা অলস লগিং জন্য 8 ল্যামডা সমর্থন ), সমর্থনকারী Supplier<?>লগ বার্তা যুক্তি, যে কর্তৃক প্রদত্ত করা যেতে পারে ল্যামডা :

log.debug("Debug message with expensive data : {}", 
           () -> doExpensiveCalculation());

অথবা slf4j এপিআই সহ:

log.atDebug()
            .addArgument(() -> doExpensiveCalculation())
            .log("Debug message with expensive data : {}");

0

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


0

আমি বিকল্পটি বেশিরভাগের জন্য ডি ফ্যাক্টো হিসাবে ব্যবহার করার পরামর্শ দেব কারণ এটি ব্যয়বহুল নয়।

কেস 1: log.debug ("একটি স্ট্রিং")

কেস 2: লগ.দেবগ ("একটি স্ট্রিং" + "দুটি স্ট্রিং" + অবজেক্ট. টোস্ট্রিং + অবজেক্ট 2. টোস্ট্রিং)

এগুলির যেকোন একটিরও বলা হয়, log.debug এর মধ্যে প্যারামিটার স্ট্রিং (এটি সিএসই 1 বা কেস 2 হ'ল) ​​মূল্যায়ন করতে হবে। প্রত্যেকের অর্থ 'ব্যয়বহুল'। যদি এর আগে আপনার একটি শর্ত থাকে তবে 'isDebugEn सक्षम ()', এগুলি মূল্যায়ন করতে হবে না যেখানে কর্মক্ষমতাটি সংরক্ষণ করা হয়।


0

২.x হিসাবে, অ্যাপাচি লগ ৪ জে এই চেকটি অন্তর্নির্মিত রয়েছে, সুতরাং isDebugEnabled()আর প্রয়োজন নেই। কেবল একটি করুন debug()এবং সক্ষম না করা হলে বার্তাগুলি দমন করা হবে।


-1

লগ 4j2 আপনাকে ম্যাসেজের টেমপ্লেটে প্যারামিটারগুলি ফর্ম্যাট করতে দেয়, অনুরূপ String.format(), এটি করার প্রয়োজনটিকে ছাড়িয়ে যায় isDebugEnabled()

Logger log = LogManager.getFormatterLogger(getClass());
log.debug("Some message [myField=%s]", myField);

নমুনা সহজ log4j2.properties:

filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d %-5p: %c - %m%n
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = debug
rootLogger.level = info
rootLogger.appenderRef.stdout.ref = STDOUT
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.