14

OpenTibia Serverを Debian 用にパッケージ化する予定です。私がやりたいことの 1 つは、プロセス/etc/init.dのデーモン化によるスタートアップを追加することです。otserv

おそらく、出力を syslog にリダイレクトする必要があります。これは通常、syslog()関数を介して行われます。現在、コードには次のものが群がっています。

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

std::cout や友人へのすべての「呼び出し」を置き換えることなく、標準出力と標準エラー出力を syslog にリダイレクトする適切で簡単に追加できる方法はありますか?

4

5 に答える 5

22

次のコマンドstdoutを使用してパイプすることができます。sysloglogger

名前

 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

于 2009-03-20T09:50:12.493 に答える
5

rdbuf() コマンドを使用して、C++ の任意のストリームをリダイレクトできます。これを実装するには少し複雑ですが、それほど難しくはありません。

overflow() で syslog に出力する streambuf を作成し、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;
 }
于 2009-03-20T10:50:33.377 に答える
4

まっすぐな「C」の答えで十分かどうかはわかりません。ただし、「C」では、基盤となるstdio機能を使用して、「ロガー」プロセスを介さずに(FILE *)をsyslog呼び出しに直接プラグインできます。http://mischasan.wordpress.com/2011/05/25/redirecting-stderr-to-syslog/をチェックして ください

于 2011-10-22T06:02:06.230 に答える
2

stdout と stderr を読み取るだけの適切なスクリプトでバイナリの実行をラップし、syslog(). これは、ラップされたアプリケーションのコードを変更しなくても機能し、非常に簡単です。

パイプする既存のスクリプトがあるかどうかはわかりませんが、そうでない場合でもスクリプトを書くのは難しくありません。

于 2009-03-20T09:49:46.283 に答える
1

これを行うコードをいくつか書きました。syslog の代わりに ASL を使用しており、kevents を使用しているため、システムの別の API に移植する必要がある場合があります (ASL の代わりに syslog を使用し、kevent の代わりに poll/select を使用します)。

http://cgit.freedesktop.org/xorg/app/xinit/tree/launchd/console_redirect.c

さらに、基本的にこれを Mountain Lion の libsystem_asl に追加しました。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;
}
于 2011-04-26T20:40:12.727 に答える