আমি কীভাবে অ্যান্ড্রয়েডে লগ স্তরগুলি সক্ষম / অক্ষম করব?


149

উদাহরণস্বরূপ ডিবাগ করার জন্য আমার প্রচুর লগিং স্টেটমেন্ট রয়েছে।

Log.v(TAG, "Message here");
Log.w(TAG, " WARNING HERE");

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


উত্তর:


80

একটি সাধারণ উপায় হ'ল লগলেভেল নামের একটি ইনট তৈরি করা এবং লগলেভেলের উপর ভিত্তি করে এর ডিবাগ স্তরটি নির্ধারণ করা।

public static int LOGLEVEL = 2;
public static boolean ERROR = LOGLEVEL > 0;
public static boolean WARN = LOGLEVEL > 1;
...
public static boolean VERBOSE = LOGLEVEL > 4;

    if (VERBOSE) Log.v(TAG, "Message here"); // Won't be shown
    if (WARN) Log.w(TAG, "WARNING HERE");    // Still goes through

পরে, আপনি কেবলমাত্র সমস্ত ডিবাগ আউটপুট স্তরের জন্য LOGLEVEL পরিবর্তন করতে পারেন।


1
দুর্দান্ত, তবে আপনি কীভাবে আপনার উদাহরণস্বরূপ DEBUG অক্ষম করবেন তবে তবুও সতর্কবাণী প্রদর্শন করছেন ....
Andre Bossard

1
বিবৃতিগুলি .apk বাইট কোডে শেষ হয় না? আমি ভেবেছিলাম অ্যাপ্লিকেশন মোতায়েনের সময় আমরা (সাধারণত) লগিং বন্ধ করতে চাইতাম তবে বিবৃতিটি সরানো হবে না।
দাবাফনার্ড

2
আপনার উদাহরণে, DEBUG বার্তা প্রদর্শিত হবে, যখন সতর্কতাগুলি হবে না? আপনি সাধারণত বিপরীত করতে চান না?
স্যাম

15
কাস্টম ভেরিয়েবলের পরিবর্তে বিল্ডকনফিগ.ডেবিউজি ব্যবহার করুন
এইচবি 0

1
জাভাতে @ শেসফোনার্ড, "এর ভিতরে কোডটি সংকলিত কোডের অংশও হবে না It এটি সংকলন করতে হবে, তবে এটি সংকলিত বাইকোডে লেখা হবে না।" stackoverflow.com/questions/7122723/...
stoooops

197

অ্যান্ড্রয়েড ডকুমেন্টেশন লগিন মাত্রা সম্পর্কে নিম্নলিখিত বলেছেন :

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

সুতরাং আপনি লগ ভার্বোস লগিং স্টেটমেন্টগুলি কেটে ফেলা বিবেচনা করতে পারেন, সম্ভবত অন্য উত্তরে প্রস্তাবিত হিসাবে প্রোগুয়ার্ড ব্যবহার করুন

ডকুমেন্টেশন অনুসারে আপনি সিস্টেম প্রোপার্টি ব্যবহার করে ডেভলপমেন্ট ডিভাইসে লগিং কনফিগার করতে পারেন। সেটে সম্পত্তি log.tag.<YourTag>এবং উহা নিম্নবর্ণিত মান এক সেট করা উচিত: VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT, অথবা SUPPRESSএ সম্পর্কে আরও তথ্য isLoggable()পদ্ধতির জন্য ডকুমেন্টেশনে উপলব্ধ ।

setpropকমান্ডটি ব্যবহার করে আপনি অস্থায়ীভাবে বৈশিষ্ট্যগুলি সেট করতে পারেন । উদাহরণ স্বরূপ:

C:\android>adb shell setprop log.tag.MyAppTag WARN
C:\android>adb shell getprop log.tag.MyAppTag
WARN

বিকল্পভাবে, আপনি নিম্নলিখিত হিসাবে তাদের ফাইল '/data/local.prop' নির্দিষ্ট করতে পারেন:

log.tag.MyAppTag=WARN

পরবর্তী সংস্করণগুলিতে অ্যান্ড্রয়েডের /data/local.prop পড়ার দরকার পড়ে । এই ফাইলটি বুট সময়ে পড়া হয় তাই আপনাকে আপডেট করার পরে এটি পুনরায় চালু করতে হবে। যদি /data/local.propবিশ্ব লিখনযোগ্য হয় তবে এটি সম্ভবত উপেক্ষা করা হবে।

শেষ অবধি, আপনি System.setProperty()পদ্ধতিটি ব্যবহার করে সেগুলি সেট করতে পারেন ।


4
আমারও একই অভিজ্ঞতা হয়েছে; এটি ঠিক কীভাবে কাজ করা উচিত এবং এ সম্পর্কে বেশিরভাগ স্থিতিকে অবচয় বলে উল্লেখ করা হয়েছে বলে এপিআই ডকসগুলি বেশ অস্পষ্ট android.util.Config। এপিআই ডক্সে বর্ণিত হার্ডকোড মানগুলি অকেজো কারণ এগুলি (অনুমিত) বিল্ড অনুসারে পরিবর্তিত হয়। সুতরাং প্রোগুয়ার্ড রুটটি আমাদের জন্য সেরা সমাধান বলে মনে হয়েছিল।
ক্রিস্টোফার অর

3
/Data/local.prop ফাইল, সেটপ্রপ পদ্ধতি বা একটি System.setProperty ব্যবহার করে অ্যান্ড্রয়েড লগিং কনফিগার করতে আপনার ভাগ্য আছে? আমার জন্য সত্য ফিরে পেতে লগ.আইসলগেবল (ট্যাগ, ভার্বোস) পেতে আমার বেশ খানিকটা সমস্যা হচ্ছে।
সানোসিয়া

2
আমি অ্যান্ড্রয়েড ডিবাগিং কাজ পেয়েছি। কৌশলটি হ'ল আপনি যখন লগ.ডি ("xyz") এর মতো কোনও কল করেন তখন বার্তাটি লগকটে লেখা হয় এমনকি লগারের জন্য ডিবাগ অক্ষম থাকলেও। এর অর্থ ফিল্টারিং সাধারণত লেখার পরে ঘটে। Log.isLoggable (TAG, Log.VERBOSE) এর মতো কোনও কিছুর আগে ফিল্টার করার জন্য {লগ.ভি (TAG, "আমার লগ বার্তা"); } প্রয়োজন হয়. এটি সাধারণত বেশ ক্লান্তিকর। আমি যা চাই তা পেতে আমি slf4j-android এর পরিবর্তিত সংস্করণ ব্যবহার করি।
মুক্তি দিয়েছে

2
@ ডেভ আপনি কি কখনও স্থানীয়.প্রপ পদ্ধতিটি সঠিকভাবে কাজ করতে সক্ষম হয়েছিলেন? আমি এই কাজটি করতে অক্ষম, আমি একটি এন্ট্রি log.tag.test = INFO তৈরি করেছি এবং তারপরে এডিবি শেল থেকে সেটপ্রপ লগ.ট্যাগ.টেষ্ট সুপারপ্রেস চালিয়ে এটি পরিবর্তন করার চেষ্টা করেছি এবং এটি কোনও পরিবর্তন করে না। এছাড়াও System.getProperty এবং System.setProperty ব্যবহার করা কিছুই করে না। আপনার কাছ থেকে একটি আপডেট পেতে চেয়েছিলেন। ধন্যবাদ।
jjNford

2
মন্তব্যের জন্য +1 "এটি কীভাবে কাজ করা উচিত সে সম্পর্কে এপিআই ডক্স খুব অস্পষ্ট"।
অ্যালান

90

সবচেয়ে সহজ উপায় সম্ভবত আপনার কম্পাইল JAR- র মাধ্যমে চালানো হয় ProGuard মত একটি কনফিগ সঙ্গে, স্থাপনার আগে:

-assumenosideeffects class android.util.Log {
    public static int v(...);
}

এটি - অন্য সমস্ত প্রোগুয়ার্ড অপ্টিমাইজেশানগুলি বাদ দিয়ে - বাইটকোড থেকে সরাসরি কোনও ভার্বোজ লগ স্টেটমেন্ট সরিয়ে ফেলবে।


এতে কোনও লগ.প্রোপার্টি ফাইল রয়েছে যেখানে আমরা সেটিংস সংজ্ঞায়িত করতে পারি।
d-man

1
অগ্রগতির সাথে লাইনগুলি কেটে ফেলার অর্থ হ'ল উত্পাদন থেকে আপনার স্ট্যাকের চিহ্নগুলি আপনার কোডের সাথে সামঞ্জস্য হতে পারে না।
লারহাম 1

3
@ লারহাম ১: প্রোগুয়ার্ড বাইটোকোডে কাজ করে, তাই আমি কল্পনা করব যে লগিং কলগুলি সরিয়ে এম্বেড করা লাইন নম্বর মেটাডেটা পরিবর্তন করে না।
ক্রিস্টোফার অর

19
এটি মনে রাখবেন - এমনকি যদি লগ.ভি () এর আসল কলটি ছিনিয়ে নেওয়া হচ্ছে, তার যুক্তিগুলি এখনও মূল্যায়ন করা হয়। সুতরাং আপনার যদি কিছু ব্যয়বহুল পদ্ধতির কল ভিতরে থাকে তবে লগ.ভ (TAG, জেনারেটলগ ()) এটি যদি আপনার কিছু গরম কোডের পথে থাকে তবে এটি আপনার পারফরম্যান্সকে ক্ষতি করতে পারে। এমনকি টসস্ট্রিং () বা স্ট্রিং.ফর্ম্যাট () এর মতো জিনিসগুলিও তাৎপর্যপূর্ণ হতে পারে।
Bżażej Czapp

4
@ গণেশকৃষ্ণান না, এটি সত্য নয়। লগ.ভিতে () কলটি কেটে ফেলা হয়েছে তবে, ডিফল্টরূপে স্ট্রিংটি তৈরি করার পদ্ধতি কলগুলি সরানো হবে না। : ProGuard লেখক থেকে এই উত্তর দেখুন stackoverflow.com/a/6023505/234938
ক্রিস্টোফার Orr

18

আমি একটি সহজ রুট নিয়েছি - একটি মোড়ক ক্লাস তৈরি করে যা ভেরিয়েবল প্যারামিটার তালিকাগুলিও ব্যবহার করে।

 public class Log{
        public static int LEVEL = android.util.Log.WARN;


    static public void d(String tag, String msgFormat, Object...args)
    {
        if (LEVEL<=android.util.Log.DEBUG)
        {
            android.util.Log.d(tag, String.format(msgFormat, args));
        }
    }

    static public void d(String tag, Throwable t, String msgFormat, Object...args)
    {
        if (LEVEL<=android.util.Log.DEBUG)
        {
            android.util.Log.d(tag, String.format(msgFormat, args), t);
        }
    }

    //...other level logging functions snipped

1
আমি উপরে উল্লিখিত হিসাবে। এই কৌশলটি প্রয়োগ করতে আমি slf4j-android এর একটি পরিবর্তিত সংস্করণ ব্যবহার করেছি।
মুক্তি দিয়েছে

3
এটি নিয়ে একটি বড় উদ্বেগ রয়েছে, দেখুন স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি /

10

আরও ভাল উপায় হ'ল এসএলএফ 4 জ এপিআই + এর কিছু প্রয়োগকরণ।

অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলির জন্য আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

  1. অ্যান্ড্রয়েড লগার হ'ল লাইটওয়েট তবে কনফিগার করতে সহজ এসএলএফ 4 জ প্রয়োগকরণ (<50 কেবি)।
  2. LOGBack সর্বাধিক শক্তিশালী এবং অনুকূলিতকরণ বাস্তবায়ন তবে এর আকার প্রায় 1 এমবি।
  3. আপনার স্বাদ অনুসারে অন্য যে কোনও: slf4j-android, slf4android।

2
অ্যান্ড্রয়েডে, আপনাকে ব্যবহার করতে হবে logback-android(যেহেতু logbackযথাযথভাবে বেমানান নয়)। logback-android-1.0.10-1.jar429 কেবি, যা প্রদত্ত বৈশিষ্ট্যগুলি বিবেচনা করে খুব খারাপ নয়, তবে বেশিরভাগ বিকাশকারীরা যাইহোক তাদের অ্যাপ্লিকেশনটি অনুকূল করতে প্রগার্ড ব্যবহার করবেন।
টনি 19

লগিংয়ের আগে লগ স্তরটি পরীক্ষা করতে স্টেটমেন্টগুলি ব্যবহার করা আপনাকে রক্ষা করে না। স্ট্যাকওভারফ্লো
৪৪৯৮৮60০০/২

8

আপনার ব্যবহার করা উচিত

    if (Log.isLoggable(TAG, Log.VERBOSE)) {
        Log.v(TAG, "my log message");
    }

2
#Loggable এর আউটপুটটি কীভাবে কনফিগার করবেন? যখন ডেডব্যাগেবলটি ম্যানিফেস্টে মিথ্যা সেট করা হয় তখন ডিবাগ এবং ভার্বোজগুলি লগযোগ্য হয় না?
ওয়ানওয়ার্ল্ড

5

প্রগুয়ার্ড দিয়ে লগিং ছড়িয়ে দেওয়া (@ ক্রিসটফার থেকে উত্তর দেখুন) সহজ এবং দ্রুত ছিল, তবে ফাইলটিতে কোনও ডিবাগ লগিং থাকলে এটি উত্পাদন থেকে উত্সের সাথে মেলে না tra

পরিবর্তে, এখানে এমন একটি কৌশল রয়েছে যা বিকাশ বনাম উত্পাদনে বিভিন্ন লগিং স্তর ব্যবহার করে, ধরে নিই যে অগ্রগতি কেবলমাত্র উত্পাদনেই ব্যবহৃত হয়। এটি প্রোগ্রুয়ার্ড কোনও প্রদত্ত শ্রেণীর নাম পরিবর্তন করেছে কিনা তা দেখে উত্পাদন স্বীকৃতি দেয় (উদাহরণস্বরূপ, আমি "com.foo.Bar" ব্যবহার করি - আপনি এটি পুরোপুরি যোগ্য শ্রেণীর নাম দিয়ে প্রতিস্থাপন করবেন যা আপনি জানেন যে প্রগর্ড দ্বারা নামকরণ করা হবে)।

এই কৌশলটি কমনের লগিং ব্যবহার করে।

private void initLogging() {
    Level level = Level.WARNING;
    try {
        // in production, the shrinker/obfuscator proguard will change the
        // name of this class (and many others) so in development, this
        // class WILL exist as named, and we will have debug level
        Class.forName("com.foo.Bar");
        level = Level.FINE;
    } catch (Throwable t) {
        // no problem, we are in production mode
    }
    Handler[] handlers = Logger.getLogger("").getHandlers();
    for (Handler handler : handlers) {
        Log.d("log init", "handler: " + handler.getClass().getName());
        handler.setLevel(level);
    }
}

3

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


3

প্রমিত অ্যান্ড্রয়েড লগ শ্রেণীর জন্য একটি ছোট ড্রপ-ইন প্রতিস্থাপন রয়েছে - https://github.com/zserge/log

মূলত আপনাকে যা করতে হবে তা হ'ল আমদানি প্রতিস্থাপন android.util.Logকরা trikita.log.Log। তারপর আপনার Application.onCreate()বা জন্য চেক initalizer কিছু স্ট্যাটিক মধ্যে BuilConfig.DEBUGবা অন্য কোন পতাকা এবং ব্যবহার Log.level(Log.D)বা Log.level(Log.E)ন্যূনতম লগ স্তর পরিবর্তন। আপনি Log.useLog(false)লগিং একেবারে অক্ষম করতে ব্যবহার করতে পারেন ।


2

আপনি এই লগ এক্সটেনশন ক্লাসটি দেখতে পাচ্ছেন: https://github.com/dbauduin/Android- টুলস / ট্রি / মাস্টার / লোগগুলি

এটি আপনাকে লগগুলিতে সূক্ষ্ম নিয়ন্ত্রণ রাখতে সক্ষম করে। আপনি উদাহরণস্বরূপ সমস্ত লগ বা কিছু প্যাকেজ বা ক্লাসের লগগুলি অক্ষম করতে পারেন।

তদতিরিক্ত, এটি কিছু দরকারী কার্যকারিতা যুক্ত করে (উদাহরণস্বরূপ আপনাকে প্রতিটি লগের জন্য একটি ট্যাগ পাস করতে হবে না)।


2

আমি একটি ইউটিলিটি / মোড়ক তৈরি করেছি যা এই সমস্যাটি + লগিংয়ের চারপাশে অন্যান্য সাধারণ সমস্যাগুলি সমাধান করে।

নিম্নলিখিত বৈশিষ্ট্য সহ একটি ডিবাগিং ইউটিলিটি:

  • লগ ক্লাস দ্বারা সরবরাহিত স্বাভাবিক বৈশিষ্ট্যগুলি লগমোড এস দ্বারা প্রায় মোড়ানো ।
  • পদ্ধতি এন্ট্রি-প্রস্থান লগ: একটি স্যুইচ দ্বারা বন্ধ করা যেতে পারে
  • নির্বাচনী ডিবাগিং: ডিবাগ নির্দিষ্ট ক্লাস।
  • পদ্ধতি সম্পাদন-সময় পরিমাপ: পৃথক পদ্ধতির জন্য নির্বাহের সময় পরিমাপের পাশাপাশি শ্রেণীর সমস্ত পদ্ধতিতে ব্যয় করা সম্মিলিত সময়।

ব্যবহারবিধি?

  • আপনার প্রকল্পে শ্রেণি অন্তর্ভুক্ত করুন।
  • আপনি android.util.Log পদ্ধতি ব্যবহার করে শুরু করার মতো এটি ব্যবহার করুন।
  • আপনার অ্যাপ্লিকেশনটিতে পদ্ধতিগুলির শুরুতে এবং শেষের দিকে এন্ট্রি-প্রস্থান লগ বৈশিষ্ট্যটি কল করুন:

ডকুমেন্টেশনগুলিকে স্বনির্ভর করার চেষ্টা করেছি।

এই ইউটিলিটি উন্নতির পরামর্শগুলি স্বাগত।

বিনামূল্যে ব্যবহার / ভাগ।

এটি গিটহাব থেকে ডাউনলোড করুন ।


2

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

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import android.util.Log;

public class Logger {

    public enum Level {
        error, warn, info, debug, trace
    }

    private static final String DEFAULT_TAG = "Project";

    private static final Level CURRENT_LEVEL = BuildConfig.DEBUG ? Level.trace : Level.info;

    private static boolean isEnabled(Level l) {
        return CURRENT_LEVEL.compareTo(l) >= 0;
    }

    static {
        Log.i(DEFAULT_TAG, "log level: " + CURRENT_LEVEL.name());
    }

    private String classname = DEFAULT_TAG;

    public void setClassName(Class<?> c) {
        classname = c.getSimpleName();
    }

    public String getClassname() {
        return classname;
    }

    public boolean isError() {
        return isEnabled(Level.error);
    }

    public boolean isWarn() {
        return isEnabled(Level.warn);
    }

    public boolean isInfo() {
        return isEnabled(Level.info);
    }

    public boolean isDebug() {
        return isEnabled(Level.debug);
    }

    public boolean isTrace() {
        return isEnabled(Level.trace);
    }

    public void error(Object... args) {
        if (isError()) Log.e(buildTag(), build(args));
    }

    public void warn(Object... args) {
        if (isWarn()) Log.w(buildTag(), build(args));
    }

    public void info(Object... args) {
        if (isInfo()) Log.i(buildTag(), build(args));
    }

    public void debug(Object... args) {
        if (isDebug()) Log.d(buildTag(), build(args));
    }

    public void trace(Object... args) {
        if (isTrace()) Log.v(buildTag(), build(args));
    }

    public void error(String msg, Throwable t) {
        if (isError()) error(buildTag(), msg, stackToString(t));
    }

    public void warn(String msg, Throwable t) {
        if (isWarn()) warn(buildTag(), msg, stackToString(t));
    }

    public void info(String msg, Throwable t) {
        if (isInfo()) info(buildTag(), msg, stackToString(t));
    }

    public void debug(String msg, Throwable t) {
        if (isDebug()) debug(buildTag(), msg, stackToString(t));
    }

    public void trace(String msg, Throwable t) {
        if (isTrace()) trace(buildTag(), msg, stackToString(t));
    }

    private String buildTag() {
        String tag ;
        if (BuildConfig.DEBUG) {
            StringBuilder b = new StringBuilder(20);
            b.append(getClassname());

            StackTraceElement stackEntry = Thread.currentThread().getStackTrace()[4];
            if (stackEntry != null) {
                b.append('.');
                b.append(stackEntry.getMethodName());
                b.append(':');
                b.append(stackEntry.getLineNumber());
            }
            tag = b.toString();
        } else {
            tag = DEFAULT_TAG;
        }
    }

    private String build(Object... args) {
        if (args == null) {
            return "null";
        } else {
            StringBuilder b = new StringBuilder(args.length * 10);
            for (Object arg : args) {
                if (arg == null) {
                    b.append("null");
                } else {
                    b.append(arg);
                }
            }
            return b.toString();
        }
    }

    private String stackToString(Throwable t) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream(500);
        baos.toString();
        t.printStackTrace(new PrintStream(baos));
        return baos.toString();
    }
}

