জাভাতে, লগার ঘোষণার জন্য কেন এটি সেরা অনুশীলন static final?
private static final Logger S_LOGGER
জাভাতে, লগার ঘোষণার জন্য কেন এটি সেরা অনুশীলন static final?
private static final Logger S_LOGGER
উত্তর:
private- যাতে অন্য কোনও শ্রেণি আপনার লগার হাইজ্যাক করতে না পারেstatic - সুতরাং প্রতি ক্লাসে কেবলমাত্র একটি লগারের উদাহরণ রয়েছে, লগারকে সিরিয়াল করার চেষ্টা এড়িয়ে চলেfinal - শ্রেণীর জীবনকাল ধরে লগার পরিবর্তন করার দরকার নেইএছাড়াও, আমি নামটিকে logযতটা সম্ভব সহজ, তবুও বর্ণনামূলক বলে পছন্দ করি।
সম্পাদনা: তবে এই নিয়মের একটি আকর্ষণীয় ব্যতিক্রম রয়েছে:
protected final Logger log = LoggerFactory.getLogger(getClass());
উল্টোদিকে:
private static final Logger log = LoggerFactory.getLogger(Foo.class);
পূর্ববর্তী উপায় আপনাকে উত্তরাধিকার শ্রেণিবিন্যাস জুড়ে সমস্ত ক্লাসে একই লগার নাম (প্রকৃত শ্রেণির নাম) ব্যবহার করার অনুমতি দেয়। সুতরাং যদি Barপ্রসারিত হয় Foo, উভয় Barলগারে লগ হবে । কেউ কেউ এটিকে আরও স্বজ্ঞাত বলে মনে করেন।
logকোডটি ছড়িয়ে দেওয়ার পরিবর্তে নাম লেখার পক্ষে আরও সহজ এবং আরও মনোরম পছন্দ করি LOG। শুধু দেবের ব্যাপার। দলের চুক্তি
এই ব্লগ পোস্টটি দেখুন: জাভা স্ট্যাটিক লগারদের থেকে মুক্তি পান । আপনি jcabi-log দিয়ে slf4j এইভাবে ব্যবহার করেন :
import com.jcabi.log.Logger;
class Foo {
void save(File f) {
Logger.info(this, "file %s saved successfully", f);
}
}
এবং স্থির শব্দটি আর কখনও ব্যবহার করবেন না।
staticএর অর্থ হ'ল আপনি প্রতি ক্লাসে কেবল একটি লগার তৈরি করেন , আপনার শ্রেণীর উদাহরণ অনুসারে একটি লগার নয় । সাধারণত, আপনি যা চান তা হ'ল - লগাররা ক্লাসের উপর ভিত্তি করে এককভাবে পরিবর্তিত হয়।
finalএর অর্থ আপনি loggerভেরিয়েবলের মান পরিবর্তন করতে যাচ্ছেন না । এটি সত্য, যেহেতু আপনি প্রায় সবসময় একই লগারে সমস্ত লগ বার্তা (এক শ্রেণি থেকে) নিক্ষেপ করেন। এমনকি বিরল ইভেন্টগুলিতে যেখানে কোনও শ্রেণি অন্য লগারে কিছু বার্তা প্রেরণ করতে চাইতে পারে, সেখানে widgetDetailLoggerফ্লাইতে স্থির ভেরিয়েবলের মান পরিবর্তনের পরিবর্তে আরেকটি লগার ভেরিয়েবল (উদাঃ ) তৈরি করা আরও পরিষ্কার হবে ।
আপনি কখন ক্ষেত্রের মান পরিবর্তন করতে চান?
যদি আপনি কখনই মান পরিবর্তন করতে যাচ্ছেন না, ক্ষেত্রটিকে চূড়ান্ত করে তোলা স্পষ্ট করে দেয় যে আপনি কখনই মানটি পরিবর্তন করবেন না।
সাধারণত আপনি ক্লাসের নামটি ব্যবহার করে লগারে লগারের সূচনা করেন - যার অর্থ এটি যদি স্থির না হয় তবে আপনি ক্লাসের প্রতিটি উদাহরণ দিয়েছিলেন (উচ্চ মেমরির পদচিহ্ন), তবে এই সমস্ত লগার একই কনফিগারেশন ভাগ করুন এবং ঠিক একই আচরণ করুন। staticবিট পিছনে কারণ । Loggerসাবক্লাসের সাথে দ্বন্দ্ব প্রতিরোধের জন্য, প্রতিটি শ্রেণীর নামের সাথে শুরু করার কারণে, আপনি এটি ঘোষণা করেন privateযাতে এটি উত্তরাধিকার সূত্রে প্রাপ্ত হয় না। finalবিন্দু থেকে আসে আপনি সাধারণত পরিবর্তন করবেন না Loggerসম্পাদনের সময় - (যে ক্ষেত্রে এটা জ্ঞান করে তোলে তা নিশ্চিত করা কোন এক এটি পরিবর্তন করতে পারেন চূড়ান্ত করতে দ্বারা - তাই একবার আপনি কখনই "পুনরায় কনফিগার" সক্রিয়া এটা ভুল বা অন্যথায়)। অবশ্যই যদি আপনি একটি ব্যবহার করতে যাচ্ছেনLoggerঅন্যভাবে আপনি প্রয়োজন হতে পারে না ব্যবহার static final- কিন্তু আমি মনে করি অ্যাপ্লিকেশান 80% লগিং ব্যবহার করেন উপরের হিসাবে ব্যাখ্যা venture হবে।
এই প্রশ্নের উত্তর দেওয়ার জন্য, আপনার নিজের জিজ্ঞাসা করা উচিত ছিল "স্ট্যাটিক" এবং "চূড়ান্ত" কীসের জন্য।
লগারের জন্য, (আমি ধরে নিয়েছি আপনি লগ 4 জে লগার শ্রেণীর বিষয়ে কথা বলবেন) আপনি প্রতি ক্লাসে একটি বিভাগ চান। যা আপনাকে এই মাত্র একবার নির্ধারিত করে এবং আপনার প্রতি ক্লাসে একাধিক উদাহরণের প্রয়োজন নেই তা এই সত্যের দিকে পরিচালিত করে। এবং সম্ভবতঃ কোনও শ্রেণীর লগার অবজেক্টটিকে অন্য শ্রেণিতে প্রকাশ করার কোনও কারণ নেই, তবে কেন এটি ব্যক্তিগত করা হবে না এবং কিছু ওও-নীতি অনুসরণ করুন।
এছাড়াও আপনার লক্ষ করা উচিত, যে সংকলক এর সুবিধা নিতে সক্ষম। সুতরাং আপনার কোডটি কিছুটা ভাল সম্পাদন করে :)
কারণ এটি হ'ল সাধারণত এমন ধরণের ক্রিয়াকলাপ যা আপনার অবজেক্টগুলির সমস্ত উদাহরণ জুড়ে ভাগ করা যায়। একই বর্গের দুটি উদাহরণের জন্য আলাদা লগার থাকা খুব বেশি অর্থবোধ করে না (সময়ের 90%)।
যাইহোক, আপনি কখনও কখনও লগার ক্লাসগুলি সিলেটলেট হিসাবে ঘোষিত বা এমনকি আপনার স্টাফগুলিতে লগ করার জন্য স্ট্যাটিক ফাংশনগুলিও সরবরাহ করতে পারেন।
এই কোডটি দুর্বল , তবে জাভা 7 এর পরে আমরা Logger lgr = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
স্ট্যাটিক লগারের পরিবর্তে ব্যবহার করতে পারি ।
This is code is vulnerableআপনি কি কিছুটা উত্তর দিতে পারবেন?
বেশিরভাগ ক্ষেত্রে, আপনি রেফারেন্স পরিবর্তন করতে যাচ্ছেন না এবং finalএটির সংশোধক চিহ্নিত করে। আপনার প্রতিটি শ্রেণীর উদাহরণের জন্য পৃথক দৃষ্টান্তের দরকার নেই - তাই static। এবং এইগুলির প্রথমটি হল পারফরম্যান্সের জন্য - এটি দুর্দান্তভাবে অনুকূলিতকরণ (চূড়ান্ত) হতে পারে এবং মেমরিটি সংরক্ষণ করে (স্থিতিশীল)।
আদর্শভাবে লগারটি সোনারকে না দেওয়ার এবং একটি কমপ্লায়েন্ট কোড দেওয়ার জন্য জাভা 7 পর্যন্ত নিম্নলিখিত হিসাবে হওয়া উচিত: ব্যক্তিগত: এর পিতামাতার শ্রেণীর বাইরে কখনও অ্যাক্সেসযোগ্য হবে না। যদি অন্য শ্রেণীর কোনও কিছুতে লগ করার প্রয়োজন হয় তবে এটির নিজস্ব লগারটি ইনস্ট্যান্ট করা উচিত। স্থিতিশীল: কোনও শ্রেণীর উদাহরণ (কোনও বস্তুর) উপর নির্ভরশীল হবেন না। কোনও কিছু লগ করার সময়, প্রাসঙ্গিক তথ্য অবশ্যই বার্তাগুলিতে সরবরাহ করা যেতে পারে তবে প্রতিটি বস্তুর সাথে লগার তৈরি করতে এবং হাই মেমোরির পদচিহ্ন প্রতিরোধ করার জন্য শ্রেণি পর্যায়ে লগার তৈরি করা উচিত। চূড়ান্ত: প্রতি ক্লাসে একবার এবং একবারে তৈরি করা হবে।
অন্যান্য উত্তরগুলিতে প্রদত্ত কারণগুলি ছাড়াও আমি একটি জিনিস যা করেছিলাম তা হ'ল যদি আমার লগারটি স্থির বা চূড়ান্ত না হয়:
...
public Logger logger = LoggerFactory.getLogger(DataSummary.class);
public String toJson() {
GsonBuilder gsonBuilder = new GsonBuilder();
return gsonBuilder.create().toJsonTree(this).toString();
}
...
নির্দিষ্ট কিছু ক্ষেত্রে (যখন আমি গসন লাইব্রেরি ব্যবহার করছিলাম) আমি স্ট্যাকওভারফ্লো ব্যতিক্রম পেতাম। আমার নির্দিষ্ট পরিস্থিতিটি ছিল নন স্ট্যাটিক নন ফাইনাল লগারযুক্ত ক্লাসটি ইনস্ট্যান্ট করা। তারপরে টজসন পদ্ধতিতে কল করুন যা গসনবিল্ডারকে অনুরোধ করেছিল:
...
DataSummary ds = new DataSummary(data);
System.out.println(ds.toJson());
...
স্থিতিশীল লগারগুলি "ক্ষতিকারক" হতে পারে কারণ তারা স্থির প্রসঙ্গে কাজ করার কথা। যখন একটি গতিশীল পরিবেশ থাকে যেমন। ওএসজি এটি স্ট্যাটাসহীন লগার ব্যবহার করতে সহায়তা করতে পারে। কিছু লগিং বাস্তবায়ন যেমন অভ্যন্তরীণভাবে ল্যাগারগুলির ক্যাচিং করে (এএফআইএকে কমপক্ষে লগ 4 জে) পারফরম্যান্সের প্রভাব তুচ্ছ হতে পারে।
স্ট্যাটিক লগারগুলির একটি অপূর্ণতা যেমন। আবর্জনা সংগ্রহ (যখন কোনও ক্লাস কেবল একবার ব্যবহার করা হয় উদাহরণস্বরূপ। সূচনাকালীন সময়ে লগারটি এখনও রাখা হবে)
আরও বিশদ জানতে চেক করুন:
আরো দেখুন:
লগারকে স্থিতিশীল করা বা না তৈরি সম্পর্কে আমি ইন্টারনেট থেকে যে তথ্যটি পড়েছি সে অনুসারে ব্যবহারের ক্ষেত্রে অনুসারে এটি ব্যবহার করা সবচেয়ে ভাল অনুশীলন।
দুটি প্রধান যুক্তি রয়েছে:
1) আপনি যখন এটি স্থির করেন, এটি আবর্জনা সংগ্রহ করা হয় না (মেমরির ব্যবহার এবং কার্য সম্পাদন)।
2) আপনি যখন এটি স্থির করেন না তখন এটি প্রতিটি শ্রেণীর উদাহরণের জন্য তৈরি করা হয় (স্মৃতি ব্যবহার)
সুতরাং, আপনি যখন একটি সিঙ্গলটনের জন্য কোনও লগার তৈরি করছেন, আপনার এটি স্থির করার দরকার নেই। কারণ এখানে কেবলমাত্র একটি উদাহরণ থাকবে যাতে একটি লগার থাকে।
অন্যদিকে, আপনি যদি কোনও মডেল বা সত্তা শ্রেণীর জন্য কোনও লগার তৈরি করছেন, আপনার অনুলিপিযুক্ত লগার তৈরি না করে এটি স্থির করা উচিত।