আপনি সাধারণত লগ এন্ট্রি কিভাবে ট্যাগ করেন? (অ্যান্ড্রয়েড)


96

আমি ধরে নিলাম আপনার বেশিরভাগই android.util সম্পর্কে সচেতন aware লগ সমস্ত লগিং পদ্ধতি প্রথম স্ট্রিং হিসাবে 'স্ট্রিং ট্যাগ' গ্রহণ করে।

এবং আমার প্রশ্ন হ'ল আপনি সাধারণত আপনার অ্যাপ্লিকেশনগুলিতে লগগুলি কীভাবে ট্যাগ করবেন? আমি এর মতো কিছু হার্ডকোড দেখেছি:

public class MyActivity extends Activity {
    private static final String TAG = "MyActivity";
    //...
    public void method () {
        //...
        Log.d(TAG, "Some logging");
    }
}

এটি অনেক কারণে সুন্দর দেখাচ্ছে না:

  • আপনি আমাকে বলতে পারেন এই কোডটিতে হার্ডকোড নেই, তবে তা রয়েছে।
  • আমার অ্যাপ্লিকেশনটিতে একই নাম সহ বিভিন্ন প্যাকেজটিতে অনেকগুলি ক্লাস থাকতে পারে। তাই লগতে পঠন কঠিন।
  • এটি নমনীয় নয়। আপনি সর্বদা একটি ব্যক্তিগত ক্ষেত্র TAG আপনার ক্লাসে রেখেছেন।

কোনও শ্রেণীর জন্য ট্যাগ পাওয়ার জন্য কি কোনও ঝরঝরে উপায় আছে?


4
ট্যাগ ব্যবহার অ্যান্ড্রয়েড জাভাদোক দ্বারা প্রস্তাবিত , তাই আমি রানটাইমে ক্লাসের নাম পাওয়ার চেয়ে খারাপ মনে করি না
ভ্লাদিমির

আমি জেনারেল কনস্ট্যান্টসের মতো একটি নির্দিষ্ট শ্রেণি তৈরি করতে পছন্দ করি এবং এটিতে আমার ট্যাগগুলি রেখেছি এবং আমি আমার ট্যাগগুলিতে যে জাতীয় ক্লাস চাই তা পৌঁছে দিতে পারি; GeneralConstans.MY_TAG
cagryInside

6
আমি মনে করি TAG ক্লাসে সংজ্ঞায়িত করা ভাল, শ্রেণীর নামটির হার্ডকোডিং কুশল তবে অগ্রগতির সাথে কাজ করার একমাত্র নির্ভরযোগ্য উপায়। আপনি যদি কখনও অগ্রগতি ব্যবহার না করেন তবে MyActivity.class.getName () সেরা সমাধান। যদি আপনি সদৃশ নামগুলি নিয়ে চিন্তিত হন তবে কেবল প্যাকেজের নাম অন্তর্ভুক্ত করুন। ট্যাগের আলাদা জায়গায় নাম রাখা রক্ষণাবেক্ষণের দুঃস্বপ্ন হয়ে যাবে।
রাল্ফ মুয়েলার

উত্তর:


181

আমি একটি ট্যাগ ব্যবহার করি, তবে আমি এটির মতো এটি শুরু করি:

private static final String TAG = MyActivity.class.getName();

এইভাবে যখন আমি আমার কোডটি রিফ্যাক্ট করব তখন সেই অনুসারে ট্যাগটিও পরিবর্তন হবে।


21
আমি ট্যাগ ধ্রুবক একইভাবে সংজ্ঞায়িত করছি। যাইহোক, আমি ভাবছি, কীভাবে কোড অবফসেশন সরঞ্জামগুলি আমার শ্রেণীর নামগুলিকে প্রভাবিত করবে এবং ফলস্বরূপ এই ধ্রুবকের মান?
ওলেগস ব্রিসকা

4
এই সমস্ত সময় আমি ম্যানুয়ালি পেস্ট করেছি "MyActivity.class.getName();"। আমি সবসময় ভেবেছিলাম গুগল ইত্যাদির উদাহরণগুলিতে "ট্যাগ" কেবল স্থানধারক ছিল ... আসল Staticপরিবর্তনশীল নয়! এটি একটি আরও ভাল সমাধান ধন্যবাদ :)
তারযুক্ত 100

4
স্থির অপসারণ এবং this.getClass().getName()এটিকে আরও জেনেরিক করার পরিবর্তে ব্যবহার করবেন না কেন ?
theblang

