প্রোগ্রাম 4 লগ 4 জে লগারগুলি কনফিগার করা


189

আমি এসএলএফ 4 জে (এর সাথে) ব্যবহার করার চেষ্টা করছি log4j প্রথমবারের মতো বাঁধাই সহ) ।

আমি 3 টি আলাদা আলাদা নামযুক্ত লগারকে কনফিগার করতে চাই যা একটি লগার ফ্যাক্টরির দ্বারা ফিরে আসতে পারে যা বিভিন্ন স্তরে লগ করে বিভিন্ন বার্তাগুলিতে বার্তাগুলি ধাক্কা দেয়:

  • লগার 1 "ফাইললগার" ডিইবিইউজি লগ করে এবং এতে যুক্ত হয় DailyRollingFileAppender
  • লগার 2 "ট্র্যাকিংলগার" ট্র্যাক + লগ করে এবং একটিতে সংযোজন করে JmsAppender
  • লগার 3 "ত্রুটিযুক্ত লোক" ERROR + এ লগ করে এবং একটি আলাদাতে সংযোজন করে JmsAppender

তবুও আমি এগুলি XML বা a এর বিপরীতে প্রোগ্রামযুক্তভাবে জাভাতে কনফিগার করতে চাই log4j.properties ফাইলের )।

আমি ধারণা করি যে, সাধারণত, আমি Loggerকোনও init()পদ্ধতির মতো কিছু বুটস্ট্র্যাপিং কোডের কোথাও এইগুলি সংজ্ঞায়িত করব । তবে, কারণ আমি ব্যবহার করতে চাইslf4j-log4j , আমি কোথায় লগারের সংজ্ঞা দিতে এবং সেগুলি ক্লাসপাথে উপলব্ধ করতে পারি সে সম্পর্কে আমি বিভ্রান্ত।

আমি বিশ্বাস করি না যে এটি এসএলএফ 4 জ এর অন্তর্নিহিত উদ্দেশ্য (একটি মুখোমুখি হিসাবে) লঙ্ঘন, কারণ আমার কোড এসএলএফ 4 জ এপিআই ব্যবহার করে কখনই জানতে পারবেন না যে এই লগারের অস্তিত্ব রয়েছে। আমার কোডটি কেবলমাত্র এসএলএফ 4 জ এপিআই-তে সাধারণ কল করে, যা তাদের ক্লাসপথে খুঁজে পাওয়া লগ 4 জে লগারে ফরোয়ার্ড করে।

তবে আমি কীভাবে এই লগ 4 জে লগারদের ক্লাসপথে ... জাভাতে কনফিগার করব ?!



3
লগ 4 জে ১.x এর জন্য নীচের স্বীকৃত উত্তরটি ২.x এর জন্য দেখুন logging.apache.org/log4j/2.x/manual/customconfig.html
earcam

উত্তর:


277

আপনি লোগোজেজে প্রোগ্রামারালিভাবে অ্যাপেন্ডার যুক্ত / অপসারণ করতে পারেন:

  ConsoleAppender console = new ConsoleAppender(); //create appender
  //configure the appender
  String PATTERN = "%d [%p|%c|%C{1}] %m%n";
  console.setLayout(new PatternLayout(PATTERN)); 
  console.setThreshold(Level.FATAL);
  console.activateOptions();
  //add appender to any Logger (here is root)
  Logger.getRootLogger().addAppender(console);

  FileAppender fa = new FileAppender();
  fa.setName("FileLogger");
  fa.setFile("mylog.log");
  fa.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
  fa.setThreshold(Level.DEBUG);
  fa.setAppend(true);
  fa.activateOptions();

  //add appender to any Logger (here is root)
  Logger.getRootLogger().addAppender(fa);
  //repeat with all other desired appenders

আমি আপনাকে এটি একটি কোথাও একটি init () এ রাখার পরামর্শ দিচ্ছি, যেখানে আপনি নিশ্চিত, এটি অন্য কোনও কিছুর আগেই কার্যকর করা হবে। এরপরে আপনি রুট লগারে থাকা সমস্ত বিদ্যমান অ্যাপেন্ডারগুলিকে মুছে ফেলতে পারেন

 Logger.getRootLogger().getLoggerRepository().resetConfiguration();

