অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির রিলিজ সংস্করণ তৈরি করার আগে কীভাবে সমস্ত ডিবাগ লগিং কলগুলি সরিয়ে ফেলা যায়?


397

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

আপনি মুক্তির জন্য আপনার অ্যাপ্লিকেশনটি তৈরি করার আগে আপনি লগিং নিষ্ক্রিয় করেছেন এবং ডিবাগিং বিকল্পটি অক্ষম করেছেন তা নিশ্চিত করুন। আপনি আপনার উত্স ফাইলগুলিতে লগ পদ্ধতিতে কলগুলি সরিয়ে লগিং নিষ্ক্রিয় করতে পারেন।

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

if(condition)
  Log.d(LOG_TAG, "Something");
data.load();
data.show();

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

তো, এমন কি আরও ভাল উত্স কোড-স্তরের উপায় আছে? অথবা দক্ষতার সাথে তবে নিরাপদে সমস্ত লগ লাইন মুছে ফেলার জন্য কিছু চালাক প্রোগুয়ার্ড সিনট্যাক্স?


2
+1 কারণ আমি মনে করি না এটি প্রকাশনা চেকলিস্টে ছিল।
আরডিএস

51
একটি অবরুদ্ধ লাইনটি মন্তব্য করতে, আমি "//" এর পরিবর্তে "; //" ব্যবহার করি।
21

আপনার যদি এটি পূর্বাবস্থায় ফেরাতে সক্ষম হতে হয় তবে আপনি সম্ভবত sed 's_^\(\s*Log\.\)_;//'`date|tr -s \ -`'\1_g'পরিবর্তে এটি ব্যবহার করতে চাইবেন ।
21

2
দিমিতর যুক্ত লিঙ্কটি আর কাজ করে না। এর পরিবর্তে আমি এটি পেয়েছি Source.android.com/source/code-style.html#log-sparely
জোসেফএল

1
@ এমবয়: সম্ভবত আজকাল মূলত পারফরম্যান্সের জন্য, তবে পুরানো অ্যান্ড্রয়েড সংস্করণগুলিতে এর সুরক্ষা সুবিধাও রয়েছে।
নিকোলাস রাউল

উত্তর:


488

আমি খুব সহজ সমাধানটি খুঁজে পেয়েছি যে সমস্ত ifজায়গা জুড়ে সমস্ত চেক ভুলে যাওয়া এবং যখন আমরা আমাদের পিঁপড়াকে লক্ষ্য করি তখন যেকোন বা পদ্ধতি কল সরাতে প্রোগার্ড ব্যবহার করি ardLog.d()Log.v()release

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

উদাহরণস্বরূপ, এখানে অ্যান্ড্রয়েডের জন্য খুব বেসিক প্রোগার্ড কনফিগারেশন রয়েছে:

-dontskipnonpubliclibraryclasses
-dontobfuscate
-forceprocessing
-optimizationpasses 5

-keep class * extends android.app.Activity
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

সুতরাং আপনি এটিকে কোনও ফাইলে সংরক্ষণ করতে পারেন, তারপরে পিঁপড় থেকে প্রোগার্ড কল করুন, আপনার সদ্য সংকলিত জেআর এবং অ্যান্ড্রয়েড প্ল্যাটফর্ম জেআর যাচ্ছেন আপনি যাচ্ছেন।

প্রোগার্ড ম্যানুয়ালটিতে উদাহরণগুলিও দেখুন ।


আপডেট (4.5 বছর পরে): আজকাল আমি অ্যান্ড্রয়েড লগিংয়ের জন্য টিম্বার ব্যবহার করেছি ।

এটি কেবলমাত্র ডিফল্ট Logপ্রয়োগের চেয়ে কিছুটা সুন্দর নয় - লগ ট্যাগটি স্বয়ংক্রিয়ভাবে সেট হয় এবং ফর্ম্যাটযুক্ত স্ট্রিং এবং ব্যতিক্রমগুলি লগ করা সহজ - তবে রানটাইমটিতে আপনি বিভিন্ন লগিং আচরণগুলিও নির্দিষ্ট করতে পারেন।

এই উদাহরণে, লগিংয়ের বিবৃতিগুলি কেবলমাত্র আমার অ্যাপ্লিকেশানের ডিবাগ বিল্ডগুলিতে লগক্যাটকে লেখা হবে:

কাঠ আমার Application onCreate()পদ্ধতিতে সেট আপ করা হয়েছে :

if (BuildConfig.DEBUG) {
  Timber.plant(new Timber.DebugTree());
}

তারপরে আমার কোডের অন্য যে কোনও জায়গায় আমি সহজেই লগ করতে পারি:

Timber.d("Downloading URL: %s", url);
try {
  // ...
} catch (IOException ioe) {
  Timber.e(ioe, "Bad things happened!");
}

দেখুন কাষ্ঠ নমুনা অ্যাপ্লিকেশন একটি আরো উন্নত উদাহরণ, যেখানে সব লগ বিবৃতি উন্নয়ন সময় Logcat পাঠানো হয় এবং উৎপাদন, কোন ডিবাগ বিবৃতি লগ ইন রয়েছেন, কিন্তু ত্রুটি চুপটি Crashlytics বলে জানা যায়।


59
এবং কেন এটি ডিফল্ট অগ্রগতি ফাইলের মধ্যে নেই?
আরডিএস

10
+ আরডিএস যেহেতু এটি আপনার কোডের চেয়ে লাইনগুলি সরানো হওয়ায় উত্পাদন স্ট্যাকট্রেসগুলি লাইন নম্বরগুলি পৃথক করবে।
লোক

