Я работаю над Unix на программе C++, которые отправляют сообщения в системный журнал.
Текущий код использует системный вызов системного журнала, который работает как printf.
Теперь я предпочел бы использовать поток с этой целью вместо этого, обычно встроенный станд.:: помеха. Но помеха просто перенаправляет вывод к stderr, не к системному журналу, и это бесполезно для меня, поскольку я также использую stderr и stdout для других целей.
Я видел в другом ответе, что довольно легко перенаправить его в файл с помощью rdbuf (), но я не вижу способа применить тот метод для вызова системного журнала, поскольку openlog не возвращает обработчик файлов, я мог использовать для связи потока на нем.
Там другой метод должен сделать это? (выглядит довольно основным для программирования Unix)?
Править: Я ищу решение, которое не пользуется внешней библиотекой. То, что предлагает @Chris, могло быть хорошим началом, но все еще немного неопределенно для становления принятым ответом.
Править: использование Повышения. IOStreams в порядке, поскольку мой проект уже использует Повышение так или иначе.
Соединение с внешней библиотекой возможно, но является также беспокойством, поскольку это - код GPL. Зависимости являются также нагрузкой, поскольку они могут конфликтовать с другими компонентами, не быть доступными на моем дистрибутиве Linux, представить сторонние ошибки и т.д. Если это - единственное решение, я могу рассмотреть полностью избегающие потоки... (жалость).
Вы можете определить потоковый файл, который вызывает syslog. Например:
// Pseudo-code
class syslog_streambuf : public streambuf {
private:
void internal_log(string& log) {
syslog(..., log, ...);
}
public:
int sputc ( char c ) {
internal_log(...);
}
streamsize sputn ( const char * s, streamsize n ) {
internal_log(...);
}
}
тогда вы можете просто написать следующее для перенаправления clog:
clog.rdbuf( new syslog_streambuf );
Есть еще несколько функций, которые вам, вероятно, придется переопределить, вот хорошая ссылка на streambuf api.