Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Логирование событий / 10 сообщений из 10, страница 1 из 1
16.07.2018, 12:07
    #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
16.07.2018, 12:16
    #39674438
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование событий
Метод на макрос замени
Код: plaintext
1.
#define write(X) real_write(X, __FILE__, __LINE__)


PS Не уверен что с методом такой фокус пройдет, если нет - сделай функциями.
...
Рейтинг: 0 / 0
16.07.2018, 12:25
    #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
16.07.2018, 12:30
    #39674444
Ciplusor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование событий
Большое спасибо, даже не подозревал что можно сделать макрос на заранее не созданный объект :) прописал в stdafx.h и вроде везде подхватилось
Код: plaintext
1.
2.
3.
#include "Engine.h"

#define Log(AMessage) TEngine::Log->Write(AMessage, __func__, __FILE__, __LINE__)
...
Рейтинг: 0 / 0
16.07.2018, 12:31
    #39674446
Ciplusor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование событий
Dimitry SibiryakovПередача string по значению. Забавный способ получить тормоза на ровном месте.
Только учусь, читал что нативные типы можно передавать по значению, объекты по ссылке / указателю, но со строками пока очень все мутно, со временем разберусь :)
...
Рейтинг: 0 / 0
17.07.2018, 01:12
    #39674733
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование событий
в boost.log кажется есть возможность выводить вместе со строкой и прочими атрибутами в лог.
...
Рейтинг: 0 / 0
17.07.2018, 14:16
    #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
18.07.2018, 16:44
    #39675770
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование событий
Ciplusor,

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

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

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

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

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

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

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


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

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

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


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