এটি ব্যবহার করুন:

Loggor log = new Logger();
Map foo = ...
List bar = ...
log.error("Foo:", foo, "bar:", bar);
// bad example (avoid something like this)
// log.error("Foo:" + " foo.toString() + "bar:" + bar); 

1

খুব সাধারণ লগিং দৃশ্যে, যেখানে আপনি আক্ষরিক অর্থে ডিবাগিংয়ের উদ্দেশ্যে বিকাশের সময় কনসোলটি লেখার চেষ্টা করছেন সেখানে আপনার প্রোডাকশনটি তৈরি করার আগে লগ বা সিস্টেমে সমস্ত কল কল করে মন্তব্য করার আগে সন্ধান এবং প্রতিস্থাপন করা সহজ কাজ হতে পারে। out.println।

উদাহরণস্বরূপ, ধরে নিচ্ছেন আপনি "লগ" ব্যবহার করেননি। লগ.ডি বা লগ.ই, ইত্যাদির কলের বাইরে যে কোনও জায়গায়, আপনি কেবল "লগ" প্রতিস্থাপনের জন্য পুরো সমাধানটি সন্ধান করতে এবং প্রতিস্থাপন করতে পারেন। "// লগ" সহ আপনার সমস্ত লগিং কলগুলি সম্পর্কে মন্তব্য করতে বা আমার ক্ষেত্রে আমি কেবল যেকোন জায়গায় System.out.println ব্যবহার করছি, সুতরাং উত্পাদনে যাওয়ার আগে আমি কেবল একটি সম্পূর্ণ অনুসন্ধান করব এবং "System.out.println" এর জন্য প্রতিস্থাপন করব এবং এর সাথে প্রতিস্থাপন করব "//System.out.println"।

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


