Перенаправление стандартного вывода в syslog
Я планирую пакет OpenTibia Server для Debian. Одна из вещей, которую я хочу сделать, - добавить запуск через /etc/init.d
и демонтировать процесс otserv
.
Дело в том, что мы должны перенаправить вывод в syslog. Обычно это делается с помощью функции syslog()
. В настоящее время код заполняется с помощью:
std::cout << "Stuff to printout" << std::endl;
Есть ли правильный, простой в использовании способ перенаправления стандартного вывода и стандартного вывода ошибок в syslog без замены каждого "вызова" на std:: cout и друзей?
Ответы
Ответ 1
Не уверен, достаточно ли прямого ответа "С"; но в "C" вы можете использовать базовые функции stdio для подключения (FILE *) непосредственно к вызовам syslog без промежуточного процесса "регистрации". Проверять, выписываться
http://mischasan.wordpress.com/2011/05/25/redirecting-stderr-to-syslog/
Ответ 2
Вы можете передать ваш stdout
в syslog
командой logger
:
NAME
logger - a shell command interface to the syslog(3) system log module
СИНТАКСИС
logger [-isd] [-f file] [-p pri] [-t tag] [-u socket] [message ...]
ОПИСАНИЕ
Logger makes entries in the system log. It provides a shell command
interface to the syslog(3) system log module.
Если вы не укажете сообщение в командной строке, оно будет читать stdin
Ответ 3
Вы можете перенаправить любой поток на С++ с помощью команды rdbuf(). Это немного запутанно, но не так сложно.
Вам нужно написать streambuf, который будет выводиться в syslog при переполнении(), и заменить std:: cout rdbuf на ваш streambuf.
Пример, который будет выводиться в файл (без обработки ошибок, непроверенный код)
#include <iostream>
#include <fstream>
using namespace std;
int main (int argc, char** argv) {
streambuf * yourStreamBuffer = NULL;
ofstream outputFileStream;
outputFileStream.open ("theOutputFile.txt");
yourStreamBuffer = outputFileStream.rdbuf();
cout.rdbuf(yourStreamBuffer);
cout << "Ends up in the file, not std::cout!";
outputFileStream.close();
return 0;
}
Ответ 4
Попробуйте выполнить выполнение двоичного файла с помощью подходящего script, который просто считывает stdout и stderr и отправляет любые данные, считанные с них, используя syslog()
. Это должно работать без каких-либо изменений кода в завернутом приложении и быть довольно простым.
Не уверен, что есть существующие скрипты для ввода в трубку, но писать не нужно, если не нужно.
Ответ 5
Я только что написал код, который сделает это. Он использует ASL вместо syslog и использует kevents, поэтому вам может потребоваться перенести его в различные API для вашей системы (syslog вместо ASL и poll/select вместо kevent)
http://cgit.freedesktop.org/xorg/app/xinit/tree/launchd/console_redirect.c
Кроме того, я в основном добавил это в libsystem_asl на Mountain Lion. Проверьте man-страницу для asl_log_descriptor.
Пример:
#include <asl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
asl_log_descriptor(NULL, NULL, ASL_LEVEL_INFO, STDOUT_FILENO, ASL_LOG_DESCRIPTOR_WRITE);
asl_log_descriptor(NULL, NULL, ASL_LEVEL_NOTICE, STDERR_FILENO, ASL_LOG_DESCRIPTOR_WRITE);
fprintf(stdout, "This is written to stdout which will be at log level info.");
fprintf(stderr, "This is written to stderr which will be at log level notice.");
return 0;
}