2015-01-22 2 views
0

Я использую ocaml-dns.Захват вывода printf библиотеки от вызывающего в OCaml

Here вы можете увидеть это сделать

printf "retrying query for %d times\n%!" (4-count); 

и это захламление моих журналов! Я уже работаю с ошибками, меня не волнует этот вывод, и я хочу заставить его замолчать. Как я могу это сделать без наложения и изменения самой библиотеки? Могу ли я каким-то образом выгрузить его выход?

Благодаря

+2

Вам не повезло. Библиотеки никогда не должны выводиться в стандартные дескрипторы файлов, за исключением случаев, когда это прямо сказано. Я подал сообщение об ошибке [здесь] (https://github.com/mirage/ocaml-dns/issues/36). –

ответ

1

Если вы на Unix-подобных системах вы можете перенаправить стандартный вывод «/ DEV/нуль». Нечто подобное может работать:

let nullout = open_out "/dev/null" in 
Unix.dup2 (Unix.descr_of_out_channel nullout) Unix.stdout 

Вот сессия, показывая, что он работает (по крайней мере для меня на OS X):

$ ocaml 
     OCaml version 4.01.0 

# #load "unix.cma";; 
# Sys.system "echo unwanted message";; 
Error: Unbound value Sys.system 
# Sys.command "echo unwanted message";; 
unwanted message 
- : int = 0 
# let nullout = open_out "/dev/null" in 
    Unix.dup2 (Unix.descr_of_out_channel nullout) Unix.stdout;; 
Sys.command "echo unwanted message";; 
Sys.command "echo error message >&2";; 
error message 

Если вам необходимо использовать стандартный вывод в другое время, у вас есть хуже. Я думаю, вы можете перенаправить stdout обратно туда, где он был раньше, с некоторыми дополнительными видами использования dup.

+0

Спасибо за подсказку, чтобы использовать 'dup', но, к сожалению, мне нужно иметь возможность писать свои собственные материалы в stdout, я просто хочу заставить замолчать эту шумную библиотеку. Даниэль Бюнзли прокомментировал мой вопрос, а затем подал ошибку на Github, и авторы сказали, что они это исправит. – SGr

+1

Если вы хотите очень яростно действовать с помощью 'dup', я уверен, что вы можете заставить его работать. Но исправление ошибки значительно превосходит. –

+0

Да, я мог перенаправить на нуль перед каждым вызовом, а затем вернуться к нормальному выходу сразу после. Я мог бы сделать это в среднем, если это не повлияет на производительность слишком много. – SGr