slf4j: কীভাবে বিন্যাসিত বার্তা, অবজেক্ট অ্যারে, ব্যতিক্রম লগ করবেন


274

জনবহুল বার্তা এবং ব্যতিক্রমের স্ট্যাক ট্রেস উভয়ই লগ করতে সঠিক পন্থাটি কী?

logger.error(
    "\ncontext info one two three: {} {} {}\n",
    new Object[] {"1", "2", "3"},
    new Exception("something went wrong"));

আমি এর অনুরূপ একটি আউটপুট উত্পাদন করতে চাই:

context info one two three: 1 2 3
java.lang.Exception: something went wrong
stacktrace 0
stacktrace 1
stacktrace ...

slf4j সংস্করণ 1.6.1


3
আমি বুঝতে পারছি না কেন slf4j স্ট্যান্ডার্ড% s স্টাইলের পরিবর্তে নিজস্ব ফর্ম্যাট স্ট্রিং সিনট্যাক্স ব্যবহার করে। বিরক্তিকর।
কিথ টাইলার

@ কিথটাইলার আমি {}আরও পছন্দ করি , স্বাদের বিষয়টি ...
বেতলিস্টা

@ কিথটাইলার toString()আর্গুমেন্টগুলির পদ্ধতিটি ব্যয়বহুল হতে পারে। এই সিনট্যাক্সের সাহায্যে, প্রতিটি বস্তুর কেবলমাত্র একটি রেফারেন্স পাস করা হয় এবং toString()পদ্ধতিটি কেবল তখনই বলা হয় যদি নির্দিষ্ট বার্তাটি আসলে লগ হয়। info()লগ কলের রেফারেন্সযুক্ত অবজেক্টগুলিতে toString()লগের স্তর WARNবা তার বেশি হলে তাদের পদ্ধতিটি কল করা হবে না । {}সিনট্যাক্স এই একটি নয় ব্যবহারকারীদের এটি এক মহা স্মারক String.format(), -একটি অপারেশন অর্থাৎ তারা স্ট্রিং উপস্থাপনা বদলে বস্তু উহার পাস করা উচিত।
ব্যবহারকারী 149408

উত্তর:


426

এসএলএফ 4 জে 1.6.0 হিসাবে, একাধিক পরামিতিগুলির উপস্থিতিতে এবং লগিংয়ের বিবৃতিতে শেষ যুক্তি যদি ব্যতিক্রম হয়, তবে এসএলএফ 4 জে ধরে নেবে যে ব্যবহারকারী সর্বশেষ যুক্তিটিকে ব্যতিক্রম হিসাবে বিবেচনা করতে চায় এবং একটি সাধারণ পরামিতি হিসাবে বিবেচনা করে না। আরও দেখুন প্রাসঙ্গিক প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী এন্ট্রি

সুতরাং, লিখন (এসএলএফ 4 জে সংস্করণ 1.7.x এবং তারপরে)

 logger.error("one two three: {} {} {}", "a", "b", 
              "c", new Exception("something went wrong"));

বা লিখন (এসএলএফ 4 জে সংস্করণ 1.6.x এ)

 logger.error("one two three: {} {} {}", new Object[] {"a", "b", 
              "c", new Exception("something went wrong")});

ফলন হবে

one two three: a b c
java.lang.Exception: something went wrong
    at Example.main(Example.java:13)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at ...

সঠিক আউটপুট অন্তর্নিহিত কাঠামোর উপর নির্ভর করবে (যেমন লগব্যাক, লগ 4 জে, ইত্যাদি) পাশাপাশি অন্তর্নিহিত কাঠামোটি কীভাবে কনফিগার করা হয়েছে তার উপর। যাইহোক, শেষ পরামিতিটি যদি ব্যতিক্রম হয় তবে অন্তর্নিহিত কাঠামো নির্বিশেষে এটি ব্যাখ্যা করা হবে।


4
আপনি কোন অন্তর্নিহিত লগিং ফ্রেমওয়ার্ক ব্যবহার করছেন? আমার উত্তরে উল্লিখিত হিসাবে, শেষ প্যারামিটারটি যদি ব্যতিক্রম হয় তবে অন্তর্নিহিত কাঠামো নির্বিশেষে এটিকে ব্যাখ্যা করা হবে। (লগব্যাক, slf4j-log4j12, slf4j-jdk14 এবং slf4j- সহজ দিয়ে
পরীক্ষিত

3
দুঃখিত, আমি স্বীকৃতি জানাতে পারি নি যে আপনার উদাহরণে আপনি ফর্ম্যাট স্ট্রিংয়ে n = 3 স্থানধারক এবং অবজেক্ট অ্যারেতে n + 1 = 4 উপাদান ব্যবহার করেছেন। আমার ফর্ম্যাট স্ট্রিংয়ে n স্থানধারক ছিল এবং অবজেক্ট অ্যারেতে n উপাদান প্লাস তৃতীয় প্যারামিটার হিসাবে একটি ব্যতিক্রম ছিল। আমার প্রত্যাশা ছিল ব্যতিক্রমটি স্ট্যাকট্রেস দিয়ে মুদ্রিত হবে তবে এটি কখনও ঘটেনি। এই নকশা হিসাবে কাজ করে? এছাড়াও, যদি আমার শেষ স্থান হিসাবে ব্যতিক্রমের সাথে অবজেক্ট অ্যারেতে n স্থানধারক এবং এন উপাদান থাকে তবে আমি কোনও স্ট্যাকট্রেস দেখতে পাচ্ছি না। অ্যারেতে n + 1 অবজেক্ট সহ এন স্থানধারকদের কিছুটা বেশি জোর দেওয়া উচিত।
সারি

7
আমি জাভাদোকগুলিতে না হয়ে Loggerজাভাদোক শ্রেণিতে শীর্ষে ছিলাম সে সম্পর্কে @ সেকিকে কঠোর সময় দিচ্ছিলাম: slf4j.org/apidocs/org/slf4j/Logger.html
অ্যাডাম জেন্ট

1
আমি উন্নতির অনুরোধ তৈরি করেছি , আপনি যদি এটি পছন্দ করেন তবে আপনি এটির জন্য ভোট দিতে পারেন।
বেতলিস্ট

8

@ সেকির উত্তর ছাড়াও, আপনি যদি লগব্যাক ব্যবহার করেন এবং আপনার প্রকল্পে একটি কনফিগার ফাইল সেটআপ করেন (সাধারণত লগব্যাক.এক্সএমএল), আপনি স্ট্যাকের ট্রেস প্লট করতে লগটিকে সংজ্ঞায়িত করতে পারেন

<encoder>
    <pattern>%date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}</pattern> 
</encoder>

প্যাটার্নে প্রাক্তন% হ'ল পার্থক্যটি

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