Du sprichst in Rätseln.
fprintf() erwartet keinen "void *", sondern einen Zeiger auf FILE. Das
war in C schon immer so. Was sich genau hinter FILE verbirgt, ist
"Eigentum" der Bibliothek (die ja stdio implementieren muss).
Typischerweise ist das eine Struktur mit diversen Flags, Zeigern auf
irgendwelche Puffer sowie irgendeinem Hinweis, wohin die Ein-/Ausgabe
tatsächlich geht.
Im Mikrocontroller-Umfeld muss deine Bibliotheksimplementierung
irgendwie dokumentieren, was sie mit FILE macht bzw. wie die Verbindung
zu physischen Ressourcen des Controllers aussieht. Im Falle der im
ARM-Umfeld sehr weit verbreiteten newlib fällt sie einfach auf die
klassischen Posix-Primitiven wie _open(), _read() und _write() zurück.
Diese wiederum müssen dann von der Umgebung bereit gestellt werden und
darin legst du mehr oder weniger selbst fest, was du damit machst.
Was das alles mit deinem app_log() zu tun haben soll – keine Ahnung.
Vielleicht beschreibst du ja dein Problem einfach mal etwas genauer.