Логирование в Android Studio без кода


Вам больше не нужно ставить Log.d() в каждой строке кода!


Когда мы отлаживаем приложения, мы иногда начинаем плодить логи по всему коду, чтобы разобраться с какой-либо проблемой.


class MainActivity : AppCompatActivity() {

    lateinit var retrofit: Retrofit

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setupToolbar()
        Log.d("MyApp", "Toolbar Set")

        initRetrofit()
        Log.d("MyApp", "Retrofit Initialized")

        var myButton = findViewById<Button>(R.id.search_close_btn)
        myButton.setOnClickListener {
            Log.d("MyApp", "My Button Clicked")
        }

        Log.d("MyApp", "Activity Creation Done!")

    }
}

Это прекрасно работает, но бывает так, что мы забываем удалить логи перед тем как закоммитаться, и они «благополучно» попадают в продакшн код.


Хорошая практика — не оставлять логи для отладки после её завершения, даже если вы используете ProGuard для их автоматического удаления в скомпилированном коде, так как они оказывают пагубное влияние на общую читабельность вашего кода. Как и комментарии, логи могут легко начать расходиться с окружающим их кодом, в лучшем случае становясь бесполезными, а в худшем вводящими в заблуждение.


Ситуация усложняется, когда выведение логов требует соблюдения определённых условий. Теперь это не просто бесполезное нагромождение if else, но ещё и потенциально дорогостоящий код.


Но, оказывается, есть очень простой способ решения этой проблемы. IntelliJ и Android Studio позволяют создавать точки прерывания (англ. breakpoints), не прерывающие исполнение кода (да, это законно).


Сначала создайте точку прерывания на любой строке, либо щелкнув в левой части редактора, либо с помощью сочетания клавиш Ctrl-F8. Затем вы можете отредактировать точку прерывания, либо щелкнув по ней правой кнопкой мыши, либо используя комбинацию клавиш Ctrl-Shift-F8. Вы увидите такое окно:


Редактирование точки прерывания


Затем снимите флажок Suspend (рус. приостановить), и вы увидите больше параметров в этом модальном окне:


Параметры точки прерывания


Теперь добавьте любые логи в поле Evaluate and log следующим образом:


Evaluate and log


И после удаления всех логов из кода и добавления их в точки прерывания ваш код будет выглядеть чистым:


class MainActivity : AppCompatActivity() {

    lateinit var retrofit: Retrofit

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setupToolbar()
        initRetrofit()

        var myButton = findViewById<Button>(R.id.search_close_btn)
        myButton.setOnClickListener {

        }

    }
}

Гораздо лучше, правда? Теперь идите и используйте непрерывающиеся точки прерывания! Все, что вам нужно сделать, это запустить приложение в режиме отладки, и сообщения будут выводиться в консоль.


О других хитростях в Android Studio читайте здесь

Комментарии (14)


  1. petrovichtim
    21.08.2018 15:47

    Круто, спасибо за инструкцию!


  1. Prototik
    21.08.2018 16:17

    Вот уж что-что, а статью «смотрите, в идее есть дебаггер, прямо как во всех IDE!» я не ожидал увидеть.


  1. PainMain
    21.08.2018 21:09

    Приятно видеть что сообщество Kotlin растёт и на нём выходят новые статьи и уроки очень часто.


    1. qwert_ukg
      22.08.2018 06:08

      Зачем сюда пихать тег `Kotlin`, если никаго отношения к языку это не имеет?


      1. staticlab
        22.08.2018 11:52

        Кстати судя по тому, что такая же фича есть и в WebStorm, вероятно она есть в каждой их IDE. Можно было бы написать десяток таких статей, только языки заменять :)


      1. Devcolibri Автор
        22.08.2018 17:08

        В общем-то вы правы. Убрал тег


  1. TigerMe
    22.08.2018 17:06

    Интересная фишка.
    А я сделал по другому — простую функцию и там прописал Log.d..., и поставил условие если BuildConfig.DEBUG то выводить логи, а иначе нет, и все проблемы с логами в релизе испарились)


    1. qwert_ukg
      23.08.2018 05:27

      Такое вроде уже есть в логерах


    1. ShadyRover
      24.08.2018 09:32

      ProGuard отлично вырезает все логи


  1. LaQr
    22.08.2018 17:06

    Хотел спросить: а как быть, если над проектом работает >1 человека и код хранится в удаленном репозитории? Логи позволяют довольно удобно отслеживать правильность выполнения тех или иных операций, а покрывать бряками проект на >100 файлов вручную как то сложно. Да и порой приходится делать поиск по всему проекту оперируя строками из логов, чтобы понять что именно пошло не так.


    1. Devcolibri Автор
      22.08.2018 17:07

      Но ведь для проверки выполнения правильности операций можно использовать тесты. Зачем логи? Логи для дебага.

      Да и код без логов гораздо чище.


      1. LaQr
        23.08.2018 13:02

        Насчет тестов я с вами полностью согласен. Но во первых есть легаси код, а во вторых далеко не весь код покрывается тестами. Мне кажется довольно удобным, когда я сразу могу увидеть, что сервер прислал что то не то, в момент когда я отлаживаю совершенно другие вещи, или например давно написанная обертка для энкодера видео в h264 с чем то не справилась и написала об этом в лог.
        Логи действительно выводятся только в дебажных сборках, у нас самописный логгер с некоторым количеством плюшек, одной из которых является невывод логов в релизных сборках. Да и без этого можно обойтись, proguard вполне себе выпиливает логи.
        Код действительно становится чище, факт. Но никто не заставляет писать логи в каждой второй строке, а потом на них всех смотреть. Именно для этого есть разные уровни логов, фильтры logcat в IDE и возможность покрасить логи определенного уровня определенным цветом. Но тут уже у кого как принято и кому как нравится.


  1. avz
    22.08.2018 17:46

    Вам больше не нужно ставить Log.d() в каждой линии!

    You don’t have to put Log.d() like lines anymore!

    «like lines» походу сленг. Логичнее написать в переводе «в каждой строке [кода]», не?


    1. Devcolibri Автор
      22.08.2018 22:19

      Да, так лучше звучит.