1

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

এটি কার্যকর (সুবিধাজনক) যে জাভা কোনও বুলিয়ান বর্ণটিকে মিথ্যা হিসাবে ব্যাখ্যা করে যদি এটির কোনও মূল্য বরাদ্দ না করা হয়, যার অর্থ এটি আপনাকে লগিং চালু না করা অবধি মিথ্যা হিসাবে ছেড়ে দেওয়া যেতে পারে :-)


1

আমরা Logআমাদের স্থানীয় উপাদানগুলিতে ক্লাস ব্যবহার করতে পারি এবং পদ্ধতিগুলি v / i / e / d হিসাবে সংজ্ঞায়িত করতে পারি। প্রয়োজনের ভিত্তিতে আমরা আরও কল করতে পারি।
উদাহরণ নীচে প্রদর্শিত হয়।

    public class Log{
        private static boolean TAG = false;
        public static void d(String enable_tag, String message,Object...args){
            if(TAG)
            android.util.Log.d(enable_tag, message+args);
        }
        public static void e(String enable_tag, String message,Object...args){
            if(TAG)
            android.util.Log.e(enable_tag, message+args);
        }
        public static void v(String enable_tag, String message,Object...args){
            if(TAG)
            android.util.Log.v(enable_tag, message+args);
        }
    }
    if we do not need any print(s), at-all make TAG as false for all else 
    remove the check for type of Log (say Log.d).
    as 
    public static void i(String enable_tag, String message,Object...args){
    //      if(TAG)
            android.util.Log.i(enable_tag, message+args);
    }

