জাভা লগিং এপিআই ব্যবহার করার সময় আমি কীভাবে ডিফল্ট কনসোল হ্যান্ডলার অক্ষম করতে পারি?


94

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

Handler fh = new FileHandler("test.txt");
fh.setFormatter(formatter);
logger.addHandler(fh);

Handler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);

import java.util.Date;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class LoggingExample {
    private static Logger logger = Logger.getLogger("test");

    static {
        try {
            logger.setLevel(Level.INFO);

            Formatter formatter = new Formatter() {

                @Override
                public String format(LogRecord arg0) {
                    StringBuilder b = new StringBuilder();
                    b.append(new Date());
                    b.append(" ");
                    b.append(arg0.getSourceClassName());
                    b.append(" ");
                    b.append(arg0.getSourceMethodName());
                    b.append(" ");
                    b.append(arg0.getLevel());
                    b.append(" ");
                    b.append(arg0.getMessage());
                    b.append(System.getProperty("line.separator"));
                    return b.toString();
                }

            };

            Handler fh = new FileHandler("test.txt");
            fh.setFormatter(formatter);
            logger.addHandler(fh);

            Handler ch = new ConsoleHandler();
            ch.setFormatter(formatter);
            logger.addHandler(ch);

            LogManager lm = LogManager.getLogManager();
            lm.addLogger(logger);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        logger.info("why does my test application use the standard console logger ?\n" + " I want only my console handler (Handler ch)\n " + "how can i turn the standard logger to the console off. ??");
    }
}

4
আমি কি আলতো করে b.append(formatMessage(arg0))পরিবর্তে ব্যবহার করার পরামর্শ দিতে পারি b.append(arg0.getMessage())? ব্যবহারের সাথে formatMessageআপনি public void log(Level level, String msg, Object param1)একই ধরণের পদ্ধতির সাথে আপনার ফর্ম্যাটরটি সামঞ্জস্য করছেন ।
ভিক্টর

উত্তর:


103

ডিফল্ট কনসোল হ্যান্ডলারটি রুট লগারের সাথে সংযুক্ত থাকে, যা আপনার সহ অন্যান্য সমস্ত লগারের পিতা বা মাতা। সুতরাং আমি আপনার সমস্যা সমাধানের দুটি উপায় দেখতে পাচ্ছি:

এটি যদি আপনার কেবলমাত্র এই নির্দিষ্ট শ্রেণিকেই প্রভাবিত করে, তবে সহজ সমাধান হ'ল পিতামহীন লগারে লগগুলি অক্ষম করা:

logger.setUseParentHandlers(false);

আপনি যদি নিজের পুরো অ্যাপ্লিকেশানের জন্য এই আচরণটি পরিবর্তন করতে চান, আপনি নিজের হ্যান্ডলার যুক্ত করার আগে আপনি সম্পূর্ণরূপে রুট লগার থেকে ডিফল্ট কনসোল হ্যান্ডলারটি সরিয়ে ফেলতে পারেন:

Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
    globalLogger.removeHandler(handler);
}

দ্রষ্টব্য: আপনি যদি অন্য ক্লাসেও একই লগ হ্যান্ডলারগুলি ব্যবহার করতে চান তবে দীর্ঘমেয়াদে লগ কনফিগারেশনটিকে একটি কনফিগার ফাইলে স্থানান্তরিত করার সর্বোত্তম উপায়।


4
setUseParentHandlers পদ্ধতি কাজ করে, ধন্যবাদ। আমি কিভাবে রুট লগার থেকে ডিফল্ট কনসোল হ্যান্ডলারটি সরিয়ে ফেলতে পারি?
লাউডিয়ামিমো

10
আপনি লগার.জেটলগার ("" )ও ব্যবহার করতে পারেন - এটি আমার জন্য কাজ করে যেখানে "গ্লোবাল" না হয় (মিশ্রণে এসএলএফ 4 জে ফলাফল হতে পারে?)
সেহাগ

4
আপনি যদি LogManager.getLogManager().reset(); SLF4JBridgeHandler.install();
slf4j

8
"" হ'ল মূল লগার সনাক্তকারী। "গ্লোবাল" হ'ল নামযুক্ত লগার (মূলের সন্তান) যা ডিফল্টরূপে তৈরি হয়েছিল এবং সরল লগিং
দৃশ্যে

4
এই উত্তরটি আমার পক্ষে কাজ করে না তবে ডমিনিকের একটি করে
বুলিউইপ্লাজা

110

শুধু কর

LogManager.getLogManager().reset();

4
ধন্যবাদ, এটি সঠিক উত্তর। উত্তরটি সঠিক হিসাবে চিহ্নিত হয়েছে, কাজ করে না।
আন্দ্রেয়াস এল

4
এটি উল্লেখ করা উচিত যে এটি প্রতিটি নামের জন্য প্রতিটি হ্যান্ডলারকে প্রভাবিত করবে Loggerসুতরাং এটি আরও জটিল লগ সিস্টেমের জন্য সমস্যা হতে পারে। ফিউচার লগার প্রভাবিত হবে না তা নিশ্চিত হওয়ার জন্য প্রক্রিয়ার শুরুতে একবার এই কল করা উচিত। এবং অবশ্যই, কনসোলটির যেটির প্রয়োজন হবে তার ConsoleHandlerপ্রত্যাশার সাথে সাথে একটি গ্রহণ করা প্রয়োজন ।
এক্সেলহ

20

এটি অদ্ভুত তবে Logger.getLogger("global") আমার সেটআপে (পাশাপাশি Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)) কাজ করে না ।

তবে Logger.getLogger("")কাজটি ভাল করে।

আশা করি এই তথ্যটিও কাউকে সহায়তা করবে ...


4
কেউ কী আমাদের বলতে পারেন যে getLogger (লগার। GLOBAL_LOGGER_NAME) কাজ না করে getLogger ("") করে কেন?
ডিনোচিরাস

4
@ ডিইনোচিরাস এই উত্তরে
পাওলো ফুলগনি

9

কনফিগারেশনটির পুনরায় সেট করুন এবং মূল স্তরটি বন্ধ করুন

LogManager.getLogManager().reset();
Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
globalLogger.setLevel(java.util.logging.Level.OFF);

5

আপনার লগারের বার্তা এটির প্যারেন্ট লগারে না পাঠাতে আপনাকে অবশ্যই নির্দেশ দিতে হবে:

...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...

তবে লগারে আর কোনও হ্যান্ডলার যুক্ত করার আগে এটি করা উচিত।


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