Использовать логирование в скрипте Bash - PullRequest
4 голосов
/ 25 ноября 2011

У меня есть скрипт bash, из которого мне нужно писать логи.в настоящее время я использую блок, подобный показанному ниже

#log stop request
            {
                local now=$(date +"%a %b %d %Y %H:%M:%S")

                printf "batch stop request successful. \n"
                printf "      Time            :: %s\n" "$now"
                printf "      PID of process  :: %s\n" ${PID[0]}"
            } >> "${mylogfile}"

, где переменная mylogfile будет иметь имя файла журнала.

Проблема с этим подходом заключается в том, что при запуске 2 или более экземпляров журналыимеет тенденцию запутываться в записях из экземпляров с чередованием.

Обратите внимание, что я использовал блок, полагая, что это приведет к записи журнала в файл за один раз, что позволяет избежать проблемы.

Я видел команду логгера из Вивек Гите пост .но проблема в том, что он не пишет в файл, который я могу указать, а делает это в /var/log/message.

Любая помощь очень ценится.

Спасибо и С уважением Сиби

Ответы [ 4 ]

3 голосов
/ 25 ноября 2011

POSIX (IEEE Std 1003.1-2001) не определяет поведение одновременных write () системных вызовов, отправляющих данные в один и тот же файл, поэтому вы можете получить разные результаты в зависимости от вашей платформы. Вы можете попытаться объединить все printfs в одно в надежде, что это сработает, но даже если это произойдет, нет гарантии, что это будет в будущем или на другой платформе.

Вместо того, чтобы использовать управление параллельным доступом и сброс для обеспечения последовательности операций записи, вы можете отправлять сообщения третьему процессу, который будет последовательно записывать ваши сообщения журнала в файл от имени всех процессов. Фактически, это то, что сделано с logger и syslog в сообщении , которое вы цитировали. Команда logger не отправляет сообщения на /var/log/messages. Он отправляет сообщения журнала на syslog, который можно настроить для сохранения сообщений журнала в любом месте. Однако для изменения этой конфигурации обычно требуются права администратора.

Если вы не можете или не хотите использовать syslog, вы также можете использовать netcat в качестве сервера регистрации. Запустите его, чтобы мультиплексировать все входящие сообщения журнала из всех сценариев в файл (это задание должно постоянно выполняться в фоновом режиме, вы также можете запустить его на экране ):

nc -luk localhost 9876 > shared_log_file &

(порт 9876 - просто пример) и войдите в каждый скрипт следующим образом:

printf "Log message\n" > /dev/udp/localhost/9876

Вы также можете использовать собственный сервер UDP вместо netcat (например, как этот ).

2 голосов
/ 25 ноября 2011

Как вы обнаружили, блок не группирует printfs. Однако вы можете сделать все эти команды в под-оболочке (между круглыми скобками), а затем перенаправить вывод под-оболочки!

1 голос
/ 25 ноября 2011

В зависимости от характера вашего журнала, он может хорошо подходить для системного журнала, а не для его личного файла журнала.В этом случае программа logger может быть очень хорошей альтернативой ручной записи.

1 голос
/ 25 ноября 2011

Попытка поместить 3 printfs в одну строку, т.е.

printf "Epsilon batch stop request successful. \n      Time            :: %s\n     PID of process  :: %s\n" "$now"  ${PID[0]}

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

Почему бы не запустить каждый экземпляр с собственным файлом журнала, используя $ {PID} в имени вашего файла журнала, чтобы разделить их? т.е.

 >> "${mylogfile}.${PID}"

Редактировать

Поскольку вы надеетесь на регистратор, загляните в справочную страницу:

logger(1) - Linux man page

Name

logger - a shell command interface to the syslog(3) system log module

Synopsis
logger [-isd] [-f file] [-p pri] [-t tag] [-u socket] [message ...]

Description

Logger makes entries in the system log. It provides a shell command interface to the syslog(3) system log module.

Options:

    -i'         Log the process id of the logger process with each line.
    -s' Log the message to standard error, as well as the system log.
    -f file
        Log the specified file.

.....

Это похоже на то, что вы хотите.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...