এবং আপনার নিজের যুক্ত করে শুরু করুন। এটি কাজ করার জন্য আপনার অবশ্যই অবশ্যই ক্লাসপথে লগ 4 জে প্রয়োজন।

মন্তব্য:
আপনি যে কোনও নিতে পারেনLogger.getLogger(...) অ্যাপেন্ডার যুক্ত করতে আপনি যে কোনওটিকে । আমি কেবলমাত্র রুট লগারটি গ্রহণ করেছি কারণ এটি সমস্ত জিনিসের নীচে এবং এটি অন্যান্য বিভাগের অন্যান্য সংযোজনকারীদের মধ্য দিয়ে যাওয়া সমস্ত কিছু পরিচালনা করবে (যদি না অ্যাডিটিভিটি পতাকা সেট করে অন্যথায় কনফিগার করা হয়)।

আপনার যদি লগিং কীভাবে কাজ করে এবং লগগুলি কোথায় লিখিত হয় সে সম্পর্কে আরও ইনফোগুলির জন্য এই ম্যানুয়ালটি পড়ুন কীভাবে তা জানতে হবে।
সংক্ষেপে:

  Logger fizz = LoggerFactory.getLogger("com.fizz")

"com.fizz" বিভাগের জন্য আপনাকে একটি লগার দেবে।
উপরের উদাহরণের জন্য এর অর্থ হ'ল এর সাথে লগ করা সমস্ত কিছুই রুট লগারে কনসোল এবং ফাইল অ্যাপেন্ডারের কাছে উল্লেখ করা হবে।
আপনি Logger.getLogger ( "com.fizz") একটি appender যুক্ত করে থাকেন। AddAppender (newAppender) তারপর থেকে লগ-ইন fizzরুট এটির থেকে appenders Alle দ্বারা পরিচালিত হবে newAppender
আপনি কনফিগারেশন দিয়ে লগার তৈরি করেন না, আপনি কেবল আপনার সিস্টেমে সমস্ত সম্ভাব্য বিভাগের জন্য হ্যান্ডলার সরবরাহ করেন।


2
ধন্যবাদ ওরে! তাত্ক্ষণিক প্রশ্ন - আমি লক্ষ্য করেছি আপনি রুট লগারটিতে সংযোজনকারী যুক্ত করছেন। এরজন্য কি কোন কারণ আছে?
IAmYourFaja 15'8

এবং আরও গুরুত্বপূর্ণভাবে, আমাকে এসএলএফ 4 জ এর লগার ফ্যাক্টরি থেকে কোন লগারটি পুনরুদ্ধার করতে হবে তা নির্দিষ্ট করতে হবে। লগ 4j এর মূল লগারের জন্য কি এসএলএফ 4 জে জিজ্ঞাসা করা সম্ভব?
IAmYourFaja 15

3
@ অ্যাডামটানন আপনি যে কোনও লগার.জেটলগার (...) নিতে পারেন। আমি কেবলমাত্র রুট লগারটি গ্রহণ করেছি কারণ এটি সমস্ত জিনিসের নীচে এবং এটি অন্যান্য বিভাগের অন্যান্য সংযোজনকারীদের মাধ্যমে পাস করা সমস্ত কিছুই পরিচালনা করবে (অন্যথায় কনফিগার না করা থাকলে)। এটির অনুক্রমের দেখুন
oers

@ অ্যাডাম ট্যানন আপনি লগ 4 জে রুট লগারের জন্য sl4j কারখানাটি ব্যবহার করতে পারবেন না। এসএল 4 জ একটি লগিং ফ্যাকাস। আপনি এটি থেকে নির্দিষ্ট কিছু log4j পাবেন না।
oers

2
ওয়ার্স - আমি আপনার দুর্দান্ত প্রতিক্রিয়ার প্রশংসা করি, তবে আমি এখানে সমস্ত বিন্দু সংযোগ করছি না। নতুন লগার যোগ করতে (উদাহরণস্বরূপ, রুট লগার নয়) যা আপনার সিস্টেমে একবার যুক্ত হয়ে গেলে, অন্য যে কোনও শ্রেণীর কাছে এটি জিজ্ঞাসা করবে তার জন্য উপলব্ধ করার জন্য আপনি কী নিজের উদাহরণটি পরিবর্তন করতে পারবেন? উদাহরণস্বরূপ, এমন একটি লগার যা সাধারণত অ্যাক্সেস করতে পারে, বলুন, Logger fizz = LoggerFactory.getLogger("com.fizz");ধন্যবাদ!
IAmYourFaja

