Где программы пользовательского пространства должны сохранять свои журналы?

23

Я пишу скрипт, который хочу запускать без привилегий. Я хочу, чтобы ошибки, с которыми сталкивается скрипт, регистрировались в каком-либо файле журнала. У меня нет привилегий, чтобы написать один /var/log. И я не хочу иметь один в моем домашнем каталоге.

Есть ли место, где пользовательские сценарии могут регистрировать информацию времени выполнения? Как лучше всего получать информацию из журнала сценариев, /var/logне создавая при этом никаких потенциальных проблем с безопасностью? Я не решаюсь установить UID / GID на сценарий.

Лорд лох
источник

Ответы:

8

Вы не можете писать в / var / log как обычный пользователь, но демон syslog сделает это за вас, если вы спросите. Если вы хотите записывать сообщения в стандартные системные журналы (например /var/log/syslog), утилита 4.4BSD loggerможет быть доступна в вашей системе. Он установлен по умолчанию в Debian и входит в bsdutilsпакет производных от Debian.

Вы получите преимущество от любых существующих инструментов ротации, обслуживания и мониторинга журналов, а также от недостатка прав на чтение системных журналов и смешивания сообщений вашего скрипта с сообщениями других программ.

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

Есть несколько вариантов конфигурации; Вы можете прочитать больше в man logger.

Jander
источник
есть ли языковые привязки для этой утилиты? Скорее не будет создавать подпроцессы для каждой строки стандартного вывода в приложении.
ThorSummoner
@ThorSummoner: Как говорится в ответе Жиля, syslogэто подпрограмма библиотеки C, и C ++ может вызывать любой C, используя extern "C". Другие языки часто обеспечивают либо общую привязку к чему-либо C, либо привязку к конкретным вещам, но это зависит от языка.
dave_thompson_085
12

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

Если программа выполняется как часть системы и работает как обычно выделенный системный пользователь, то естественным местом для ее журналов является /var/log. Создайте подкаталог /var/log/myappи предоставьте ему соответствующие разрешения, чтобы ваше приложение могло писать туда.

Если это уместно и ваша операционная система позволяет, пометьте файл журнала как доступный только для добавления. Только root может сделать это. Это имеет то преимущество, что если ваше приложение взломано, оно не сможет стереть прошлые журналы, что может быть очень полезно для криминального анализа компрометации. Вам потребуется вмешательство пользователя root для поворота журнала: chownчтобы файл журнала больше не мог быть открыт приложением, renameфайл журнала, создайте новый файл только для добавления с соответствующим владельцем, а затем уведомите приложение, чтобы открыть новый пустой файл. ,

Вы можете внести любой журнал приложений в системные журналы, позвонив logger(1)или syslog(3).

Жиль "ТАК - перестань быть злым"
источник
4

Как правило, для демона файл журнала создается, а rootзатем изменяются разрешения, так что непривилегированный пользователь может писать в него. logrotateЗатем устанавливается для сохранения разрешений во время вращения.

Если это команда, а не демон, войдите в систему /tmp(желательно используя mktemp) и сообщите пользователю, через STDOUTчто прошел журнал.

bahamat
источник
Отличная идея. В моем ~ / .profile есть несколько строк, которые проверяют, запущен ли демон dropbox, и запускают его, если это не так. Я думал о добавлении, &чтобы не задерживать приглашение, но при запуске записи dropbox в консоль. В настоящее время я перенаправляю его вывод на /dev/null, но хотел бы иметь какой-то способ отладки, если не запускается dropbox.
Лорд Ло.
1
Проверьте daemonize.
Багамат
Просто чтобы знать, «разрешения изменены, так что непривилегированный пользователь может писать в него». это делается просто chmod 666? или мне нужно добавить пользователя в группу или что-то в этом роде?
Лорд Ло.
Лучше под / var / tmp, / tmp не гарантированно выжить при загрузке.
vonbrand
@LordLoh .: Да, с chmod. Обычно 0644или 0664и владелец пользователя / группы также изменяется на владельца демона, который, как ожидается, будет писать в него.
Багамат
3

У меня сложилось впечатление, что программы в пространстве пользователя по умолчанию отбрасывают журналы. Я видел, как различные программы снимают журналы, где бы они ни чувствовали, и это никогда не приветствовалось в моих системах; склонность к наращиванию в каком-то месте, которое никогда не замечают, если / пока оно не станет огромным.

Я бы предпочел, если бы для них было определенное место, я играю в своей системе, пытаясь найти для них стабильное место.

Моей первой идеей было использование /var/run/user/$UID/log, но я обнаружил, что в моей системе это монтирование TMPFS, недостаточно большое или действительно хорошее для использования с журналами.

Создать место для них

Поскольку я недостаточно хорошо понимаю / var / run / user, чтобы интегрироваться с ним, я решил эмулировать его вручную, для пользователя 1000.

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

Я бы порекомендовал придерживаться FHS / var / log spc для структуры в этой папке, но в свободной форме спецификации, так что не так много, чтобы соответствовать.

Logrotate Config

В данном каталоге нет чередования журналов, предоставляемого вашей системой, я рекомендую создать один для вашей системы:

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

Ниже мой предыдущий пост / var / run / user / 1000 / log, я не могу рекомендовать его, если вы действительно не знаете, что делаете (и если да, то скажите мне, как это сделать!)

может быть, как следует, но я просто сделал это, потому что это имело смысл для меня.

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

Интеграция с / var / log / user / 1000:

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

ThorSummoner
источник