এখানে বার্তাটি হ'ল stringএবং argsআপনি মুদ্রণ করতে চান এমন মান।


0

আমার জন্য এটি প্রায়শই প্রতিটি ট্যাগের জন্য বিভিন্ন লগ স্তর নির্ধারণ করতে সক্ষম useful

আমি এই খুব সাধারণ র‍্যাপার ক্লাসটি ব্যবহার করছি:

public class Log2 {

    public enum LogLevels {
        VERBOSE(android.util.Log.VERBOSE), DEBUG(android.util.Log.DEBUG), INFO(android.util.Log.INFO), WARN(
                android.util.Log.WARN), ERROR(android.util.Log.ERROR);

        int level;

        private LogLevels(int logLevel) {
            level = logLevel;
        }

        public int getLevel() {
            return level;
        }
    };

    static private HashMap<String, Integer> logLevels = new HashMap<String, Integer>();

    public static void setLogLevel(String tag, LogLevels level) {
        logLevels.put(tag, level.getLevel());
    }

    public static int v(String tag, String msg) {
        return Log2.v(tag, msg, null);
    }

    public static int v(String tag, String msg, Throwable tr) {
        if (logLevels.containsKey(tag)) {
            if (logLevels.get(tag) > android.util.Log.VERBOSE) {
                return -1;
            }
        }
        return Log.v(tag, msg, tr);
    }

    public static int d(String tag, String msg) {
        return Log2.d(tag, msg, null);
    }

    public static int d(String tag, String msg, Throwable tr) {
        if (logLevels.containsKey(tag)) {
            if (logLevels.get(tag) > android.util.Log.DEBUG) {
                return -1;
            }
        }
        return Log.d(tag, msg);
    }

    public static int i(String tag, String msg) {
        return Log2.i(tag, msg, null);
    }

    public static int i(String tag, String msg, Throwable tr) {
        if (logLevels.containsKey(tag)) {
            if (logLevels.get(tag) > android.util.Log.INFO) {
                return -1;
            }
        }
        return Log.i(tag, msg);
    }

    public static int w(String tag, String msg) {
        return Log2.w(tag, msg, null);
    }

    public static int w(String tag, String msg, Throwable tr) {
        if (logLevels.containsKey(tag)) {
            if (logLevels.get(tag) > android.util.Log.WARN) {
                return -1;
            }
        }
        return Log.w(tag, msg, tr);
    }

    public static int e(String tag, String msg) {
        return Log2.e(tag, msg, null);
    }

    public static int e(String tag, String msg, Throwable tr) {
        if (logLevels.containsKey(tag)) {
            if (logLevels.get(tag) > android.util.Log.ERROR) {
                return -1;
            }
        }
        return Log.e(tag, msg, tr);
    }

}

এখন প্রতিটি ক্লাসের শুরুতে কেবল ট্যাগ প্রতি লগ স্তর সেট করুন:

Log2.setLogLevel(TAG, LogLevels.INFO);

0

আরেকটি উপায় হ'ল লগিং প্ল্যাটফর্ম ব্যবহার করা যাতে লগগুলি খোলার ও বন্ধ করার ক্ষমতা থাকে। এটি কখনও কখনও এমন কোনও প্রোডাকশন অ্যাপ্লিকেশনটিতেও অনেকটা নমনীয়তা দিতে পারে যা কোন সমস্যাগুলির উদাহরণস্বরূপ আপনার লগগুলি খোলা থাকতে হবে এবং কোনটি বন্ধ হবে:

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