47

মনে হচ্ছে আপনি "উভয় প্রান্ত" (ভোক্তার শেষ এবং কনফিগারেশন শেষ) থেকে লগ 4 জে ব্যবহার করার চেষ্টা করছেন।

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

public class YourLoggingWrapper {
    private static boolean loggingIsInitialized = false;

    public YourLoggingWrapper() {
        // ...blah
    }

    public static void debug(String debugMsg) {
        log(LogLevel.Debug, debugMsg);
    }

    // Same for all other log levels your want to handle.
    // You mentioned TRACE and ERROR.

    private static void log(LogLevel level, String logMsg) {
        if(!loggingIsInitialized)
            initLogging();

        org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger("DebugLogger");

        switch(level) {
        case: Debug:
            logger.debug(logMsg);
            break;
        default:
            // whatever
        }
    }

    // log4j logging is lazily constructed; it gets initialized
    // the first time the invoking app calls a log method
    private static void initLogging() {
        loggingIsInitialized = true;

        org.apache.log4j.Logger debugLogger = org.apache.log4j.LoggerFactory.getLogger("DebugLogger");

        // Now all the same configuration code that @oers suggested applies...
        // configure the logger, configure and add its appenders, etc.
        debugLogger.addAppender(someConfiguredFileAppender);
    }

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


2
এটি পেরেক! একটি সহায়ক উদাহরণের জন্য আপনাকে অনেক ধন্যবাদ! @ ওয়ারস - আমাকে সঠিক দিকে চালিত করার চেষ্টা করার জন্য আপনাকে ধন্যবাদ - আমি আপনাকে উত্সর্গের জন্য সবুজ চেক দেব তবে harারভেদীকে অনুগ্রহ দিতে হবে কারণ আমি যা খুঁজছিলাম ঠিক এটি ছিল। সবাইকে আবার ধন্যবাদ!
IAmYourFaja

4

আপনি যদি লগ 4 জে বৈশিষ্ট্যে কোনও অ্যাপেন্ডারকে সংজ্ঞায়িত করেছেন এবং প্রোগ্রামগতভাবে এটি আপডেট করতে চান, লগ 4 জে বৈশিষ্ট্যগুলিতে নামটি সেট করুন এবং নাম অনুসারে এটি পেতে চান।

এখানে log4j.properties এন্ট্রি একটি উদাহরণ রয়েছে:

log4j.appender.stdout.Name=console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=INFO

এটি আপডেট করতে, নিম্নলিখিতটি করুন:

((ConsoleAppender) Logger.getRootLogger().getAppender("console")).setThreshold(Level.DEBUG);

1

যদি কেউ জাভাতে লগ 4j2 প্রোগ্রামগতভাবে কনফিগার করার সন্ধান করতে আসে, তবে এই লিঙ্কটি সহায়তা করতে পারে: ( https://www.studytonight.com/post/log4j2-programmatic-configration-in-java-class )

কনসোল অ্যাপেন্ডার কনফিগার করার জন্য এখানে বেসিক কোডটি রয়েছে:

ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();

builder.setStatusLevel(Level.DEBUG);
// naming the logger configuration
builder.setConfigurationName("DefaultLogger");

// create a console appender
AppenderComponentBuilder appenderBuilder = builder.newAppender("Console", "CONSOLE")
                .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
// add a layout like pattern, json etc
appenderBuilder.add(builder.newLayout("PatternLayout")
                .addAttribute("pattern", "%d %p %c [%t] %m%n"));
RootLoggerComponentBuilder rootLogger = builder.newRootLogger(Level.DEBUG);
rootLogger.add(builder.newAppenderRef("Console"));

builder.add(appenderBuilder);
builder.add(rootLogger);
Configurator.reconfigure(builder.build());

এটি ডিফল্ট রুটলগারকে পুনরায় কনফিগার করবে এবং একটি নতুন অ্যাপেন্ডার তৈরি করবে ।

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