Запись файла журнала на c / c ++ - PullRequest
10 голосов
/ 13 сентября 2011

Я хочу написать файл журнала на C ++. Я обрабатываю определенные вещи, и поэтому мне нужно вести журнал свойств вещей, которые я обрабатываю, чтобы я мог вернуться к этому файлу журнала, чтобы увидеть свойства всего, что меня особенно интересует .. Может ли кто-нибудь помочь мне в достижении этого?

Ответы [ 6 ]

27 голосов
/ 13 сентября 2011

Стандартный метод ведения журнала (по моему опыту) - это использование потоков stdout или stderr.В C ++, чтобы использовать их, вам нужно будет включить iostream и использовать, как показано ниже:

#include <iostream>

int main(int argc, char* argv[])
{
  using std::cout;
  using std::cerr;
  using std::endl;

  cout << "Output message" << endl;
  cerr << "Error message" << endl;
}

Это, однако, обеспечивает печать только на те выходные данные, которые обычно заканчиваются на терминале.Если вы хотите использовать эти стандартные потоковые методы (которые вполне читабельны) для вывода в файл, то вам нужно как-то перенаправить вывод.Один из способов сделать это - использовать функцию freopen, предоставляемую cstdio.Для этого нужно открыть файл и переместить данный поток в этот файл.См. здесь для документации.Примером может быть:

#include <iostream>
#include <cstdio>

int main(int argc, char* argv[])
{
  using namespace std;
  freopen( "output.txt", "w", stdout );
  freopen( "error.txt", "w", stderr );

  cout << "Output message" << endl;
  cerr << "Error message" << endl;
}

(я изменил на using namespace std; там только для краткости.)

Вы перемещаете стандартный поток вывода stdout (который используетсяcout) в output.txt (в режиме записи), и вы перемещаете stderr (который используется cerr) в error.txt также в режиме записи.

Надеемся, что это тактрюк.

6 голосов
/ 21 октября 2017

Это очень удобно, просто подключите, например, какой-нибудь общий заголовочный файл, который будет вызываться из любой точки программы (лучше было бы создать класс с этими функциями)

inline string getCurrentDateTime( string s ){
    time_t now = time(0);
    struct tm  tstruct;
    char  buf[80];
    tstruct = *localtime(&now);
    if(s=="now")
        strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
    else if(s=="date")
        strftime(buf, sizeof(buf), "%Y-%m-%d", &tstruct);
    return string(buf);
};
inline void Logger( string logMsg ){

    string filePath = "/somedir/log_"+getCurrentDateTime("date")+".txt";
    string now = getCurrentDateTime("now");
    ofstream ofs(filePath.c_str(), std::ios_base::out | std::ios_base::app );
    ofs << now << '\t' << logMsg << '\n';
    ofs.close();
}

Использование: Logger ("Это сообщение журнала");Записывает файл (или добавляет существующий файл)

/somedir/log_2017-10-20.txt 

с содержимым:

2017-10-20 09:50:59 This is log message
6 голосов
/ 13 сентября 2011

То, что вы пытаетесь сделать, слишком глубоко, чтобы найти здесь на этом сайте исчерпывающее решение.Что вы можете сделать, это проверить документацию для библиотеки журналов по вашему выбору.В моем случае, это Boost.Log, библиотека для отслеживания библиотек Boost C ++ , документацию по которой можно найти здесь .

.страницы, на которую я только что ссылался

Эта библиотека не является официальной частью коллекции библиотек Boost, хотя она прошла проверку и предварительно принята.Результат обзора доступен здесь .

, так что делайте из этого то, что вы будете.

3 голосов
/ 13 сентября 2011

Почему бы не использовать одну из многих доступных сред ведения журналов, например Apache log4cxx ?Я бы посоветовал это вместо того, чтобы пытаться покататься самостоятельно - зачем изобретать велосипед?

0 голосов
/ 20 сентября 2011

Ну, спасибо за все ответы ... Я думаю, что ответ, который я искал, заключался в том, что даже формат файла журнала в UTF8, такой же, как у файла txt, так что у c не было бы проблем при написании такого файлас простой записью файла, которую он обеспечивает.

0 голосов
/ 14 сентября 2011

Вы также можете рассмотреть http://www.logog.org. Это ориентированная на производительность система логирования C ++. Однако, если это слишком сложно для вашего проекта, старый добрый cerr и cout отлично подойдут для этого.

...