গতিশীলভাবে log4j লগ স্তর পরিবর্তন করা হচ্ছে


127

লগ 4 জেন লগ স্তরকে গতিশীলভাবে পরিবর্তন করার জন্য বিভিন্ন পন্থাগুলি কী, যাতে আমাকে অ্যাপ্লিকেশনটি পুনরায় প্রচার করতে হবে না। পরিবর্তনগুলি কি এই ক্ষেত্রে স্থায়ী হবে?



খুব অনুরূপ stackoverflow.com/questions/2115900/...
vsingh

3
Log4j2 জন্য আপডেট প্রশ্ন: stackoverflow.com/questions/23434252/...
slaadvak

1
দ্রষ্টব্য যে (প্রায়) এই পৃষ্ঠার সবকিছু লগ 4j সম্পর্কিত, লগ 4j2 নয়। এই পুরো পৃষ্ঠাটি এত বিভ্রান্তি এবং ভুল দিকনির্দেশে পূর্ণ যে এটি ব্যবহারযোগ্য। যান stackoverflow.com/questions/23434252/... @slaadvak যেমন পরামর্শ দেওয়া হচ্ছে।
লাম্বার্ট

উত্তর:


86

লগ স্তর পরিবর্তন করা সহজ; কনফিগারেশনের অন্যান্য অংশগুলিকে সংশোধন করা গভীরতার পদ্ধতির ক্ষেত্রে আরও বেশি ভঙ্গ করবে।

LogManager.getRootLogger().setLevel(Level.DEBUG);

এর লাইফ কাইলের মাধ্যমে পরিবর্তনগুলি স্থায়ী হয় Logger। পুনরায় পুনর্নির্মাণের সময় কনফিগারেশনটি পড়তে হবে এবং রানটাইমের সময় স্তর নির্ধারণের জন্য ব্যবহৃত হবে যা স্তর পরিবর্তনকে স্থির রাখে না।

আপডেট: আপনি যদি লগ 4 জ 2 ব্যবহার করছেন setLevelতবে আপনার ডকুমেন্টেশন অনুযায়ী কলগুলি সরিয়ে নেওয়া উচিত কারণ এটি বাস্তবায়ন ক্লাসের মাধ্যমে অর্জন করা যেতে পারে।

লগার.সেটলভেল () বা একই জাতীয় পদ্ধতিতে কলগুলি API এ সমর্থিত নয়। অ্যাপ্লিকেশনগুলির এগুলি অপসারণ করা উচিত। সমতুল্য কার্যকারিতা লগ 4 জ 2 বাস্তবায়ন ক্লাসে সরবরাহ করা হয় তবে লগ 4 জ 2 ইন্টার্নাল পরিবর্তনের জন্য অ্যাপ্লিকেশনটিকে সংবেদনশীল ছেড়ে দিতে পারে।


5
কেবল রানটাইম নির্ভরতার জন্যLogManager.getLogger(Class.forName("org.hibernate.util.JDBCExceptionReporter")).setLevel(Level.FATAL);
সেলিন এইচসি

8
নোট করুন যে লগ 4 জ 2 এপিআই কোনও "সেটলিভেল" পদ্ধতি সরবরাহ করে না।
ক্রিসকন্ট্রেল

5
তবে এটি কেবল রুট লগার সেট করে, তাই না? রুটের অধীনে লগারদের জন্য যদি স্বতন্ত্র স্তরগুলি সেট করা থাকে তবে রুট লগারটি নির্ধারণ করা those লোগারগুলিতে কোনও প্রভাব ফেলবে না। আমরা কি root.getLoggerRepository ()। GetCurrentCategories () এর মতো কিছু করতে পারি না, লগারের প্রতিটি উদাহরণের উপর পুনরাবৃত্তি করে প্রতিটি লগারের জন্য লেভেল সেট করতে পারি? @ অ্যারোনমিসিভার
দ্য মোনকোহোসোল্ডহিসকোড

8
@ ক্রিসক্যান্ট্রেল লগ 4 জ 2 এটি করার একটি উপায় সরবরাহ করে , যদিও এটি এতটা সহজ নয়।
CorayThan