11
আপনি TAG- এ দৈর্ঘ্যের সীমাবদ্ধতা এড়াতে এই.গেটক্লাস ()। GetSimpleName () চেষ্টা করতে চাইতে পারেন। ট্যাগ. দৈর্ঘ্য ()> ২৩. অবৈধ অরগমেন্টমেন্ট ধারণাটি নিক্ষেপ করা হয়
মাইকেল লেভি

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

16

আমি সাধারণত একটি Appশ্রেণি তৈরি করি যা বিভিন্ন প্যাকেজে বসে এবং দরকারী স্থিতিশীল পদ্ধতি ধারণ করে। পদ্ধতির একটি হ'ল একটি getTag()পদ্ধতি, এই ভাবে আমি যে কোনও জায়গায় ট্যাগটি পেতে পারি।
Appবর্গটি দেখতে এরকম দেখাচ্ছে:

সম্পাদনা : প্রতি জন সংঘের মন্তব্য উন্নত (ধন্যবাদ :))

public class App {

    public static String getTag() {
        String tag = "";
        final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
        for (int i = 0; i < ste.length; i++) {
            if (ste[i].getMethodName().equals("getTag")) {
                tag = "("+ste[i + 1].getFileName() + ":" + ste[i + 1].getLineNumber()+")";
            }
        }
        return tag;
    }

}

এবং যখন আমি এটি ব্যবহার করতে চাই:

Log.i(App.getTag(), "Your message here");

getTagপদ্ধতির আউটপুট হ'ল কলার শ্রেণীর নাম (প্যাকেজের নাম সহ), এবং getTagসহজে ডিবাগিংয়ের জন্য লাইন নম্বরটি যেখানে ডাকা হয়।


6
আমি অবশ্যই এটি করব না .. আপনার লগ স্টেটমেন্টগুলি যদি আপনি এটি করেন তবে একটি দুর্দান্ত পারফরম্যান্স হিট নিতে চলেছে। আপনি যদি এটি করেন তবে আপনি অবশ্যই উত্পাদন বিল্ডগুলির উপর সতর্কতার চেয়ে কম কিছুতে লগ বার্তাগুলি সরাতে চাইবেন।
ম্যাট ওল্ফ

4
ম্যাট, আপনি একদম ঠিক বলেছেন! উত্পাদনের লগগুলি সরিয়ে ফেলা / স্ট্রিপ করা ভাল অনুশীলন - stackoverflow.com/a/2019563/2270166
ইয়ানিভ

4
ট্যাগের দৈর্ঘ্যটি এখন 23 টি অক্ষরে সীমাবদ্ধ হওয়ার কারণে সম্ভবত এটি আর সুপারিশ করা হয়নি
ক্লাদিও রেডি

কিভাবে getStackTrace()কাজ করে আমাকে দেখানোর জন্য ধন্যবাদ । তবে আমি এটি ব্যবহার করব না কারণ এটি ব্যয়বহুল
ব্লু উইজার্ড

13

অ্যান্ড্রয়েড স্টুডিওতে যান -> পছন্দ -> লাইভ টেম্পলেট -> অ্যান্ড্রয়েড লগ তারপর লগ.ডি (TAG, স্ট্রিং) নির্বাচন করুন ।

ইন টেমপ্লেট টেক্সট প্রতিস্থাপন

android.util.Log.d(TAG, "$METHOD_NAME$: $content$");

সঙ্গে

android.util.Log.d("$className$", "$METHOD_NAME$: $content$");

অ্যান্ড্রয়েড মেনুর চিত্র

তারপরে সম্পাদনা ভেরিয়েবলগুলি ক্লিক করুন এবং শ্রেণীর নাম নাম কলামের পাশের এক্সপ্রেশন কলামে ClassName () লিখুন ।অ্যান্ড্রয়েড মেনু 2 এর চিত্র

এখন আপনি যখন শর্টকাট টাইপ করবেন logdএটি স্থাপন করবে

Log.d("CurrentClassName", "currentMethodName: ");

আপনাকে আর একটি ট্যাগ সংজ্ঞায়িত করতে হবে না।