5
আমি নিশ্চিত করতে পারি যে লগ কলগুলি সরিয়ে নেওয়া স্ট্যাকট্রেসগুলিতে লাইন নম্বরগুলি স্থানান্তরিত করে। এটি সর্বদা সিঙ্কের বাইরে থাকবে না (আমি বেশ কয়েকটি দ্রুত পরীক্ষা করেছিলাম তবে কারণটি কী তা সঠিকভাবে নির্ধারণ করতে পারছি না, সম্ভবত আপনি লগ কলটিতে একটি স্ট্রিং জড়িত থাকলে) তবে কখনও কখনও এটি কয়েকটি লাইন বন্ধ হয়ে যায়। লগ কলগুলি সহজেই সরাতে সক্ষমতার জন্য সমস্যা আইএমওর জন্য মূল্যবান।
টনি চ্যান

5
এডিটি সরঞ্জামগুলিতে @ ফ্রেগল প্রগুয়ার্ড-অ্যান্ড্রয়েড.টেক্সট থেকে: "নোট করুন আপনি যদি অপ্টিমাইজেশন সক্ষম করতে চান তবে আপনার নিজের প্রকল্প কনফিগারেশন ফাইলে অপ্টিমাইজেশন পতাকাগুলি কেবলমাত্র অন্তর্ভুক্ত করতে পারবেন না; পরিবর্তে আপনাকে" প্রগ্রেড-অ্যান্ড্রয়েড-অনুকূলিতকরণ "নির্দেশ করতে হবে। txt "আপনার" # প্রকল্পের থেকে পরিবর্তে এই ফাইলটি।
রায়ানান

3
যেমন এসপঞ্চি নীচে উত্তর বলেছেন। "এই পদ্ধতির সাথে একমাত্র সমস্যাটি হ'ল যদি আপনি লগ.ডি (" ট্যাগ "," প্রসেসড: "+ নতুন আইটেমকাউন্ট (ব্লেবলা) +" আইটেম ") করেন তবে এই লগ বার্তাটি আপনার প্রকাশিত সংস্করণে উপস্থিত না হলেও, একটি স্ট্রিংবিল্ডার বার্তাটি তৈরি করতে ব্যবহৃত হয় যা তৈরি করা ব্যয়বহুল হতে পারে "" টিম্বার ক্ষেত্রেও কি এটি সত্য?
চিত্রাং

117

সমস্ত ভাল উত্তর, কিন্তু যখন আমি আমার বিকাশ শেষ করেছি তখন আমি লগের সমস্ত কলের কাছাকাছি বিবৃতিগুলি ব্যবহার করতে চাই না, না আমি বাহ্যিক সরঞ্জামগুলি ব্যবহার করতে চাইতাম না।

