В ядре, я думаю, вы могли бы написать драйвер, который перехватывает чтение и запись, чтобы получить то, что вы хотите.
В пространстве пользователя вы можете скомпилировать модифицированный glibc, который регистрирует вывод stdout & stderr в некоторый файл вместе с процессом и ID потока, например. Но это рискованно, если вы что-то сломаете. (при условии, что приложения, которые вы хотите отследить, не связаны статически или не выполняют прямые системные вызовы с ядром)