4
এটি অ্যান্ড্রয়েড স্টুডিওর একটি দুর্দান্ত ব্যবহার এবং সমস্যাটির জন্য একটি আকর্ষণীয় দৃষ্টিভঙ্গি, যদিও একই সময়ে আপনি প্রকৃতপক্ষে TAG ভেরিয়েবলের জায়গায় স্ট্রিংটি ইনপুট দিচ্ছেন, অর্থাত যদি এটি পরিবর্তন করার প্রয়োজন হয় তবে এটি কিছুটা জটিল হতে পারে, তাই না? কার্যকারিতা যদিও দেখানোর জন্য +1, ধন্যবাদ!
ভয়ে

4
আমি এই পদ্ধতিটি পছন্দ করি তবে আমি বিদ্যমান পরিবর্তনের পরিবর্তে একটি নতুন লগ এন্ট্রি তৈরি করব, এটি ভবিষ্যতের আপডেটে বা অন্য কোনও ক্ষেত্রে পরিবর্তিত হলে কেবল নিরাপদ দিকে থাকতে।
আলা

9

আমি ইয়ানিভ উত্তরটি উন্নত করতে চাই যদি আপনি এই ফর্ম্যাটটিতে (ফাইলের নাম.জভা: এক্সএক্স) এক্সএক্স লাইন নম্বরটিতে লগইন করতে পারেন আপনি শর্টকাটটি একইভাবে সংযুক্ত করতে পারেন যখন কোনও ত্রুটি আছে তখন আপনি লিঙ্কটিতে সরাসরি যেতে পারেন শুধু লগক্যাট ক্লিক করে

আমি এটিকে আমার বর্ধিত অ্যাপ্লিকেশনের ভিতরে রেখেছি যাতে আমি অন্যান্য ফাইলটিতে ব্যবহার করতে পারি

public static String getTag() {
    String tag = "";
    final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
    for (int i = 0; i < ste.length; i++) {
        if (ste[i].getMethodName().equals("getTag")) {
            tag = "("+ste[i + 1].getFileName() + ":" + ste[i + 1].getLineNumber()+")";
        }
    }
    return tag;
}

স্ক্রিনশট:


এটি ভালবাসা, এটি "চুরি করা" এবং আমার উত্তর আপডেট করে :)
ইয়ানিভ

4
ট্যাগের দৈর্ঘ্যটি এখন 23 টি অক্ষরে সীমাবদ্ধ হওয়ার কারণে সম্ভবত এটি আর সুপারিশ করা হয়নি
ক্লাদিও রেডি

3

অ্যান্ড্রয়েডস্টুডিওর logtডিফল্টরূপে একটি টেম্পলেট থাকে ( logtএটি কোডের সিনপেটে প্রসারিত করতে আপনি ট্যাবটি টাইপ করে টিপতে পারেন)। অন্য শ্রেণীর কাছ থেকে TAG সংজ্ঞাটি আটকানো এবং আপনি যে ক্লাসটি উল্লেখ করছেন সেটি পরিবর্তন করতে ভুলে যাবার জন্য আমি এটি ব্যবহার করার পরামর্শ দিচ্ছি। টেম্পলেটটি ডিফল্টরূপে প্রসারিত হয়

private static final String TAG = "$CLASS_NAME$"

রিফ্যাক্টরিংয়ের পরে পুরাতন শ্রেণীর নামটি এড়াতে আপনি এটিকে পরিবর্তন করতে পারেন

private static final String TAG = $CLASS_NAME$.class.getSimpleName();

"সম্পাদনা ভেরিয়েবল" বোতামটি পরীক্ষা করে দেখুন এবং CLASS_NAMEভেরিয়েবলটি className()এক্সপ্রেশনটি ব্যবহার করতে সংজ্ঞায়িত হয়েছে এবং "সংজ্ঞায়িত হলে এড়িয়ে যান" চেক করা আছে কিনা তা নিশ্চিত হয়ে নিন।


2

আমি স্ট্যাটিক ভেরিয়েবল, পদ্ধতি এবং এর মতো ক্লাস তৈরি করেছি S

নিম্নলিখিতটি লগিং পদ্ধতি:

public static void L(Context ctx, Object s) {
    Log.d("CCC " + ctx.getClass().getName().replace(ctx.getPackageName(), ""), s.toString());
}

এটা কোনো ক্লাসে বলা হয় এছাড়াও প্যাকেজের নাম appends, অত, আমি এটা আউট সরানোর করছি অকারণে দীর্ঘ ট্যাগ উপার্জন এড়ানো।S.L(this, whaterver_object);getClass().getName()

