Печать сообщения на экране и одновременная отправка в системный журнал

Я пытаюсь реализовать опцию -s (т.е. беззвучную) в своем сценарии - при получении ошибок/информации и т. д. они будут отправлены в системный журнал, в противном случае печать будет выводиться на экран, а также одновременно отправлена ​​в syslog. Это то, что я делаю:

echo -e "This Is a Test Message\nWell, not really!!"  2>&1 | logger

чтобы отправить сообщение echo на syslog (которое не печатается на экране), но не мог просто понять, как сделать и то, и другое одновременно. Я вижу, что люди говорят только о ведении журнала с помощью syslog или отправке журнала в другой файл во время печати на экране, но не о ситуации, с которой я пытаюсь справиться. Любая помощь или указатель будут очень признательны. Ваше здоровье!!


person MacUsers    schedule 02.09.2013    source источник
comment
вы можете подключиться к tee : ... | tee -a /var/log/syslog   -  person hek2mgl    schedule 02.09.2013
comment
Не используйте tee -a /var/log/syslog - это может сделать только root, а syslogd может выполнять все виды альтернативной обработки, кроме простого добавления к этому файлу.   -  person David Sainty    schedule 02.09.2013
comment
@ hek2mgl: правда, но этот файл зависит от системы; например /var/log/messages для системы на базе Red Hat. Использование logger безопаснее IMO. Ваше здоровье!!   -  person MacUsers    schedule 02.09.2013


Ответы (3)


Если вы хотите отправить сообщение в системный журнал и на стандартный вывод (не на стандартный вывод), вы также можете сделать это:

echo -e "This Is a Test Message\nWell, not really!!" | tee >(exec logger)

И эффективный способ сделать это (если вы создаете функцию):

exec 40> >(exec logger)

function log {
    echo -e "$1"
    echo -e "$1" >&40
}

log "something..."

exec 40>&-  ## optionally close it at the end of the script.

Это избавит ваш скрипт от вызова внешнего двоичного регистратора каждый раз, когда вы выполняете эхо.

person konsolebox    schedule 02.09.2013
comment
Как вы вызываете функцию? - person Juto; 02.09.2013
comment
@konsolebox: я думаю, это мой путь. Итак, просто чтобы убедиться, что если я использую пользовательский дескриптор файла, нет другого способа сделать это, кроме как дважды использовать echo? ваше здоровье!! - person MacUsers; 02.09.2013
comment
@Juto: Вы вызываете функцию точно так же, как это делал konsolebox: log "Print something...". log — это имя функции. - person MacUsers; 02.09.2013
comment
Вы также можете использовать tee: exec 40> >(exec tee >(exec logger)), хотя я все же рекомендую иметь для него только один процесс. Всё равно всё так же. Вывод дублируется в тройник. - person konsolebox; 02.09.2013
comment
Но, конечно, вы используете другую функцию для отправки вывода в &40 и хотите сделать это только один раз, после чего может применяться новый метод. - person konsolebox; 02.09.2013

В этом случае просто повторите одно и то же сообщение дважды. Ты можешь сделать:

echo -e "This Is a Test Message\nWell, not really!!" | tee /dev/stderr | logger

Но на самом деле это проще и эффективнее сделать:

error='This Is a Test Message\nWell, not really!!'
echo -e "$error" >&2
echo -e "$error" | logger

>&2 отправляет вывод на стандартный вывод, а не на стандартный вывод.

person David Sainty    schedule 02.09.2013

Ты можешь сделать:

echo -e "This Is a Test Message\nWell, not really!!" | logger -s

На странице руководства (man logger) указано:

-s     Log the message to standard error, as well as the system log.
person David Sainty    schedule 02.09.2013
comment
Уже пробовал -s, но не понравилось то, что перед сообщением стоит имя пользователя: admin: This Is a Test...". Он также не может обработать \n для новой строки, что не очень хорошо для меня. Ваше здоровье!! - person MacUsers; 02.09.2013
comment
Я удалил 2›&1, потому что это по сути лишнее — здесь не ожидается никакого эффекта, независимо от того, используется ли опция -s или нет. - person David Sainty; 02.09.2013