Можно ли отправить сообщение, созданное perror(), в /var/log/syslog?

Я использую perror() для печати сообщений об ошибках, например:

pid = fork();
if (pid < 0) {
    perror("couldn't fork");
    exit(EXIT_FAILURE);
}

Можно ли использовать errno/perror() средства, но направлять созданные сообщения в системный журнал (/var/log/syslog)?

Я спрашиваю об этом в контексте программы, которая может работать как в режиме демона, так и в режиме без демона. В режиме демона сообщения perror() не отображаются в системном журнале.


person João M. S. Silva    schedule 11.12.2015    source источник
comment
проверьте в начале кода текущий режим. Затем напишите небольшую функцию, которая принимает строку в качестве параметра и либо вызывает perror(), либо вызывает syslog() в зависимости от текущего режима, установленного ранее в программе.   -  person user3629249    schedule 12.12.2015


Ответы (3)


Используйте strerror, чтобы получить сообщение об ошибке на основе кода ошибки, не печатая его. Затем передайте его syslog, как и любое другое сообщение журнала:

syslog(LOG_ERR, "Couldn't fork: %s", strerror(errno));
person user253751    schedule 11.12.2015

Самый простой способ — перенаправить stderr (и, возможно, stdout) при вызове вашей программы. Например: ./myprog 2>&1 | logger.

person paulsm4    schedule 11.12.2015
comment
Спасибо, но я хотел бы сделать это правильно, то есть использовать код, специфичный для демонов (форк и т. д.) и syslog(). - person João M. S. Silva; 11.12.2015
comment
Использование перенаправления, например, в сценарии оболочки или в записи cron, ЯВЛЯЕТСЯ правильным способом в подавляющем большинстве случаев. Если вы хотите вести журнал программно, обратитесь к man syslog. И если вы хотите перенаправить (stderr, файл № 2), используйте dup2: stackoverflow.com/questions/14543443/ . И если вы хотите, чтобы текст ошибки не зависел от вызова perror(), тогда man strerror. - person paulsm4; 11.12.2015
comment
Я использую syslog(). Что я хотел бы сделать, так это спрячь syslog() с errno/perror(). - person João M. S. Silva; 11.12.2015
comment
Тогда похоже, что strerror() может быть вашим парнем :) - person paulsm4; 11.12.2015

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

person user_ABCD    schedule 11.12.2015
comment
Требования заключаются в том, что я хотел бы использовать функции errno и perror(). errno устанавливается на соответствующий номер ошибки в случае сбоя системного вызова, а perror() печатает соответствующее сообщение об ошибке. - person João M. S. Silva; 11.12.2015
comment
Если он не работает от имени пользователя root, у него не будет прав на запись непосредственно в системный журнал. Все должно быть отправлено через функцию syslog(). - person Barmar; 11.12.2015