সুবিধাদি:

  1. অপেক্ষাকৃত ছোট Log.d(TAG,
  2. কোন মানগুলি তাদের স্ট্রিংয়ে রূপান্তর করতে হবে না। আসলে টাইপ করার দরকার নেইtoString
  3. Log.dআমাকে কেবল পদ্ধতিটি মুছতে হবে এবং সমস্ত লগের অবস্থানগুলি লাল হিসাবে চিহ্নিত হওয়ার কারণে কখনও মুছে ফেলতে ভুলবেন না ।
  4. শ্রেণীর নাম হওয়ায় এই কার্যকলাপের শীর্ষে TAG নির্ধারণ করার দরকার নেই।
  5. ট্যাগটির একটি উপসর্গ রয়েছে CCC(একটি সংক্ষিপ্ত, সহজ টাইপিং স্ট্রিং) যাতে অ্যান্ড্রয়েড স্টুডিওতে কেবল আপনার লগগুলি অ্যান্ড্রয়েড মনিটরে তালিকাবদ্ধ করা সহজ হয়। কখনও কখনও আপনি পরিষেবা বা অন্যান্য ক্লাস একযোগে চালাচ্ছেন। যদি আপনাকে একা ক্রিয়াকলাপের নাম অনুসারে অনুসন্ধান করতে হয় তবে আপনি কখনই পরিষেবাটির প্রতিক্রিয়া পেয়েছিলেন এবং তারপরে আপনার ক্রিয়াকলাপ থেকে কোনও ক্রিয়াকলাপ ঘটেছিল তা ঠিক দেখতে পাবেন না। সিসিসির মতো একটি উপসর্গ এটির যে ক্রিয়াকলাপটি ঘটেছে তাতে কালক্রমে লগগুলি দেওয়ার জন্য আপনাকে সহায়তা করে

4
দুর্দান্ত সমাধান! আমি এটি ব্যবহার করি! তবে আমি Context ctxদ্বারা Object ctxএবং ctx.getClass().getName().replace(ctx.getPackageName(), "")দ্বারা প্রতিস্থাপিত ctx.getClass().getSimpleName()। এইভাবে, আমি S.L(Object, Object)যে কোনও জায়গায় কল করতে পারি ( তাত্ক্ষণিকভাবে Fragmentপ্রসারিত না হওয়া সহ Context)।
আন্তোনিও ভিনিসিয়াস মেনেইজেস মেডিই

1

আপনি this.toString()যে নির্দিষ্ট শ্রেণিতে লগতে মুদ্রণ করেছেন সেটির জন্য আপনি একটি অনন্য সনাক্তকারী পেতে ব্যবহার করতে পারেন ।


এটি কী toString()করে তার উপর নির্ভর করে ব্যয়বহুল হতে পারে।
টার

1

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

public class MyClass {

    // note this is ALWAYS private...subclasses should define their own
    private static final LOG_TAG = MyClass.class.getName();

    public void f() {
        Log.i(LOG_TAG + ".f", "Merry Christmas!");
    }

}

এখানে সুবিধাটি হ'ল বিষয়বস্তু অচল নয়, এমনকি আপনি যদি একটি একক পদ্ধতিও ফিল্টার করতে পারেন

Log.i(LOG_TAG + ".f", String.valueOf(new Random().nextInt()));

শুধুমাত্র অপূর্ণতা যে যখন আমি নামান্তর হয় f()থেকে g()আমি মনের মধ্যে যে স্ট্রিং রাখা প্রয়োজন। এছাড়াও, স্বয়ংক্রিয় আইডিই রিফ্যাক্টরিংগুলি এগুলি ধরবে না।

কিছুক্ষণের জন্য আমি শর্ট ক্লাসের নামটি ব্যবহার করার ভক্ত ছিলাম, আমি বলতে চাইছি LOG_TAG = MyClass.class.getSimpleName()। লগগুলিতে ফিল্টার করতে আমি তাদেরকে আরও শক্ত করে পেয়েছি কারণ সেখানে যাওয়া কম ছিল।


1

এটি একটি খুব পুরানো প্রশ্ন, তবে এমনকি জুলাই 2018 এর জন্য একটি আপডেট হওয়া উত্তরটি টিম্বার ব্যবহার করা আরও বেশি ভাল thought সঠিক লগিং লগ করতে, ত্রুটি এবং সতর্কতা ফায়ারবেস বা ক্র্যাশলাইটিক্সের মতো তৃতীয় পক্ষের ক্র্যাশ লাইব্রেরিতে পাঠানো যেতে পারে।

অ্যাপ্লিকেশন প্রয়োগ করে এমন ক্লাসে আপনার এটি যুক্ত করা উচিত:

@Override
public void onCreate() {
    super.onCreate();
    if (BuildConfig.DEBUG) {
        Timber.plant(new Timber.DebugTree());
    } else {
        Timber.plant(new CrashReportingTree());
    }
}

/** A tree which logs important information for crash reporting. */
private static class CrashReportingTree extends Timber.Tree {
    @Override protected void log(int priority, String tag, String message, Throwable t) {
        if (priority == Log.VERBOSE || priority == Log.DEBUG) {
            return;
        }

        FakeCrashLibrary.log(priority, tag, message);

        if (t != null) {
            if (priority == Log.ERROR) {
                FakeCrashLibrary.logError(t);
            } else if (priority == Log.WARN) {
                FakeCrashLibrary.logWarning(t);
            }
        }
    }
}

টিম্বার নির্ভরতা ভুলবেন না।

implementation 'com.jakewharton.timber:timber:4.7.1'


0

তারা ডিবাগ তথ্য দেখানোর জন্য আইওএসচেড অ্যাপ্লিকেশন 2019 এর জন্য টিম্বার ব্যবহার করে:

implementation 'com.jakewharton.timber:timber:4.7.1'

class ApplicationController: Application() {

override fun onCreate() {  
    super.onCreate()
    if(BuildConfig.DEBUG){
        Timber.plant(Timber.DebugTree())
    }
}   
// enables logs for every activity and service of the application
// needs to be registered in manifest like:  
 <application
    android:label="@string/app_name"
    android:name=".ApplicationController"
    ... >

ব্যবহার

  Timber.e("Error Message") 
  // will print ->  D/MainActivity: Error Message

  Timber.d("Debug Message");
  Timber.tag("new tag").e("error message");

নোট করুন যে এটি লগগুলি কেবলমাত্র ডিইবিইউজি রাজ্যের সময়ে উপলব্ধ করে তোলে এবং গুগল প্লেতে লঞ্চের জন্য ম্যানুয়ালি এগুলি সরানোর কাজটি আপনাকে সহায়তা করে -

প্লে স্টোরে অ্যাপটি প্রকাশ করার সময়, আমাদের অ্যাপ্লিকেশন থেকে সমস্ত লগ স্টেটমেন্ট সরিয়ে ফেলতে হবে, যাতে ব্যবহারকারীর তথ্য, গোপনীয় অ্যাপ্লিকেশন ডেটা, লেখার টোকেনগুলির মতো অ্যাপ্লিকেশন ডেটার কোনওটিই সরল পাঠ্য হিসাবে লগকটে ব্যবহারকারীর জন্য উপলব্ধ না হয়

এই নিবন্ধটি দেখুন https://medium.com/mindorks/better-logging-in-android- using- timber- 72e40cc2293d


-2

আমি সাধারণত পদ্ধতির নাম ট্যাগ হিসাবে ব্যবহার করি তবে থ্রেড থেকে

String TAG = Thread.currentThread().getStackTrace()[1].getMethodName();

এটি নতুন ব্যতিক্রম এড়ায়।


-9
private static final String TAG = new RuntimeException().getStackTrace()[0].getClassName();

4
আপনি RuntimeExceptionকেবলমাত্র বর্তমান শ্রেণীর নাম পেতে একটি নতুন কেন তৈরি করবেন ? খুব খারাপ.
জিজ্ঞাসা করুন

এইভাবে আমি আমার লগ এন্ট্রিগুলিকে ট্যাগ করি, আমি যখন কোনও প্রকল্প থেকে অন্যে ক্লাস অনুলিপি করি তখনই আমি সঠিকভাবে রিফ্যাক্টর করতে পারি এটির সমাধান। আপনার আরও ভাল এবং আরও আরামদায়ক ধারণা থাকলে আমি পরামর্শের জন্য উন্মুক্ত।
উঠুন

4
আপনি যদি কোনও নাম পরিবর্তন না করে কেবল জাভা ক্লাসের ফাইলগুলি এক স্থান থেকে অন্য স্থানে অনুলিপি করছেন তবে @ ਗਿਆਨপি'র দেওয়া সমাধানটি যা প্রয়োজন তা। অন্যথায়, আপনি শুধু করতে পারে this.getClass().getName(), যদিও আপনি এর স্ট্যাটিক সুযোগ অপসারণ করতে হবেTAG
asgs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.