powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Логирование событий
10 сообщений из 10, страница 1 из 1
Логирование событий
    #39674433
Ciplusor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может есть простой вариант как залогировать метод вызвавший событие или залогировать кусок трейса?

В интернетах либо "пиши все сам через шаблоны и кучу кода" либо предлагают в каждый метод добавлять константу описывающую имя этого метода что вообще ахтунг.

Сейчас примерно так как в спойлере, таких юнитов довольно приличное количество. Меня не напрягает каждый раз кроме имени событии добавлять __func__, __FILE__; чтобы потом точно знать где клиент передает на сервер некорректные данные, но может есть вариант попроще и не передавать эти параметры, а использовать что-то другое?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
  void TShipsControlConstruct::Player(TPlanet * APlanet, TShipType::E AShipType, int ACount, Globals::TPlayer * APlayer)
    {
        // Нельзя строить непонятное количество юнитов
        if (ACount <= 0)
        {
            TEngine::Log->Write("Count", __func__, __FILE__);
            return;
        }
        // Нельзя строить если планета в бою
        if (APlanet->Timer[TPlanetTimer::Battle])
        {
            TEngine::Log->Write("Battle", __func__, __FILE__);
            return;
        }
        // Нельзя строить если технология закрыта
        if (APlayer->PlanetarProfile->Tech(AShipType, TShipTech::Active)->Value == 0)
        {
            TEngine::Log->Write("Tech", __func__, __FILE__);
            return;
        }
        // Определим параметры будущего юнита
        bool TmpStationary = APlayer->PlanetarProfile->Tech(AShipType, TShipTech::Stationary)->Supported;
        // Проверка постройки нестационарнго флота
        if (!APlanet->IsManned())
        {
            // Нельзя строить на чужой планете
            if (!APlanet->Owner->IsRoleFriend(APlayer))
            {
                TEngine::Log->Write("Role", __func__, __FILE__);
                return;
            }
            // На нежилых можно строить только стационарки
            if (!TmpStationary)
            {
                TEngine::Log->Write("Manned", __func__, __FILE__);
                return;
            }
        }
        // На жилых не стационарный флот можно строить только если есть верфь
        if ((!TmpStationary)
            && (!true/*APlanet->Constructors->ContainsKey(APlayer)*/))
        {
            TEngine::Log->Write("Shipyard", __func__, __FILE__);
            return;
        }
        // Иначе построим кораблик
        Execute(APlanet, AShipType, ACount, APlayer);
    }

Функция записи пока самая примитивная
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	void TLog::Write(string AMessage, string AMethod, string AFile)
	{
		string TmpMessage = DateTme(false) + " | " + AMethod + " | " + AMessage + " | " + AFile;
		fwrite(&TmpMessage[0], sizeof(char), TmpMessage.size(), FFile);
		fflush(FFile);
                #ifndef NDEBUG
		std::cout << TmpMessage;
                #endif
	}
...
Рейтинг: 0 / 0
Логирование событий
    #39674438
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод на макрос замени
Код: plaintext
1.
#define write(X) real_write(X, __FILE__, __LINE__)


PS Не уверен что с методом такой фокус пройдет, если нет - сделай функциями.
...
Рейтинг: 0 / 0
Логирование событий
    #39674440
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CiplusorФункция записи пока самая примитивная

Передача string по значению. Забавный способ получить тормоза на ровном месте.

Используй осмысленные сообщения, лог потом читать будет проще. Но таки да, их придётся
набирать ручками, каждое индивидуально. У меня лог пишется такой функцией:
Код: sql
1.
2.
3.
4.
namespace Log
{
	void Write(const char* const fmt, ...) __attribute__((format(gnu_printf, 1, 2)));
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Логирование событий
    #39674444
Ciplusor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо, даже не подозревал что можно сделать макрос на заранее не созданный объект :) прописал в stdafx.h и вроде везде подхватилось
Код: plaintext
1.
2.
3.
#include "Engine.h"

#define Log(AMessage) TEngine::Log->Write(AMessage, __func__, __FILE__, __LINE__)
...
Рейтинг: 0 / 0
Логирование событий
    #39674446
Ciplusor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПередача string по значению. Забавный способ получить тормоза на ровном месте.
Только учусь, читал что нативные типы можно передавать по значению, объекты по ссылке / указателю, но со строками пока очень все мутно, со временем разберусь :)
...
Рейтинг: 0 / 0
Логирование событий
    #39674733
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в boost.log кажется есть возможность выводить вместе со строкой и прочими атрибутами в лог.
...
Рейтинг: 0 / 0
Логирование событий
    #39675055
Ciplusor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал множество вариантов, перечитал много форумов - если обобщить, то получается что программу нужно писать либо в си стиле либо в с++, смешивание мол очень плохой тон. У вас в коде
Код: plaintext
1.
void Write(const char* const fmt, ...) 

получается си вариант передачи строк, что подразумевает что вы используете какие-то свои алгоритмы по работе со строками, не пользуя std::string.

С одной стороны - std::string очень удобно в плане конкатенации. С другой - почти все функции требуют вызова std::string.c_str() или как я понял альтернативе &std::string[0].

У себя я тоже столкнулся с тем, что в языке передача Log("TestString") - const char*, а вот если я захочу добавить к ней какой-то свой параметр, то выйдет Log("TestString" + std::string MyString) - string. И получается что для разных вариантов строк нужны разные методы логирования, либо отказаться в проекте от std::string и пользоваться char*.

Строк в принципе очень мало, только хранение и передача, но на всякий случай - так как грамотно поступить чтобы тот кто потом читал код не сказал "ну и каша с типами данных"? :)
...
Рейтинг: 0 / 0
Логирование событий
    #39675770
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ciplusor,

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

Nanolog, log4cxx -- дофига их.
...
Рейтинг: 0 / 0
Логирование событий
    #39675772
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CiplusorDimitry SibiryakovПередача string по значению. Забавный способ получить тормоза на ровном месте.
Только учусь, читал что нативные типы можно передавать по значению, объекты по ссылке / указателю, но со строками пока очень все мутно, со временем разберусь :)

Не парься, там не очень и сильно замедлится.
...
Рейтинг: 0 / 0
Логирование событий
    #39675782
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал множество вариантов, перечитал много форумов - если обобщить, то получается что программу нужно писать либо в си стиле либо в с++, смешивание мол очень плохой тон.

Бредятина. Надо писать так, как надо писать.

Код: plaintext
1.
void Write(const char* const fmt, ...) 

получается си вариант передачи строк, что подразумевает что вы используете какие-то свои алгоритмы по работе со строками, не пользуя std::string.

Тут нет строк.


Строк в принципе очень мало, только хранение и передача, но на всякий случай - так как грамотно поступить чтобы тот кто потом читал код не сказал "ну и каша с типами данных"? :)

Да ты очень много внимания уделяешь такой малости.

Вообще, возьми готовый логгер лучше.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Логирование событий
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]