2009-03-20 3 views
14

Я планирую пакет OpenTibia Server для Debian. Одна из вещей, которую я хочу сделать, - добавить запуск с помощью /etc/init.d и демонизацию процесса otserv.Перенаправление стандартного вывода в syslog

Дело в том, что мы должны перенаправить вывод в syslog. Обычно это делается с помощью функции syslog(). В настоящее время код кишел:

std::cout << "Stuff to printout" << std::endl; 

Есть ли собственно, легко добавить, способ перенаправить стандартный вывод и стандартный вывод ошибок в системный журнал, не заменяя каждый «вызов» STD :: COUT и друг?

ответ

4

Не уверен, достаточно ли прямая "C" ответ; но в «C» вы можете использовать базовые функции stdio для подключения (FILE *) непосредственно к вызовам syslog без промежуточного процесса «регистрации». Откажитесь от http://mischasan.wordpress.com/2011/05/25/redirecting-stderr-to-syslog/

+1

Вот оно. Было бы здорово, если бы вы также вставляли части своего сообщения;) –

+1

вряд ли переносится, и это не стандарт POSIX – Alnitak

+0

@Ivan: вставка ссылки происходит быстрее, чем вставка статьи. Я не получаю доход от вас, нажав на ссылку моего блога :-) – Mischa

2

Попробуйте выполнить выполнение двоичного файла с помощью подходящего скрипта, который просто считывает stdout и stderr, и отправляет любые данные, считанные с них, с использованием syslog(). Это должно работать без каких-либо изменений кода в завернутом приложении и быть довольно простым.

Не уверен, что существуют существующие скрипты, но писать не следует, если это не так.

+0

, который выглядит как очень портативное решение, поэтому это позволит нам иметь только две ошибки журнала и информацию, у linux syslog больше лог-уровней. Но если мы можем выдержать этот небольшой недостаток, вот сообщение, показывающее, как это сделать: http://unix.stackexchange.com/questions/124455/linux-how-to-redirect-stdout-stderr-to-logger –

21

Вы можете трубы ваш stdout в syslog с logger команды:

ИМЯ

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

5

Вы можете перенаправить поток в C++ с помощью команды 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; 
} 
+0

Почти Однако, что я искал, «logger» предоставляет мне дополнительную информацию, особенно если я просто создаю скрипт bash bash. Однако, спасибо за информацию, и мне очень жаль, что я не могу отметить оба ответа как Ответы (tm). –

1

Я просто написал код, который будет делать это. Это используя ASL вместо системного журнала, и это с помощью kevents, так что вам, возможно, придется портировать его на различную API-интерфейсы для вашей системы (системный журнал вместо ASL и опроса/выбор вместо 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; 
}