Как создать log файл bash

Обновлено: 07.07.2024

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

Чтобы начать запись нужно выполнить команду script. Если вызвать команду script без параметров, то запись будет вестись в файл с именем typescript.

Файл будет создан именно в той директории, в которой вы находитесь. Вывести название текущей директории можно командой pwd. Если файл уже существует, то он будет очищен.

В качестве параметра команде script можно указать имя файла, в который вы хотите записывать всю активность в терминале. Пример вызова:

После ввода команды будет создан файл, но данные в него будут записаны только после того, как вы введете команду exit или нажмете сочетание клавиш Ctrl+D. Пример:

Мы выполнили команду script. Автоматически был создан файл typescript (если он уже существовал, то он будет очищен). С этого момента система начинает запоминать весь ввод и вывод в терминале. В конце мы вводим команду exit и в файл с именем typescript записывается все, что происходило в терминале с момента ввода команды script.

Если вы хотите, чтобы запись велась уже в существующий файл, тогда нужно добавить опцию -a. В этом случае файл не будет очищен, а новые данные будут добавлены к текущему содержимому. Пример:

Еще стоит сказать о полезной опции -c или —command. Данная опция позволяет указать команду, которую нужно выполнить, а вывод этой команды записать файл. Пример:

В данном примере мы вызываем команду script с опцией -c и указываем в качестве параметра опции команду ls, которую нужно выполнить, а вывод команды нужно записать в файл my.log. Команда ls выводит список файлов в текущей директории. Таким образом в файл my.log попадет список файлов.

Получить справку по команде script (по всем ее опциям) можно, выполнив в терминале:

это поставит "тест" в foo.журнал.

т. е. это можно сделать тривиально извне скрипта:

но я хочу объявить его в сам скрипт

но это не сработало.

обратите внимание, что это bash , а не sh . Если вы вызываете скрипт с помощью sh myscript.sh , вы получите ошибку по строкам syntax error near unexpected token '>' .

если вы работаете с сигнальными ловушками, вы можете использовать tee -i вариант для избежания нарушения выхода если сигнал происходит. (Спасибо JamesThomasMoon1979 за комментарий.)

инструменты, которые изменяют свой выход в зависимости от того, пишут ли они в трубу или терминал ( ls использование цвета и columnized output, например) обнаружит вышеуказанную конструкцию как означающую, что они выводятся в трубу.

есть опции для обеспечения колоризации / колумнизации (например, ls -C --color=always ). Обратите внимание, что это приведет к тому, что цветовые коды будут записываться в файл журнала, что делает его меньше читаем.

принятый ответ не сохраняет STDERR как отдельный файловый дескриптор. Это значит

не выводит bar к терминалу, только к файлу журнала, и

выведет оба foo и bar к терминалу. Очевидно, что это не поведение, которое обычный пользователь, вероятно, ожидает. Это может быть исправлено с помощью двух отдельных процессов tee, добавляющихся к одному и тому же файл журнала:

(обратите внимание, что выше не изначально усечь файл журнала - Если вы хотите, чтобы это поведение, вы должны добавить

в верхней части скрипта.)

на POSIX.Спецификация 1-2008 от tee(1) требует, чтобы выход не был буферизован, т. е. даже не был буферизован линией, поэтому в этом случае возможно, что STDOUT и STDERR могут оказаться в одной строке foo.log , однако это также может произойти на терминал, поэтому файл журнала будет верным отражением того, что мог бы можно увидеть на терминале, если не точное его отражение. Если вы хотите, чтобы строки STDOUT были четко отделены от строк STDERR, рассмотрите возможность использования двух файлов журнала, возможно, с префиксами даты на каждой строке, чтобы разрешить хронологическую сборку позже.

решение для busybox и non-bash оболочек

принятый ответ, безусловно, лучший выбор для bash. Я работаю в среде Busybox без доступа к bash, и он не понимает exec > >(tee log.txt) синтаксис. Это также не делает exec >$PIPE правильно, пытаясь создать обычный файл с тем же именем, что и именованный канал, который терпит неудачу и зависает.

надеюсь, это будет полезно кому-то еще, у кого нет bash.

также, для тех, кто использует именованный канал, безопасно rm $PIPE , потому что это отсоединяет канал от VFS, но процессы, которые его используют, все еще поддерживают счетчик ссылок на него, пока они не закончены.

обратите внимание, что использование $* не обязательно безопасно.

внутри файла скрипта поместите все команды в круглые скобки, например:

простой способ сделать журнал сценария bash в syslog. Вывод скрипта доступен как через /var/log/syslog и через stderr. syslog добавит полезные метаданные, включая временные метки.

добавьте эту строку вверху:

кроме того, отправьте журнал в отдельный файл:

для этого требуется moreutils (для ts команда, которая добавляет метки времени).

используя принятый ответ, мой скрипт возвращался исключительно рано (сразу после ' exec > >(tee . ) ') оставляя остальную часть моего сценария в фоновом режиме. Поскольку я не мог заставить это решение работать по-моему, я нашел другое решение/обойти проблему:

это делает вывод из скрипта идти от процесса, через канал в суб фоновый процесс "tee", который регистрирует все на диск и оригинальный stdout скрипта.

даже еси труба удаляется из файловой системы в начале скрипта он будет продолжать функционировать до завершения процессов. Мы просто не можем ссылаться на него, используя имя файла после rm-line.

Bash 4 имеет coproc команда, которая устанавливает именованный канал для команды и позволяет вам общаться через него.

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

Это позволяет сделать следующее:

вы можете настроить это, например, сделать tee=false по умолчанию, вместо этого сделать TEE держать файл журнала и т. д. Я думаю, что это решение похоже на jbarlow, но проще, возможно, у меня есть ограничения, с которыми я еще не сталкивался.

ни один из них не является идеальным решением, но вот несколько вещей, которые вы могли бы попробовать:

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

У меня проблемы с некоторыми скриптами в bash, по поводу ошибок и неожиданного поведения. Я хотел бы исследовать причины проблем, чтобы я мог применить исправления. Есть ли способ, которым я могу включить некий «режим отладки» для bash, чтобы получить больше информации?

Запустите скрипт bash с помощью bash -x ./script.sh или добавьте его в свой скрипт, set -x чтобы увидеть результаты отладки.

Дополнительно с bash 4.1 или позже:

Если вы хотите записать выходные данные отладки в отдельный файл, добавьте это в ваш скрипт:

Если вы хотите увидеть номера строк, добавьте это:

Если у вас есть доступ к logger команде, вы можете использовать ее для записи отладочной информации через системный журнал с отметкой времени, именем скрипта и номером строки:

Вы можете использовать опцию -p в logger команде для установки индивидуального объекта и уровня , чтобы написать вывод через локальный системный журнал для своей собственной логфайл.

@aggsol: Если вы используете BASH_XTRACEFD="5" bash, записывает вывод трассировки, сгенерированный, когда set -x он включен, в файловый дескриптор 5. exec 5> >(logger -t $0) перенаправляет вывод из файлового дескриптора 5 в logger команду. Просто интересно, вы можете получить номер строки и путь или имя сценария оболочки в PS4?

С помощью set -x

Я всегда использую set -x и set +x . Вы можете обернуть области, которые вы хотите видеть, что происходит с ними, чтобы повернуть детализацию вверх / вниз.

log4bash

Также, если вы выполнили работу по разработке и знакомы со стилем логгеров, которые называются log4j, log4perl и т. Д., Вы можете использовать log4bash .

Посмотрим правде в глаза - просто старое эхо просто не режет это. log4bash - это попытка улучшить ведение журнала для сценариев Bash (т. е. сделать так, чтобы вход в Bash меньше занимал).

Оттуда вы можете делать такие вещи в своих скриптах Bash:

В результате этого типа вывода:

ss1

log4sh

Если вам нужно что-то более портативное, есть и старшее log4sh . Работы аналогичные log4bash , доступные здесь:

В Ubuntu у меня есть alias say="spd-say" .bashrc, который имитирует say команду из других дистрибутивов или OS X. set -vx будет хорошей комбинацией, если используется с отладкой trap - trap read. Это позволяет вам перешагивать строки за строкой и видеть результаты

Есть отладчик bash, bashdb , который устанавливается во многих дистрибутивах. Он использует встроенный расширенный режим отладки bash ( shopt -s extdebug ). Это очень похоже на GDB; вот пример сеанса, чтобы придать некоторый вкус:

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

Это не то, что мы хотим! Давайте снова посмотрим на расширение параметров.

ОК, это работает. Давайте установим newf правильное значение.

Выглядит неплохо. Продолжите сценарий.

Стандартный метод отладки сценариев в большинстве оболочек на основе Bourne, таких как bash, - писать set -x в верхней части сценария. Это сделает bash более подробным о том, что делается / выполняется, и как оцениваются аргументы.

это полезно как для интерпретатора, так и для скриптов. Например:

Выше мы видим, почему поиск не работает из-за некоторых одинарных кавычек.

Чтобы отключить функцию, просто введите set +x .

Использование Eclipse

Вы можете использовать комбинированную среду Eclipse и Shelled с помощью скрипта "_DEBUG.sh", приведенного ниже.

Переключение оболочек

По умолчанию инструмент разработки Shelled используется /bin/dash в качестве интерпретатора. Я изменил это, чтобы /bin/bash иметь лучшую совместимость с большинством примеров оболочек в Интернете и моей средой.

