Clojure:
Запись в стандартный поток ошибок
Как это сделать:
Для вывода в стандартный поток ошибок в Clojure используют binding
с *err*
. Вот простой пример:
(binding [*err* *out*]
(println "Это пойдет в стандартный поток ошибок"))
Пример вывода (в вашем терминале):
$ clj your_script.clj 2> error.log
$ cat error.log
Это пойдет в стандартный поток ошибок
Этот фрагмент кода связывает *err*
с *out*
, который является стандартным выводом, так что вы можете видеть, что обычно пойдет в stderr
.
Глубокое Погружение
Исторически в системах Unix было два отдельных потока вывода, stdout
и stderr
, для разных типов данных. В Clojure *out*
относится к stdout
, а *err*
к stderr
. Альтернативы использованию binding
включают прямое использование Java interop (например, (.println System/err "сообщение")
). С точки зрения реализации, *err*
является динамической переменной, позволяющей использовать привязки локальные для потока — нюанс, который может влиять на то, как ошибки логируются в приложениях с конкурентностью.
Смотрите Также
- Документация Clojure по
*err*
: https://clojuredocs.org/clojure.core/err - Документация Clojure по
binding
: https://clojuredocs.org/clojure.core/binding - Java API для
PrintStream
(который являетсяSystem/err
): https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html
Для более широкого понимания стандартных потоков также могут быть полезны следующие источники:
- Википедия о Стандартных Потоках: https://en.wikipedia.org/wiki/Standard_streams
- Документация по стандартным потокам Unix:
man stdio