Мы так сделали: скрипт перед компиляцией проходит по исходнику, строит индексный файл и заменяет все строки в макросах DEBUG() на идентификаторы. В обратную сторону - используя индексный файл (можно прям в реальном времени). Задача была несколько другой - меньше расходовать флешь на логи. Минусы - не все спецификаторы вывода поддерживаются, но нам хватает. Отключить (т.е. выводить лог в печатном виде) можно одним дефайном.