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