লগ 4 জেন লগ স্তরকে গতিশীলভাবে পরিবর্তন করার জন্য বিভিন্ন পন্থাগুলি কী, যাতে আমাকে অ্যাপ্লিকেশনটি পুনরায় প্রচার করতে হবে না। পরিবর্তনগুলি কি এই ক্ষেত্রে স্থায়ী হবে?
লগ 4 জেন লগ স্তরকে গতিশীলভাবে পরিবর্তন করার জন্য বিভিন্ন পন্থাগুলি কী, যাতে আমাকে অ্যাপ্লিকেশনটি পুনরায় প্রচার করতে হবে না। পরিবর্তনগুলি কি এই ক্ষেত্রে স্থায়ী হবে?
উত্তর:
লগ স্তর পরিবর্তন করা সহজ; কনফিগারেশনের অন্যান্য অংশগুলিকে সংশোধন করা গভীরতার পদ্ধতির ক্ষেত্রে আরও বেশি ভঙ্গ করবে।
LogManager.getRootLogger().setLevel(Level.DEBUG);
এর লাইফ কাইলের মাধ্যমে পরিবর্তনগুলি স্থায়ী হয় Logger
। পুনরায় পুনর্নির্মাণের সময় কনফিগারেশনটি পড়তে হবে এবং রানটাইমের সময় স্তর নির্ধারণের জন্য ব্যবহৃত হবে যা স্তর পরিবর্তনকে স্থির রাখে না।
আপডেট: আপনি যদি লগ 4 জ 2 ব্যবহার করছেন setLevel
তবে আপনার ডকুমেন্টেশন অনুযায়ী কলগুলি সরিয়ে নেওয়া উচিত কারণ এটি বাস্তবায়ন ক্লাসের মাধ্যমে অর্জন করা যেতে পারে।
লগার.সেটলভেল () বা একই জাতীয় পদ্ধতিতে কলগুলি API এ সমর্থিত নয়। অ্যাপ্লিকেশনগুলির এগুলি অপসারণ করা উচিত। সমতুল্য কার্যকারিতা লগ 4 জ 2 বাস্তবায়ন ক্লাসে সরবরাহ করা হয় তবে লগ 4 জ 2 ইন্টার্নাল পরিবর্তনের জন্য অ্যাপ্লিকেশনটিকে সংবেদনশীল ছেড়ে দিতে পারে।
LogManager.getLogger(Class.forName("org.hibernate.util.JDBCExceptionReporter")).setLevel(Level.FATAL);
লগ 4j log4j.xml
কনফিগারেশনের পরিবর্তনের জন্য ফাইলটি দেখতে সক্ষম । আপনি যদি log4j ফাইল পরিবর্তন করেন তবে log4j আপনার পরিবর্তনগুলি অনুসারে লগের স্তরগুলিকে স্বয়ংক্রিয়ভাবে রিফ্রেশ করবে। org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long
বিশদ জন্য ডকুমেন্টেশন দেখুন )। চেকগুলির মধ্যে ডিফল্ট অপেক্ষার সময়টি 60 সেকেন্ড। এই পরিবর্তনগুলি অবিচল থাকবে, যেহেতু আপনি সরাসরি ফাইল সিস্টেমে কনফিগারেশন ফাইলটি পরিবর্তন করেন। আপনাকে যা করতে হবে তা হ'ল একবার DOMConfigurator.configureAndWatch () কে অনুরোধ করা।
সাবধানতা: থ্রেড ফাঁসের কারণে J2EE এনভায়রনমেন্টে কনফিগার করুনআ্যান্ডওয়াচ পদ্ধতিটি নিরাপদ নয়
লগ 4j সেট করার আরেকটি উপায় (বা সাধারণভাবে পুনরায় কনফিগার করা) লগ 4 জেএমএক্স ব্যবহার করে। লগ 4 জে এর লগারদের জেএমএক্স এমবি হিসাবে রেজিস্টার করে। অ্যাপ্লিকেশন সার্ভারগুলি এমবিইন সার্ভার কনসোলগুলি ব্যবহার করে (বা জেডিকের জকনসোল.এক্সে) আপনি প্রতিটি স্বতন্ত্র লগার পুনরায় কনফিগার করতে পারেন। এই পরিবর্তনগুলি অবিচল নয় এবং আপনি আপনার অ্যাপ্লিকেশন (সার্ভার) পুনঃসূচনা করার পরে কনফিগারেশন ফাইলের সেট হিসাবে কনফিগারেশনে পুনরায় সেট করা হবে।
অ্যারন দ্বারা বর্ণিত হিসাবে আপনি লগ স্তর প্রোগ্রামটিমে সেট করতে পারেন। আপনি যেভাবে এটি করতে চান তা আপনি নিজের প্রয়োগে প্রয়োগ করতে পারেন। উদাহরণস্বরূপ, আপনার একটি জিইউআই থাকতে পারে যেখানে ব্যবহারকারী বা অ্যাডমিন লগ স্তর পরিবর্তন করে এবং তারপরে setLevel()
লগারে পদ্ধতিগুলি কল করে । আপনি কোথাও সেটিংস চালিয়ে যান বা না তা আপনার উপর নির্ভর করে।
Log4j 2 .xML ফাইল (বা সমতুল্য) প্রদত্ত বিরতিতে স্ক্যান করে এর কনফিগারেশনটি রিফ্রেশ করতে কনফিগার করা যেতে পারে । আপনার কনফিগারেশন ট্যাগটিতে কেবল " মনিটরইন্টারওয়াল " পরামিতি যুক্ত করুন। নমুনা লগ 4 জ 2। এক্সএমএল ফাইলের লাইন 2 দেখুন , যা লগ 4 কে শেষ লগ ইভেন্টের পরে 5 সেকেন্ডের বেশি সময় পার হয়ে গেলে এর কনফিগারেশনটি পুনরায় স্ক্যান করতে বলে।
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="warn" monitorInterval="5" name="tryItApp" packages="">
<Appenders>
<RollingFile name="MY_TRY_IT"
fileName="/var/log/tryIt.log"
filePattern="/var/log/tryIt-%i.log.gz">
<Policies>
<SizeBasedTriggeringPolicy size="25 MB"/>
</Policies>
...
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MY_TRY_IT"/>
</Root>
</Loggers>
</Configuration>
আপনি যদি কোনও আইডইয়ের অভ্যন্তরে, বা স্প্রিং বুট ব্যবহার করার সময় কোনও টমক্যাট উদাহরণ ব্যবহার করছেন তবে এই কাজটি করার জন্য অতিরিক্ত পদক্ষেপ রয়েছে। এটি এখানে কিছুটা সুযোগের বাইরে বলে মনে হচ্ছে এবং সম্ভবত একটি পৃথক প্রশ্নের যোগ্যতা অর্জন করবে।
এই উত্তরটি আপনাকে গতিসম্পন্নভাবে লগিংয়ের স্তর পরিবর্তন করতে সহায়তা করবে না, আপনাকে পরিষেবাটি পুনরায় চালু করতে হবে, আপনি যদি পরিষেবাটি পুনরায় চালু করতে চান তবে নীচের সমাধানটি ব্যবহার করুন
আমি লগ 4 জনের লগ স্তর পরিবর্তন করতে এটি করেছি এবং এটি আমার পক্ষে কাজ করেছে, আমি কোনও দলিল উল্লেখ করি নি। আমি আমার লগফাইলের নাম সেট করতে এই সিস্টেমের সম্পত্তি মানটি ব্যবহার করেছি। লগিং লেভেল সেট করতেও আমি একই কৌশল ব্যবহার করেছি এবং এটি কার্যকর হয়েছে
এটি JVM প্যারামিটার হিসাবে পাস করেছে (আমি জাভা 1.7 ব্যবহার করি)
দুঃখিত, এটি গতিশীলভাবে লগিং স্তর পরিবর্তন করবে না, এর জন্য পরিষেবার পুনরায় আরম্ভের প্রয়োজন
java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java
log4j.properties ফাইলটিতে আমি এই এন্ট্রিটি যুক্ত করেছি
log4j.rootLogger=${logging.level},file,stdout
আমি চেষ্টা করেছিলাম
java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java
java -Dlogging.level=INFO-cp xxxxxx.jar xxxxx.java
java -Dlogging.level=OFF -cp xxxxxx.jar xxxxx.java
এটা সব কাজ। আশাকরি এটা সাহায্য করবে!
আমার pom.xML এ নিম্নলিখিত নিম্নলিখিত নির্ভরতা রয়েছে
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>apache-log4j-extras</artifactId>
<version>1.2.17</version>
</dependency>
লগ 4 জে 1.x এর সাহায্যে আমি সেরা উপায়টি হ'ল এক্সএমএল লগ কনফিগারেশনের পূর্বনির্ধারিত সেটগুলির একটি জমা দেওয়ার জন্য একটি ডমকনফিগ্রেটর ব্যবহার করা (বলুন, সাধারণ ব্যবহারের জন্য একটি এবং ডিবাগিংয়ের জন্য একটি)।
এগুলির ব্যবহার করা এই জাতীয় কিছু দিয়ে করা যেতে পারে:
public static void reconfigurePredefined(String newLoggerConfigName) {
String name = newLoggerConfigName.toLowerCase();
if ("default".equals(name)) {
name = "log4j.xml";
} else {
name = "log4j-" + name + ".xml";
}
if (Log4jReconfigurator.class.getResource("/" + name) != null) {
String logConfigPath = Log4jReconfigurator.class.getResource("/" + name).getPath();
logger.warn("Using log4j configuration: " + logConfigPath);
try (InputStream defaultIs = Log4jReconfigurator.class.getResourceAsStream("/" + name)) {
new DOMConfigurator().doConfigure(defaultIs, LogManager.getLoggerRepository());
} catch (IOException e) {
logger.error("Failed to reconfigure log4j configuration, could not find file " + logConfigPath + " on the classpath", e);
} catch (FactoryConfigurationError e) {
logger.error("Failed to reconfigure log4j configuration, could not load file " + logConfigPath, e);
}
} else {
logger.error("Could not find log4j configuration file " + name + ".xml on classpath");
}
}
এটিকে উপযুক্ত কনফিগার নামের সাথে কল করুন এবং নিশ্চিত করুন যে আপনি টেমপ্লেটগুলি ক্লাসপথে রেখেছেন p
আমি "org.apache.http" লগগুলির ভার্বোসটি হ্রাস করতে সাফল্যের সাথে এই পদ্ধতিটি ব্যবহার করেছি:
ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.apache.http");
logger.setLevel(Level.TRACE);
logger.setAdditive(false);
লগ 4 জ 2 এপিআইয়ের জন্য, আপনি ব্যবহার করতে পারেন
Logger logger = LogManager.getRootLogger();
Configurator.setAllLevels(logger.getName(), Level.getLevel(level));
আপনি যদি সমস্ত লগারের লগিং স্তরটি পরিবর্তন করতে চান তবে নীচের পদ্ধতিটি ব্যবহার করুন। এটি সমস্ত লগারের উপরে গণনা করবে এবং লগিং স্তরকে প্রদত্ত স্তরে পরিবর্তন করবে। নিশ্চিত করুন যে আপনি যে দয়া করে না আছে log4j.appender.loggerName.Threshold=DEBUG
আপনার সম্পত্তি সেট log4j.properties
ফাইল।
public static void changeLogLevel(Level level) {
Enumeration<?> loggers = LogManager.getCurrentLoggers();
while(loggers.hasMoreElements()) {
Logger logger = (Logger) loggers.nextElement();
logger.setLevel(level);
}
}
আপনি নিম্নলিখিত কোড স্নিপেট ব্যবহার করতে পারেন
((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));