ПРИМЕЧАНИЕ. Вы можете изменить это, выбрав: Окно -> Параметры -> Сценарий оболочки -> Интерпретаторы.

Инструкция по настройке

В пакете Debugger есть шаги по использованию _DEBUG.sh сценария для отладки сценария, который в основном (readme.txt):

  1. Создать проект сценария оболочки: Файл-> Создать -> Другое -> Сценарий оболочки -> Мастер проекта сценария оболочки .
  2. Создайте файл сценария Bash: Файл-> Создать -> Файл . Для этого примера это будет script.sh . Расширение должно быть ".sh" и является обязательным.
  3. Скопируйте файл _DEBUG.sh в папку проекта.
  4. Вставьте следующий текст в начало файла script.sh :

  5. Если файл создан в Microsoft Windows, то обязательно выполните File-> Convert Line Delimiters To -> Unix .

  6. Настройте конфигурацию запуска отладки: Run-> Debug Configurations -> Bash script . Здесь можно установить 2 поля:

    a) «Сценарий Bash:» - путь в рабочей области Eclipse к сценарию Bash для отладки.
    e) «Порт отладчика: 33333»

  7. Переключитесь на перспективу Debug. Запустите сеанс отладки. Запустите script.sh из оболочки Bash.

Интерфейс отладки bash

введите описание изображения здесь

Этот bash-отладчик обладает всеми функциями стандартных программных отладчиков, таких как:

  • Точка останова
  • Одна пошаговая операция
  • Функции Step-in, Step-out, Step-over и подпрограммы
  • Проверка кода или переменных в любой момент во время работы скрипта

Shelled (Shell редактор сценариев) IDE (Integrated Development Environment) имеет дополнительный бонус выполнения проверки контекста, выделяя и отступов при написании сценария. Если он не имеет правильного отступа, вы можете сразу же пометить / указать много ошибок там.

Favorite

Добавить в избранное

Главное меню » Linux » Как использовать команду Logger в Linux

Как использовать команду Logger в Linux

В операционных системах типа UNIX и Linux журнал представляет собой файл, в котором записывается каждое действие операционной системы. Каждый раз, когда пользователь входит в систему, он сохраняет запись в файле журнала. Это также позволяет пользователю добавлять в файл любое содержимое.

Синтаксис этой утилиты командной строки:

Как использовать команду logger с параметрами:

Распечатайте файл «syslog»:

Файл системного журнала играет важную роль в дистрибутивах Linux, поскольку он хранит все данные журнала в каталоге/var/log.

Чтобы просмотреть файл системного журнала в терминале, выполните следующую хвостовую команду:

Укажите строки системного журнала:

«Хвост» используется для захвата записи из файлов системного журнала и ее печати в терминале. По умолчанию при выполнении хвостовой команды печатаются последние 10 строк журнала файла. Но мы также можем указать количество строк журнала для печати:

Добавить лог в файл системного журнала:

Добавьте любой комментарий в файл системного журнала с помощью команды «logger», не передавая никаких опций.

Выполните команду «tail», чтобы распечатать его на терминале:

Записать команду «who»

Команду «logger» также можно использовать для добавления стандартного вывода любой команды. Введите «who» с помощью команды logger, чтобы добавить ее в файл системного журнала:

Отобразите его с помощью команды tail.

Указанный файл журнала:

Команда «logger» позволяет пользователю добавлять содержимое указанного файла в файл системного журнала, используя параметр «-f».

Создадим файл с именем test_file1.txt и добавим в него текст.

Теперь, чтобы распечатать файл журнала в терминале, выполните указанную команду:

В команде tail хвост -2 означает, что будут напечатаны две последние выходные строки. Но если вы хотите распечатать подробный вывод со всеми журналами, вам не нужно указывать количество строк. Читать 6 различных способов перечислить жесткие диски в Linux

Укажите размер журнала:

Некоторые логи могут быть длинными строками и ограничить их использованием опции «–size». Запустите упомянутую опцию «–size» следующим образом:

(В приведенной выше команде мы добавили случайные символы в журнал и отобразили только первые 12 символов, используя параметр размера. Tail -1 напечатает только последнюю строку результата отображения).

Игнорировать пустые строки:

Используйте опцию «-e», если файл содержит пустые строки. Он удалит пустые строки из файла и распечатает результат стандартным способом.

Например, добавьте несколько пустых строк в созданный нами текстовый файл.

Запустите опцию «-e» с именем файла «test_file1.txt», чтобы удалить пустые строки:

Показать справку:

Заключение:

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

В этой статье мы обсудили команду logger в Linux и изучили функциональность ее различных опций на нескольких примерах.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: