Несколько приложений пишут в одну консоль - смешанный / смешанный вывод - PullRequest
0 голосов
/ 16 января 2012

У меня есть следующая системная архитектура (не может быть изменена - устаревший код): одно основное приложение вызывает одно или несколько других приложений, и эти приложения взаимодействуют по протоколу IP.

Все приложения пишут в одно консольное окно. К сожалению, вывод консоли может испортиться (один символ из приложения 1, следующий символ из приложения 2, следующий символ из приложения 4 и т. Д.). Все приложения пишут в консоль через один Logger.dll (предоставляет функции статического ведения журнала), используя cout / cerr.

Есть ли способ, как я могу предотвратить смешанные сообщения журнала в этой настройке?

Заранее спасибо.

РЕДАКТИРОВАТЬ код добавлен:

void Logger::Log(const std::string & componentName, const std::string & Text, LogLevel logLevel, bool logToConsole, bool beep) 
{   
    std::ostringstream stream;

    switch (logLevel)
    {   
        case LOG_INFO:

            if (logToConsole) 
            {
                 stream << componentName << ": INFO " << Text;
                 mx_console.lock(); // this is a static boost::mutex
                 std::cout << stream.str() << std::endl;
                 std::cout.flush();
                 mx_console.unlock();
            }
            break;

       case LOG_STATUS: 

            stream << componentName << ": STATUS " << Text;
            mx_console.lock();
            std::cout << stream.str() << std::endl;
            std::cout.flush();
            mx_console.unlock();
            break;

       case LOG_WARNING:

            stream << componentName << ": WARNING " << Text;
            mx_console.lock();
            std::cout << stream.str() << std::endl;
            std::cout.flush();
            mx_console.unlock();
            break;

       default:;
     }

    if (beep)
         Beep( 500, 50 ); 
}

Ответы [ 3 ]

0 голосов
/ 16 января 2012

Системный журнал может быть решением для вас, поскольку он предназначен для обработки журналов из разных мест.Системный журнал разработан для Unix, но этот ответ показывает версии для Windows.

Вы можете изменить свой регистратор, чтобы записывать в системный журнал вместо консоли.

0 голосов
/ 16 января 2012

Я заменил теперь все

std::cout << stream.str();

заявления с

std::string str = stream.str();
printf(str.c_str());

и теперь вывод больше не испорчен символьно. Но у меня нет хорошего объяснения этому поведению, кто-нибудь знает почему?

0 голосов
/ 16 января 2012

Поскольку у вас есть отдельная функция ведения журналов, вы можете как минимум использовать какую-то блокировку (глобальный мьютекс и т. Д.), Чтобы избежать чрезмерного распределения сообщений из разных приложений.Чтобы сделать его более читабельным и понятным, добавьте некоторую идентифицирующую информацию, такую ​​как имя процесса или PID.Обтекание файла Logger.dll вокруг существующей библиотеки журналов также звучит как опция.

В качестве альтернативы, вы можете использовать функции журналирования, просто перенаправляя сообщения в основное приложение и позволяя сортировать синхронизацию и перемешивание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...