2
Log4j2.xML ফাইল (বা সমতুল্য) প্রদত্ত বিরতিতে স্ক্যান করে এর কনফিগারেশনটি রিফ্রেশ করার জন্য লগ 4j2 কনফিগার করা যেতে পারে। উদাহরণস্বরূপ <কনফিগারেশন স্ট্যাটাস = "সতর্কতা" মনিটরআইন্টারওয়াল = "5" নাম = "ট্রাইআইটি অ্যাপ্লিকেশন" প্যাকেজগুলি = "">
কিমবল রবিনসন

89

ফাইল ওয়াচডগ

লগ 4j log4j.xmlকনফিগারেশনের পরিবর্তনের জন্য ফাইলটি দেখতে সক্ষম । আপনি যদি log4j ফাইল পরিবর্তন করেন তবে log4j আপনার পরিবর্তনগুলি অনুসারে লগের স্তরগুলিকে স্বয়ংক্রিয়ভাবে রিফ্রেশ করবে। org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,longবিশদ জন্য ডকুমেন্টেশন দেখুন )। চেকগুলির মধ্যে ডিফল্ট অপেক্ষার সময়টি 60 সেকেন্ড। এই পরিবর্তনগুলি অবিচল থাকবে, যেহেতু আপনি সরাসরি ফাইল সিস্টেমে কনফিগারেশন ফাইলটি পরিবর্তন করেন। আপনাকে যা করতে হবে তা হ'ল একবার DOMConfigurator.configureAndWatch () কে অনুরোধ করা।

সাবধানতা: থ্রেড ফাঁসের কারণে J2EE এনভায়রনমেন্টে কনফিগার করুনআ্যান্ডওয়াচ পদ্ধতিটি নিরাপদ নয়

JMX

লগ 4j সেট করার আরেকটি উপায় (বা সাধারণভাবে পুনরায় কনফিগার করা) লগ 4 জেএমএক্স ব্যবহার করে। লগ 4 জে এর লগারদের জেএমএক্স এমবি হিসাবে রেজিস্টার করে। অ্যাপ্লিকেশন সার্ভারগুলি এমবিইন সার্ভার কনসোলগুলি ব্যবহার করে (বা জেডিকের জকনসোল.এক্সে) আপনি প্রতিটি স্বতন্ত্র লগার পুনরায় কনফিগার করতে পারেন। এই পরিবর্তনগুলি অবিচল নয় এবং আপনি আপনার অ্যাপ্লিকেশন (সার্ভার) পুনঃসূচনা করার পরে কনফিগারেশন ফাইলের সেট হিসাবে কনফিগারেশনে পুনরায় সেট করা হবে।

নিজের তৈরি

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


8
লগ 4 জে ওয়াচডগ পদ্ধতির বিষয়ে সতর্কতার একটি শব্দ: "যেহেতু কনফিগারঅ্যান্ডওয়াচ পৃথক ওয়াচডগ থ্রেড চালু করে এবং লগ 4j 1.2 এ এই থ্রেডটি থামানোর কোনও উপায় নেই, তাই J2EE এনভ্রোনমেন্টগুলিতে কনফিগারঅ্যান্ডওয়াচ পদ্ধতিটি নিরাপদ নয় যেখানে অ্যাপ্লিকেশনগুলি পুনর্ব্যবহারযোগ্য"। তথ্যসূত্র: লগ 4 জ এফএকিউ
সোমু

যদি আমি লগ 4 জ এর কনফিগারঅ্যান্ডএন্ড ওয়াচ কার্যকারিতাটি ব্যবহার করতে পারি তবে আমি কোনও ইজেবির @ পোষ্টডেস্ট্রয় পদ্ধতিতে সেই ওয়াচডগ থ্রেডটি থামাতে পারি (এটি কন্টেনারটি বন্ধ হয়ে যাওয়ার সময় যথেষ্ট ভাল সূচক) এটি কি? নাকি এর মধ্যে আরও কিছু আছে যা আমি মিস করছি ..!
রবিন বাজাজ

দুঃখিত আমি @ প্রিস্ট্রোস্ট্রয় পদ্ধতিটি বোঝাতে চাইছিলাম
রবিন

"লগ 4 জে এর লগারদের জেএমএক্স এমবি হিসাবে নিবন্ধন করে। " আমার সার্লেটটি লগ 4 জে 1.2 ব্যবহার করে আমি কোনও লগ 4 ই এম এমিয়ান দেখতে পাই না।
আব্দুল

আপনাকে যা করতে হবে তা হ'ল একবার DOMConfigurator.configureAndWatch () কে অনুরোধ করা। আমি কীভাবে এটি অর্জন করতে পারি?
gstackoverflow 10

5

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 জ 2 এর ফল্ট নয়) - মূলত অ্যাপটি ফাইলটি পরিবর্তন করতে পারে না কারণ এটি কোনও ফ্রেমওয়ার্ক বা সরঞ্জাম দ্বারা অন্য কোনও স্থানে অনুলিপি করা হয়েছিল।
কিমবল রবিনসন

হাই, আমি এটি Jboss6.4 এ পরীক্ষা করেছি এবং আমি লগ 4j2 কনফিগারেশন ফাইলটি (.war ফাইলের অভ্যন্তরের) অধীনে আপডেট করেছি যেখানে অ্যাপ্লিকেশন ফাইলটি দেখতে পারে। তবে এটি এখনও কার্যকর হয়নি। যেকোনো পরামর্শ?
মিডটিয়ারডেভোপার

3

এই উত্তরটি আপনাকে গতিসম্পন্নভাবে লগিংয়ের স্তর পরিবর্তন করতে সহায়তা করবে না, আপনাকে পরিষেবাটি পুনরায় চালু করতে হবে, আপনি যদি পরিষেবাটি পুনরায় চালু করতে চান তবে নীচের সমাধানটি ব্যবহার করুন

আমি লগ 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>

2
আপনার উল্লেখ করা যাই হোক না কেন তা ঠিক আছে বলে মনে হয় তবে প্রশ্নটি লগিংয়ের স্তর পরিবর্তন করার বিষয়ে।
আজিম

এটি করার জন্য, আপনাকে পরিষেবাটি পুনরায় চালু করতে হবে। এটি গতিশীলভাবে লগিংয়ের স্তরগুলি পরিবর্তন করে না।
কে।

2

লগ 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


এই পদ্ধতির ট্রিগার পয়েন্টটি কী? লগ 4 জে কনফিগারেশনে যখনই কোনও পরিবর্তন আসে তখন এটি কীভাবে জানবে যে এই পদ্ধতিটি চালু করা উচিত?
এগ্রোসে জিজ্ঞাসা করুন

আপনি "চাহিদা অনুযায়ী" বলতে চাইছেন তা এখনও পাই না। আপনি কি দয়া করে একটি স্নিপেট প্রদর্শন করতে পারেন যেখানে আপনি এই পদ্ধতিটি আঁকেন?
জিজ্ঞাসা করুন

2
আপনি এখানে যান: এটি কন্ট্রোলারের একটি স্নিপেট যেখানে আমরা এটি ব্যবহার করি। আমাদের লগইনকে গতিশীলভাবে পুনরায় কনফিগার করার জন্য কয়েকটি লিঙ্ক সহ একটি প্রশাসক পৃষ্ঠা রয়েছে, যা লিংক / অ্যাডমিন / সেটলোগলভেল? স্তর = ত্রুটিতে একটি জিইটি করে এবং তারপরে আমরা এটিকে @RequestMapping (মান = "setLogLevel", পদ্ধতি = রিকোয়েস্টমেথড.জিইটি) সর্বজনীন মডেলঅ্যান্ডভিউ সেটলগলাইভেল (@RequestParam (মান = "স্তর", প্রয়োজনীয় = সত্য) স্ট্রিং স্তর) {লগ 4jReconfigurator.reconfigureExisting (স্তর);
ISparkes

সুতরাং, "অন ডিমান্ড" এর অর্থ "যখন ব্যবহারকারী আমার ক্ষেত্রে বোতামটি ক্লিক করেন"
ISparkes

আহ, তোমাকে পেয়েছি সুতরাং আপনার প্রশাসক কনসোলকে এই পদ্ধতিটি শুরু করার জন্য অনুরোধ জানাতে হবে।
জিজ্ঞাসা করুন

0

আমি "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);


-1

আপনি যদি সমস্ত লগারের লগিং স্তরটি পরিবর্তন করতে চান তবে নীচের পদ্ধতিটি ব্যবহার করুন। এটি সমস্ত লগারের উপরে গণনা করবে এবং লগিং স্তরকে প্রদত্ত স্তরে পরিবর্তন করবে। নিশ্চিত করুন যে আপনি যে দয়া করে না আছে 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);
    }
}

-3

আপনি নিম্নলিখিত কোড স্নিপেট ব্যবহার করতে পারেন

((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));

আমি এটি চেষ্টা করতে হবে।
ব্যবহারকারী 2045474
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.