সুতরাং I`m সমাধানটি হ'ল android.util.Log ক্লাসটি আমার নিজের লগ ক্লাসের সাথে প্রতিস্থাপন করা:

public class Log {
    static final boolean LOG = BuildConfig.DEBUG;

    public static void i(String tag, String string) {
        if (LOG) android.util.Log.i(tag, string);
    }
    public static void e(String tag, String string) {
        if (LOG) android.util.Log.e(tag, string);
    }
    public static void d(String tag, String string) {
        if (LOG) android.util.Log.d(tag, string);
    }
    public static void v(String tag, String string) {
        if (LOG) android.util.Log.v(tag, string);
    }
    public static void w(String tag, String string) {
        if (LOG) android.util.Log.w(tag, string);
    }
}

সমস্ত সোর্স ফাইলগুলিতে আমার কেবল একটাই কাজটি ছিল আমার নিজের ক্লাসের সাথে android.util.Log এর আমদানি প্রতিস্থাপন করা।


143
এই পদ্ধতির সাথে একমাত্র সমস্যাটি হ'ল যদি আপনি লগ.ডি ("ট্যাগ", "প্রক্রিয়াজাত:" + নতুন আইটেমকাউন্ট (ব্লাবলা) + "আইটেম") করেন তবে এই লগ বার্তাটি আপনার প্রকাশিত সংস্করণে উপস্থিত না হলেও, একটি স্ট্রিংবিল্ডার বার্তাটি তৈরি করতে ব্যবহৃত হয়, যা তৈরি করা ব্যয়বহুল হতে পারে।
espinchi

9
এই সমাধান একটি বড় সমস্যা আছে। এসপঞ্চি আইসবার্গের কেবলমাত্র ডগা উল্লেখ করেছেন। সমস্যাটি হ'ল যখন আপনি কল করেন Log.d("tag", someValue.toString());যে কিছুটা নালাগুলি না থাকার জন্য কিছুটা পরীক্ষা করা ভুলে যাওয়া খুব সহজ what যার অর্থ এটি হ'ল NullPointerExceptionউত্পাদনে ফেলতে পারে । এটি একটি নিরাপদ সমাধানের পরামর্শ দেয় তবে এটি আপনাকে ঠকায়। আমরা আমাদের private static boolean DEBUGএবং তারপরেif(DEBUG)Log.d(TAG, msg);
ফিলিপ

2
@espinchi আপনার উদ্বেগ এই উত্তর আলোচনা মত সব লগিং লাইব্রেরি ক্ষেত্রে প্রযোজ্য বলে মনে হয় stackoverflow.com/a/15452492/433718 (Slf4j, ব্যাকলগ, ...)। এটি ব্যবহার করার পরামর্শ দেওয়া হয় না?
ওয়ানওয়ার্ড

1
@ স্পিনচির প্রথম স্তরের মন্তব্যে উল্লিখিত ওভারহেডগুলি হ্রাস করার একমাত্র উপায় হ'ল পরিবর্তনের পরিবর্তে ভারার্গগুলি গ্রহণ করার জন্য লগিং পদ্ধতি পরিবর্তন করা String। সম্পূর্ণ সমাধান এখানে ড্রিবিড হয় । স্পষ্টতই এটির একটি অপূর্ণতা রয়েছে: প্রতিটি কল সম্পাদিত হওয়া উচিত (কেবলমাত্র একটি আমদানি লাইন নয়)।
স্ট্যান

21
কেবলমাত্র একটি এফওয়াইআই, যদি আপনি অ্যান্ড্রয়েড স্টুডিও এবং গ্রেড বিল্ড সিস্টেম ব্যবহার করেন তবে আপনি static final boolean LOG = BuildConfig.DEBUGএই ফাইলটি কখনও ব্যবহার করতে পারেন এবং পরিবর্তন করতে হবে না।
আশীষদহ

61

আমি কোথাও স্থির বুলিয়ান থাকার পরামর্শ দিচ্ছি যাতে লগ করা যায় কিনা তা নির্দেশ করে:

ক্লাস MyDebug {
  স্থির চূড়ান্ত বুলিয়ান LOG = সত্য;
}

তারপরে আপনি যেখানেই আপনার কোডটিতে লগইন করতে চান, কেবল এটি করুন:

যদি (MyDebug.LOG)
  if (শর্ত) লগ.আই (...);
}

এখন আপনি যখন MyDebug.LOG টি মিথ্যা হিসাবে সেট করেছেন, সংকলকটি এই ধরনের চেকগুলির অভ্যন্তরে সমস্ত কোড সরিয়ে ফেলবে (যেহেতু এটি একটি স্ট্যাটিক চূড়ান্ত, তাই এটি কোডটি ব্যবহৃত হয়নি এমন সংকলনের সময় জানে))

বৃহত্তর প্রকল্পগুলির জন্য, আপনি প্রয়োজন হিসাবে সহজেই সেখানে লগিং সক্ষম করতে বা অক্ষম করতে সক্ষম হতে আলাদা আলাদা ফাইলগুলিতে বুলিয়ান থাকতে শুরু করতে পারেন। উদাহরণস্বরূপ, উইন্ডো ম্যানেজারে আমাদের বিভিন্ন লগিং কনস্ট্যান্ট রয়েছে:

static final String TAG = "WindowManager";
static final boolean DEBUG = false;
static final boolean DEBUG_FOCUS = false;
static final boolean DEBUG_ANIM = false;
static final boolean DEBUG_LAYOUT = false;
static final boolean DEBUG_RESIZE = false;
static final boolean DEBUG_LAYERS = false;
static final boolean DEBUG_INPUT = false;
static final boolean DEBUG_INPUT_METHOD = false;
static final boolean DEBUG_VISIBILITY = false;
static final boolean DEBUG_WINDOW_MOVEMENT = false;
static final boolean DEBUG_ORIENTATION = false;
static final boolean DEBUG_APP_TRANSITIONS = false;
static final boolean DEBUG_STARTING_WINDOW = false;
static final boolean DEBUG_REORDER = false;
static final boolean DEBUG_WALLPAPER = false;
static final boolean SHOW_TRANSACTIONS = false;
static final boolean HIDE_STACK_CRAWLS = true;
static final boolean MEASURE_LATENCY = false;

সম্পর্কিত কোড সহ:

    if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v(
        TAG, "Adding window " + window + " at "
        + (i+1) + " of " + mWindows.size() + " (after " + pos + ")");

1
আমি এই জাতীয় পদ্ধতির পক্ষেও ভোট দেব। এটি সরকারী গুগলের অ্যাপ-অ্যাপ্লিকেশন বিলিং নমুনায়ও ব্যবহৃত হয়েছিল।
এলএ_

4
শর্তটি প্রথম প্যারামিটার হিসাবে পাস করা কি কম ভার্বোস হবে না?
Snicolas

1
এটি সর্বোত্তম সমাধান হিসাবে দেখা যাচ্ছে যদিও এর জন্য প্রতিটি লগ স্টেটমেন্টে অতিরিক্ত কোডের প্রয়োজন: লাইন নম্বরগুলি সংরক্ষিত রয়েছে (প্রোগার্ড পদ্ধতির দুর্বলতা), লগ বার্তা তৈরির জন্য কোনও কোড কার্যকর করা হয় না ( মোড়ক শ্রেণির পদ্ধতির দুর্বলতা এবং দৃশ্যত লগিংয়ের লাইব্রেরি পদ্ধতিরও দুর্বলতা ) । @ এলএ_ অনুসারে অ্যাপ্লিকেশন বিলিং নমুনায় গুগলে এই পদ্ধতির ব্যবহার আমার চিন্তাকেও সমর্থন করে।
ওয়ানওয়ার্ল্ড

2
@ স্নিকোলাস আপনি কোনও মোড়ক কার্যকর না করে কীভাবে শর্তটিকে প্রথম প্যারামিটার হিসাবে পাস করতে পারেন? তবুও যদি আপনি এটিকে প্যারামিটার হিসাবে যুক্ত করেন, তবে পদ্ধতিতে প্রবেশের আগে সমস্ত পরামিতিগুলির মূল্যায়ন করা দরকার যা মেসেজের স্ট্রিংও। পরামিতিগুলি তৈরি করার আগে শর্তটি পরীক্ষা করা দরকার। প্রস্তাবিত সমাধানটি সম্ভবত কোনও বাহ্যিক সরঞ্জাম না দিয়ে সেরা।
-13

2
বাইনারি কোড অনুযায়ী, এটি সেরা is কিন্তু এই জাতীয় কোডিং একটি সাধারণ ডিবাগ লগ আউটপুট জন্য মাত্র অনেক প্রচেষ্টা। কোড পাঠযোগ্যতা উল্লেখযোগ্যভাবে হ্রাস। কিছু জিতুন, কিছু হারাবেন, আমার ধারণা ...
রিচার্ড লে ম্যাসুরিয়ার

30

ক্রিস্টোফারের প্রোগুয়ার্ড সলিউশনটি সেরা, তবে কোনও কারণে যদি আপনি প্রগার্ড পছন্দ করেন না, তবে এখানে একটি খুব নিম্ন প্রযুক্তির সমাধান রয়েছে:

মন্তব্য লগ:

find . -name "*\.java" | xargs grep -l 'Log\.' | xargs sed -i 's/Log\./;\/\/ Log\./g'

কমেন্টস লগগুলি:

find . -name "*\.java" | xargs grep -l 'Log\.' | xargs sed -i 's/;\/\/ Log\./Log\./g'

সীমাবদ্ধতা হ'ল আপনার লগিং নির্দেশাবলী একাধিক লাইনে ছড়িয়ে থাকা উচিত নয়।

(আপনার প্রকল্পের মূলে ইউনিক্স শেলের মধ্যে এই লাইনগুলি কার্যকর করুন Windows উইন্ডোজ ব্যবহার করা হলে, ইউনিক্স স্তরটি পান বা সমতুল্য উইন্ডোজ কমান্ড ব্যবহার করুন)


1
শেডে -i এর পরে "" দরকার ম্যাকের উপর চলতে থাকলে ( এটি অনুসারে ) ধন্যবাদ।
বিশাল

আমি অনুভব করি যে এটি আমিই কাজ করছি তার জন্য ব্যবহার করে আমি শেষ করতে পারি কারণ প্রোগ্রার্ডের সাথে এটি করা মোটেই ভাগ্য আমার ছিল না
জো প্লান্ট

আপনি যদি আপনার প্রথম পোস্টে পরামর্শ দিয়ে থাকেন, তবে শাখার সময় নন-ব্রেকেট করার পরে যদি আপনার লগ থাকে?
-13

@ type-a1pha: আপনি যদি এই সমাধানটি গ্রহণ করেন তবে আপনাকে বন্ধনী ব্লকগুলি বাধ্যতামূলক হিসাবে বিবেচনা করতে হবে।
নিকোলাস রাউল


18

চূড়ান্ত বাইনারি থেকে লগ লাইনগুলি সরাতে আমার প্রচুর সমস্যা হওয়ায় আমি অ্যান্ড্রয়েড স্টুডিও এবং গ্রেডেলের সাথে প্রগার্ড ব্যবহার সম্পর্কে কিছু সূক্ষ্মতা যুক্ত করতে চাই।

assumenosideeffectsপ্রোগার্ড কাজ করার জন্য , পূর্বশর্ত রয়েছে।

আপনার গ্রেড ফাইলটিতে আপনাকে proguard-android-optimize.txtডিফল্ট ফাইল হিসাবে ব্যবহার নির্দিষ্ট করতে হবে।

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

        // With the file below, it does not work!
        //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

আসলে, ডিফল্ট proguard-android.txtফাইলে, দুটি পতাকা দিয়ে অপ্টিমাইজেশন অক্ষম করা হয়:

-dontoptimize
-dontpreverify

proguard-android-optimize.txtফাইল যারা লাইন যোগ করে না, তাই এখন assumenosideeffectsকাজ করতে পারেন।

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

আমার যদি চূড়ান্ত গ্রন্থাগার থেকে লগগুলি সত্যিই সরানোর দরকার হয় তবে আমি আমার প্রোগার্ড ফাইলটিতে যুক্ত করব ( proguard-android-optimize.txtঅবশ্যই ফাইলটি সক্ষম করার পরে ):

-assumenosideeffects class * implements org.slf4j.Logger {
    public *** trace(...);
    public *** debug(...);
    public *** info(...);
    public *** warn(...);
    public *** error(...);
}

এই নতুন জ্যাক সাথে কাজ করে না compiler-- stackoverflow.com/questions/37932114/...
fattire

এটি আমাকে সাহায্য করেছিল; উভয়ই proguard-android-optimize.txtডিফল্ট প্রোগার্ড ফাইল এবং -assumenosideeffectsকাস্টম প্রোগার্ড ফাইল হিসাবে প্রয়োজন ছিল! আমি আর 8 শিংকার (আজকাল ডিফল্ট) এবং ডিফল্ট অ্যান্ড্রয়েড লগিং ব্যবহার করছি।
জোনিক

10

আমি জ্যাক ওয়ার্টনের কাছ থেকে টিম্বার ব্যবহারের পরামর্শ দিচ্ছি

https://github.com/JakeWharton/timber

এটি আপনার সমস্যাটি সক্রিয় / অক্ষম করার সাথে সাথে ট্যাগ ক্লাস স্বয়ংক্রিয়ভাবে যুক্ত করে সমাধান করে

মাত্র

public class MyApp extends Application {

  public void onCreate() {
    super.onCreate();
    //Timber
    if (BuildConfig.DEBUG) {
      Timber.plant(new DebugTree());
    }
    ...

লগগুলি কেবল আপনার ডিবাগ ভারে ব্যবহৃত হবে, এবং তারপরে ব্যবহার হবে

Timber.d("lol");

অথবা

Timber.i("lol says %s","lol");

মুদ্রণ এর জন্য

ট্যাগটিকে নির্দিষ্ট করে না দিয়ে "আপনার শ্রেণি / চিত্র"


2
কাঠ খুব সুন্দর, তবে আপনার যদি ইতিমধ্যে একটি বিদ্যমান প্রকল্প থাকে - আপনি github.com/zserge/log চেষ্টা করতে পারেন । এটি অ্যান্ড্রয়েড.ইটিল.লগের জন্য একটি ড্রপ-ইন প্রতিস্থাপন এবং টিমবারের আরও বেশিরভাগ বৈশিষ্ট্য রয়েছে এবং এর থেকেও অনেক বেশি।
জেজেগার

zserge, আপনার লগ সমাধান ভাল দেখাচ্ছে। বৈশিষ্ট্য প্রচুর। আপনি কি টিম্বারের মতো লিন্টের বিধিগুলি যুক্ত করার বিষয়টি বিবেচনা করেছেন?
jk7

8

আমি গুগল আইও উদাহরণ অ্যাপ্লিকেশনটির মতো লগআপিলস ক্লাস ব্যবহার করেছি । বিল্ডকনফিগ.ডি.বি.বির পরিবর্তে অ্যাপ্লিকেশন নির্দিষ্ট DEBUG ধ্রুবকটি ব্যবহার করার জন্য আমি এটি সংশোধন করেছি কারণ বিল্ডকনফিগ.ডি.ইউবিজি বিশ্বাসযোগ্য নয় । তারপরে আমার ক্লাসে আমার নিম্নোক্তটি রয়েছে।

import static my.app.util.LogUtils.makeLogTag;
import static my.app.util.LogUtils.LOGV;

public class MyActivity extends FragmentActivity {
  private static final String TAG = makeLogTag(MyActivity.class);

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LOGV(TAG, "my message");
  }
}

Build.DEBUGআমি যেটি ব্যবহার করতাম তাতে বাগ রিপোর্টের জন্য +1 । আমি বিভিন্ন "সঠিক" কাজের ত্যাগও ছেড়ে দিয়েছি এবং আপনার সাথে একই ধরণের স্টাইল সমাধান ব্যবহার করি।
রিচার্ড লে ম্যাসুরিয়ার

7

আমি বিল্ট-ইন android.util.Log এর পরিবর্তে রোবোগুইসের লগিং সুবিধাটি ব্যবহার করার বিষয়টি বিবেচনা করব

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

Proguard ব্যবহার বেশ ঝগড়া হতে পারে এবং আমি কনফিগার এবং এটি তৈরীর কষ্ট দিয়ে যেতে না কাজ আপনার প্রয়োগের সাথে যদি না আপনি যে জন্য একটি ভাল কারণ আছে (নিষ্ক্রিয় লগ ভালো নয়)


আপনি যখন অবলম্বন ব্যবহার করতে পারবেন না তখন খুব সুন্দর পদ্ধতির .... বিশেষত রোবোগুইস ব্রেকিং কারণে এলএলএল করার কারণে
স্নিকোলাস

1
রোবুজুইসের লগিং সুবিধার জন্য আপডেট হওয়া লিঙ্ক: github.com/roboguice/roboguice/wiki/Logging-via-Ln
রেনিপেট

7

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

লাইব্রেরির সর্বশেষতম সংস্করণটি আপনার বিল্ড.gradle এ রাখুন:

compile 'com.jakewharton.timber:timber:4.1.1'

তারপরে অ্যান্ড্রয়েড স্টুডিওগুলিতে, সম্পাদনা -> সন্ধান করুন -> পথে প্রতিস্থাপনে যান ...

টাইপ করুন Log.e(TAG,বা তবে আপনি "Text to find"পাঠ্যবক্সে আপনার লগ বার্তা সংজ্ঞায়িত করেছেন । তারপরে আপনি কেবল এটির সাথে প্রতিস্থাপন করুনTimber.e(

এখানে চিত্র বর্ণনা লিখুন

অনুসন্ধান ক্লিক করুন এবং তারপরে সমস্ত প্রতিস্থাপন করুন।

অ্যান্ড্রয়েড স্টুডিওগুলি এখন আপনার প্রকল্পের সমস্ত ফাইল জুড়ে যাবে এবং সমস্ত লগকে টিম্বার্সের সাথে প্রতিস্থাপন করবে।

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

onCreateআপনার Applicationক্লাসের পদ্ধতিতে আপনার এই কোডের টুকরোটি রাখা দরকার :

    if (BuildConfig.DEBUG) {
        Timber.plant(new Timber.DebugTree());
    }

এটি তখনই অ্যাপ্লিকেশন লগিংয়ের ফলস্বরূপ যখন আপনি উত্পাদনে না বিকাশ মোডে থাকবেন। আপনি BuildConfig.RELEASEরিলিজ মোডে লগ ইন করতে পারেন ।


3
আপনার আমদানিগুলির জন্য একই জিনিসটি করার চেষ্টা করুন এবং নিয়মিত এক্সপ্রেশন বাক্সটি চেক করা আছে কিনা তা নিশ্চিত করুন: import android\.util\.Log\;এটির জন্য প্রতিস্থাপন করুন:import android\.util\.Log\;\nimport timber\.log\.Timber\;
ক্লার্ক উইলসন

বা আপনি কাঠামোগত অনুসন্ধান ব্যবহার করতে পারেন এবং তার পোস্টে
মাকসিম

@ ম্যাক্সিমটুরায়েভ আপনার লিঙ্কটি আর প্রাসঙ্গিক নয়। এখন এটি চুলের স্টাইলগুলি সম্পর্কে একটি ব্লগ।
ভাদিম কোতোভ

দেখে মনে হচ্ছে পোস্টটি সরানো হয়েছে = (এটি কোথাও খুঁজে
পাচ্ছে না

@ ম্যাক্সিমটুরায়েভ এখানে ওয়াইব্যাক মেশিনের একটি অনুলিপি রয়েছে, তবে চিত্রগুলি নষ্ট হয়েছে
ভাদিম কোতোভ

6

প্রতি android.util.Log লগ সক্ষম / অক্ষম করার একটি উপায় সরবরাহ করে:

public static native boolean isLoggable(String tag, int level);

ডিফল্ট পদ্ধতিটি হ'ল লগেবল (...) মিথ্যা ফিরিয়ে দেয়, কেবলমাত্র আপনি ডিভাইসে সেটপ্রপ পছন্দ করলেই:

adb shell setprop log.tag.MyAppTag DEBUG

এর অর্থ DEBUG স্তরের উপরে যে কোনও লগ মুদ্রণযোগ্য হতে পারে। রেফারেন্স অ্যান্ড্রয়েড ডক:

নির্দিষ্ট ট্যাগের জন্য লগটি নির্দিষ্ট স্তরে লগযোগ্য কিনা তা পরীক্ষা করে দেখুন। যে কোনও ট্যাগের ডিফল্ট স্তর INFO এ সেট করা আছে। এর মানে হল যে উপরে এবং আইএনএফও সহ যে কোনও স্তরের লগইন হবে। লগিং পদ্ধতিতে কোনও কল করার আগে আপনার ট্যাগটি লগ করা উচিত কিনা তা পরীক্ষা করে দেখতে হবে। আপনি সিস্টেম বৈশিষ্ট্য সেট করে ডিফল্ট স্তর পরিবর্তন করতে পারেন: 'সেটপ্রপ লগ.ট্যাগ। 'যেখানে স্তরটি হয় ভার্বোস, ডিবগ, ইনফো, সতর্কতা, ত্রুটি, অ্যাসার্ট বা সুপারপ্রেস। সুপারপ্রেস আপনার ট্যাগের জন্য সমস্ত লগিং বন্ধ করে দেবে। আপনি একটি স্থানীয়.প্রপ ফাইল তৈরি করতে পারেন যা এতে নিম্নলিখিতগুলির সাথে রয়েছে: 'লগ.ট্যাগ। =' এবং এটি /data/local.prop এ স্থাপন করতে পারেন।

সুতরাং আমরা কাস্টম লগ ব্যবহার করতে পারি:

public final class Dlog 
{
    public static void v(String tag, String msg)
    {
        if (Log.isLoggable(tag, Log.VERBOSE))
            Log.v(tag, msg);
    }

    public static void d(String tag, String msg)
    {
        if (Log.isLoggable(tag, Log.DEBUG))
            Log.d(tag, msg);
    }

    public static void i(String tag, String msg)
    {
        if (Log.isLoggable(tag, Log.INFO))
            Log.i(tag, msg);
    }

    public static void w(String tag, String msg)
    {
        if (Log.isLoggable(tag, Log.WARN))
            Log.w(tag, msg);
    }

    public static void e(String tag, String msg)
    {
        if (Log.isLoggable(tag, Log.ERROR))
            Log.e(tag, msg);
    }
}

6

আপনি যদি কোনও বিশ্বব্যাপী প্রতিস্থাপন (একবার) চালাতে পারেন এবং তার পরে কিছু কোডিং কনভেনশন সংরক্ষণ করা যায় তবে আপনি প্রায়শই অ্যান্ড্রয়েড কাঠামোর ক্ষেত্রে ব্যবহৃত প্যাটার্নটি অনুসরণ করতে পারেন ।

লেখার বদলে

Log.d(TAG, string1 + string2 + arg3.toString());

এটা যেমন আছে

if (BuildConfig.DEBUG) Log.d(TAG, string1 + String.format("%.2f", arg2) + arg3.toString());

এখন অগ্রগতি স্ট্রিংবিল্ডার এবং এটি ব্যবহারের সমস্ত স্ট্রিং এবং পদ্ধতিগুলি অপটিমাইজড রিলিজ ডেক্স থেকে মুছে ফেলতে পারে। ব্যবহার করুন proguard-android-optimize.txtএবং আপনার android.util.Log সম্পর্কে চিন্তা করার দরকার নেই আপনার proguard-rules.pro:

android {
  
  buildTypes {
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}

অ্যান্ড্রয়েড স্টুডিও গ্রেড প্লাগইন সহ, বেশ নির্ভরযোগ্য, সুতরাং আপনার স্ট্রিপিং নিয়ন্ত্রণের জন্য অতিরিক্ত ধ্রুবকের প্রয়োজন হবে না।BuildConfig.DEBUG


4

এখানে চিত্র বর্ণনা লিখুন

আমি আমার অ্যান্ড্রয়েড প্রকল্পগুলিতে এটি করতাম ..

অ্যান্ড্রয়েড স্টুডিওতে আমরা একই প্রকল্পটি সম্পূর্ণ প্রকল্পের (ম্যাকোগুলিতে কমান্ড + শিফট + এফ) এবং Ctrl + Shift + R প্রতিস্থাপন (ম্যাকোগুলিতে কমান্ড + শিফ্ট + আর) দ্বারা সন্ধান করতে অনুরূপ অপারেশন করতে পারি (


এটি গ্রহন প্রকল্পগুলির কাজ খোলার জন্য মনে হচ্ছে। এমনকি অনুসন্ধান বিকল্পটি অ্যান্ড্রয়েড স্টুডিওগুলিতে পাওয়া যায় না।
সাইমন

2
অ্যান্ড্রয়েড স্টুডিওতে আপনি সিটিআরএল + শিফট + এফ শর্টকাটের সাথে অনুরূপ অনুসন্ধান করতে পারেন
লিন্স লুই লন্ডন

প্রশ্নটির উদাহরণ কোড ব্যাখ্যা করে যে এটি কেন নির্ভরযোগ্য নয়।
নিকোলাস রাউল

এটি লগতে থাকা কোনও কমান্ড অপসারণ করতে সমস্যা সৃষ্টি করতে পারে। উদাহরণস্বরূপ চকোলেটলগ.রেসিপি ();
অ্যান্ড্রু এস

অ্যান্ড্রয়েড স্টুডিও 2.1 এর জন্য এই বিকল্পটি খুঁজে পেতে অক্ষম। এছাড়াও, আমি এই কৌশলটি 1 বার 1 টি সাধারণ অনুসন্ধান / প্রতিস্থাপনের মাধ্যমে ব্যবহার করতে পারি।
ভিভিবি

3

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

আমি আমার উত্স গাছের গোড়াতে যাচ্ছি, ডান ক্লিক করুন এবং "প্রতিস্থাপন" করতে নির্বাচন করুন। আমি তখন সমস্ত "লগ" প্রতিস্থাপন করতে পছন্দ করি। "// লগ।" সহ এটি সমস্ত লগের বিবৃতি সরিয়ে দেয়। তাদের পিছনে পিছনে রাখার জন্য আমি একই প্রতিস্থাপনটির পুনরাবৃত্তি করছি তবে এবার সমস্ত "// লগ" প্রতিস্থাপন করুন। "লগ।" সহ

আমার জন্য কেবল দুর্দান্ত কাজ করে। "ডায়ালগ" এর মতো দুর্ঘটনা এড়াতে কেবল সংবেদনশীল হিসাবে প্রতিস্থাপনটি সেট করতে মনে রাখবেন। অতিরিক্ত আশ্বাসের জন্য আপনি "লগ" এর সাথে প্রথম পদক্ষেপটিও করতে পারেন। স্ট্রিং হিসাবে অনুসন্ধান।

উজ্জ্বল।


2
অনুগ্রহ করে পড়ুন "যদি আমি মন্তব্য লগিন লাইন ' আমার প্রশ্নে অনুচ্ছেদ।
নিকোলাস রাউল

ঠিক আছে, হ্যাঁ উত্তরগুলি ব্রাউজ করার পরে আমার আরও প্রায়ই পড়তে হবে :)। আপনার যদি এরকম কেস থাকে তবে আপনি সম্ভবত অন্য কোনও সমাধান চান যেমন এর আগে প্রস্তাবিত যেমন আপনার সমস্ত লগ অন্য ইন্টারফেসের পিছনে রেখে দেওয়া। আমার পরামর্শ সম্ভবত ছোট দল এবং প্রকল্প, যেখানে লোকেরা অতিরিক্ত লগিং লিব এর ওভারহেড এড়িয়ে যেতে চান জন্য ভাল, আপনি ভাল মানুষ এবং কোড জানেন, ইত্যাদি কাজ করে
kg_sYy

1
লগ.ডি এর পরিবর্তে; // লগ.ডি সেই "যদি" দৃশ্যেরও যত্ন নেয়।
জ্যাস্পার

3

জেসের্গের মন্তব্যে যেমন পরামর্শ দেওয়া হয়েছে,

কাঠ খুব সুন্দর, তবে আপনার যদি ইতিমধ্যে একটি বিদ্যমান প্রকল্প থাকে - আপনি github.com/zserge/log চেষ্টা করতে পারেন। এটি অ্যান্ড্রয়েড.ইটিল.লগের জন্য একটি ড্রপ-ইন প্রতিস্থাপন এবং টিমবারের আরও বেশিরভাগ বৈশিষ্ট্য রয়েছে এবং এর থেকেও অনেক বেশি।

তার লগ লাইব্রেরি নীচে হিসাবে সহজ সক্ষম / অক্ষম লগ মুদ্রণ সুইচ সরবরাহ করে।

তদ্ব্যতীত, এটির জন্য কেবলimport লাইনগুলি পরিবর্তন করা দরকার , এবং বিবৃতি দেওয়ার জন্য কোনও কিছুই পরিবর্তন করার প্রয়োজন নেইLog.d(...);

if (!BuildConfig.DEBUG)
    Log.usePrinter(Log.ANDROID, false); // from now on Log.d etc do nothing and is likely to be optimized with JIT

আপনার কি প্রতিটি ক্রিয়াকলাপ / খণ্ডে, বা কেবলমাত্র এক জায়গায় কোডের সেই লাইনটি রাখতে হবে?
নোয়া তার্নুল্লো

@ নোআাহটার্নুল্লো // প্রাপ্ত অ্যাপ্লিকেশন ফাইলটিতে। ডিফল্ট অ্যাপ্লিকেশন.জভা
ইয়ংজায়ে

3

আপনার অগ্রগতি-বিধি.টিএসটি ফাইলটিতে নিম্নলিখিত যুক্ত করুন

-assumenosideeffects class android.util.Log {
  public static *** d(...);
  public static *** w(...);
  public static *** v(...);
  public static *** i(...);
}

1

উপরের সমাধানটিতে বিভিন্ন লগ স্তরের জন্য সমর্থন সরবরাহ করে এবং কোডটি কোনও লাইভ ডিভাইসে বা এমুলেটরটিতে চলছে কিনা তা নির্ভর করে স্বয়ংক্রিয়ভাবে লগের স্তরগুলি পরিবর্তন করে উন্নত করেছি improved

public class Log {

final static int WARN = 1;
final static int INFO = 2;
final static int DEBUG = 3;
final static int VERB = 4;

static int LOG_LEVEL;

static
{
    if ("google_sdk".equals(Build.PRODUCT) || "sdk".equals(Build.PRODUCT)) {
        LOG_LEVEL = VERB;
    } else {
        LOG_LEVEL = INFO;
    }

}


/**
 *Error
 */
public static void e(String tag, String string)
{
        android.util.Log.e(tag, string);
}

/**
 * Warn
 */
public static void w(String tag, String string)
{
        android.util.Log.w(tag, string);
}

/**
 * Info
 */
public static void i(String tag, String string)
{
    if(LOG_LEVEL >= INFO)
    {
        android.util.Log.i(tag, string);
    }
}

/**
 * Debug
 */
public static void d(String tag, String string)
{
    if(LOG_LEVEL >= DEBUG)
    {
        android.util.Log.d(tag, string);
    }
}

/**
 * Verbose
 */
public static void v(String tag, String string)
{
    if(LOG_LEVEL >= VERB)
    {
        android.util.Log.v(tag, string);
    }
}


}

1
আগের সমাধান হিসাবে একই সমস্যা। যদি স্ট্রিং প্যারামিটারটি ব্যয়বহুল কলগুলি ব্যবহার করে তৈরি করা হয় তবে এটি এখনও সম্পদের অপচয় করে। পরামিতিগুলি পাস করার আগে কল করার জন্য চেক করা দরকার done
-13

1

প্রোগুয়ার্ড এটি আপনার রিলিজ বিল্ডে করবে এবং এখন অ্যান্ড্রয়েড.কম থেকে সুসংবাদ:

http://developer.android.com/tools/help/proguard.html

প্রোগুয়ার্ড সরঞ্জামটি অব্যবহৃত কোড অপসারণ করে এবং শব্দার্থকভাবে অস্পষ্ট নামের সাথে ক্লাস, ক্ষেত্র এবং পদ্ধতিগুলির নাম পরিবর্তন করে আপনার কোড সঙ্কুচিত করে, অনুকূল করে এবং অপসারণ করে। ফলাফলটি একটি ছোট আকারের .apk ফাইল যা প্রকৌশলীকে বিপরীত করা আরও কঠিন। যেহেতু প্রোগুয়ার্ড আপনার অ্যাপ্লিকেশনটিকে প্রকট বিপরীত করা শক্ত করে তোলে, আপনার অ্যাপ্লিকেশন লাইসেন্স দেওয়ার সময় আপনার অ্যাপ্লিকেশনটি সুরক্ষার সাথে সংবেদনশীল এমন বৈশিষ্ট্যগুলি ব্যবহার করে আপনি যখন তা ব্যবহার করেন তখন আপনার পক্ষে গুরুত্বপূর্ণ।

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

এই নথিতে কীভাবে প্রোগুয়ার্ড সক্ষম ও কনফিগার করা যায় পাশাপাশি অচল স্ট্যাক ট্রেসগুলি ডিকোড করার জন্য retrace সরঞ্জাম ব্যবহার করা যায়


2
এটি ডিফল্ট হিসাবে ডিবাগ লগিং অপসারণ বলে মনে হয় না। সুতরাং ক্রিস্টোফারের উত্তর আরও ভাল শোনাচ্ছে।
নিকোলাস রাউল

0

আমি লগ.ডি (TAG, কিছু স্ট্রিং, প্রায়শই একটি স্ট্রিং. ফর্ম্যাট ()) ব্যবহার করতে চাই।

ট্যাগ সর্বদা শ্রেণীর নাম

রূপান্তর করুন লগ.ডি (TAG, -> লগড (আপনার শ্রেণীর পাঠ্যে)

private void Logd(String str){
    if (MainClass.debug) Log.d(className, str);
}

এইভাবে আপনি যখন একটি রিলিজ সংস্করণ তৈরি করতে প্রস্তুত হন, মেইনক্লাস.ডেবগকে মিথ্যাতে সেট করুন!


1
এগুলি এবং অন্যান্য সমাধানগুলির সাথে সামঞ্জস্যভাবে সমস্যাগুলি হ'ল এটি আপনি কোডটিতে রেখে যাচ্ছেন, সম্ভবত প্রচুর পরিমাণে স্ট্রিং তৈরি হয়। একটি গড় অ্যাপ্লিকেশন কোনও সমস্যা নয়, তবে আপনি যদি অনুকূলিত করার চেষ্টা করছেন তবে এটি একটি সমস্যা হয়ে দাঁড়ায়।
লাসি কিনুনেনেন

0

লিনাক্স এবং সেডে ব্যাশ ব্যবহার করে লগগুলি সরানো যায়:

find . -name "*\.java" | xargs sed -ri ':a; s%Log\.[ivdwe].*\);%;%; ta; /Log\.[ivdwe]/ !b; N; ba'

মাল্টলাইন লগ জন্য কাজ করে। এই সমাধানটিতে আপনি নিশ্চিত হতে পারেন যে লগগুলি উত্পাদন কোডে উপস্থিত নেই।


0

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে কেন আপনি আপনার সমস্ত লগ কলগুলি বুলিয়ান লগক্যালওয়াসহিয়ার = সত্যের সাথে প্রতিস্থাপন করেন নি; // --- আপনার লগ বাকি এখানে

আপনি কেন তাদের ফিরিয়ে দিতে চান তা কেন আপনি জানতে পারবেন এবং তারা যদি আপনার বিবৃতি কলকে প্রভাবিত করে না :)


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

আপনি ক্রিয়াকলাপের উপরে শীর্ষে ভেরিয়েবলটি ঘোষণা করতে পারেন এবং এই লাইনটি থেকে বুলিয়ান ঘোষণাটি সরিয়ে ফেলতে পারেন;)
মসূদ এলসাদ

0

কেন শুধু না

if(BuildConfig.DEBUG)
  Log.d("tag","msg");

? কোনও অতিরিক্ত লাইব্রেরি প্রয়োজন নেই, প্রগর্ড নিয়মের কোনও প্রবণতা নেই যা প্রজেক্ট এবং জাভা সংকলককে রিলিজ বিল্ড করার সময় এই কলটির জন্য বাইটকোড ছাড়বে না ode


অসুবিধাটি হ'ল এটি কেবল লেখার চেয়ে বেশি ভার্বোজ Log.d("tag","msg");এবং if(BuildConfig.DEBUG)অংশটি লেখা ভুলে যাওয়াও সহজ ।
নিকোলাস রাউল

1
এর সাথে আর একটি সমস্যা হ'ল প্যাকগুলি প্রকাশিত স্ট্রিংগুলিতে থাকে।
স্ট্র্যা

0

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


0

আমার পথ:

1) কলাম নির্বাচন মোড সক্ষম করুন (Alt + শিফট + সন্নিবেশ)

2) একটি লগ.ডে নির্বাচন করুন (TAG, "পাঠ্য"); অংশ 'লগ।'

3) তারপরে শিফটটি করুন + সিটিআরএল + ওয়েল + জ

4) বাম তীর ক্লিক করুন

5) শিফট + শেষ করুন

6) মুছে ফেলুন।

এটি জাভা ফাইলে একবারে সমস্ত এলওজি কল সরিয়ে দেয়।


0

আপনি এই সাধারণ প্রচলিত পদ্ধতিটি ব্যবহার করে দেখতে পারেন:

Ctrl+ Shift+R

প্রতিস্থাপন করা

Log.e(

সঙ্গে

// Log.e(

এটি প্রশ্নের উত্তর দেওয়া কোডের সাথে ভালভাবে কাজ করবে না।
নিকোলাস রাউল

0

কোটলিন সহ সহজ, কেবল কয়েকটি শীর্ষ স্তরের কার্যকারিতা ঘোষণা করুন

val isDebug: Boolean
    get() = BuildConfig.DEBUG

fun logE(tag: String, message: String) {
    if (isDebug) Log.e(tag, message)
}

fun logD(tag: String, message: String) {
    if (isDebug) Log.d(tag, message)
}

-1

সহজ উপায়;

ব্যবহার DebugLog

অ্যাপটি প্রকাশের সময় সমস্ত লগগুলি ডিবাগলগ দ্বারা অক্ষম করা হয়।

https://github.com/MustafaFerhan/DebugLog


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