Перенаправьте станд. C++:: засоритесь к системному журналу на Unix

Я работаю над Unix на программе C++, которые отправляют сообщения в системный журнал.

Текущий код использует системный вызов системного журнала, который работает как printf.

Теперь я предпочел бы использовать поток с этой целью вместо этого, обычно встроенный станд.:: помеха. Но помеха просто перенаправляет вывод к stderr, не к системному журналу, и это бесполезно для меня, поскольку я также использую stderr и stdout для других целей.

Я видел в другом ответе, что довольно легко перенаправить его в файл с помощью rdbuf (), но я не вижу способа применить тот метод для вызова системного журнала, поскольку openlog не возвращает обработчик файлов, я мог использовать для связи потока на нем.

Там другой метод должен сделать это? (выглядит довольно основным для программирования Unix)?

Править: Я ищу решение, которое не пользуется внешней библиотекой. То, что предлагает @Chris, могло быть хорошим началом, но все еще немного неопределенно для становления принятым ответом.

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

Соединение с внешней библиотекой возможно, но является также беспокойством, поскольку это - код GPL. Зависимости являются также нагрузкой, поскольку они могут конфликтовать с другими компонентами, не быть доступными на моем дистрибутиве Linux, представить сторонние ошибки и т.д. Если это - единственное решение, я могу рассмотреть полностью избегающие потоки... (жалость).

26
задан Community 23 May 2017 в 11:47
поделиться

1 ответ

Вы можете определить потоковый файл, который вызывает 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.

13
ответ дан 28 November 2019 в 06:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: