PDA

Просмотр полной версии : [Мануал] Логи



Son of the Moon
18.08.2016, 20:29
Доброе время суток.
Пишу в свой мод систему логов, решил поделится мало-ли кому-то нужно будет.

В конец мода или же туда, куда будет удобно вам.


stock Logs(log[], string[])
{
new File: LogFile, str[128], day, month, year, hour, minute, second; // переменные на время/дату и остальное
getdate(year, month, day); // узнаем дату
gettime(hours, minute, second); // узнаем время
if(fexist(log)) LogFile = fopen(log, io_append); // если файл есть, открываем, пишем.
else LogFile = fopen(log, io_write); // если файла нет, создаем, пишем.
format(str, sizeof(str), "[Дата: %d/%d/%d | Время: %d:%d:%d] %s\r\n", day, month, year, hour, minute, second, string); // сам текст
for(new f; f < strlen(str); f++) // цикл
{
fputchar(LogFile, str[f], false); // запись в файл
}
fclose(LogFile); // Закрываем файл
return true;
}

Пример использования:


public OnGameModeInit()
{
Logs("Logs/server_log.log", "Сервер включен."); // куда пишем | текст для записи в лог
return true;
}

public OnGameModeExit()
{
Logs("Logs/server_log.log", "Сервер отключен."); // куда пишем | текст для записи в лог
return true;
}


Вот, пожалуй на этом все.

Автор: Son of the Moon

ziggi
19.08.2016, 01:42
Для логов лучше воспользоваться специальным плагином (http://forum.sa-mp.com/showthread.php?t=603175), который обеспечивает запись логов в отдельном от сервера потоке.

TheMallard
21.08.2016, 10:17
Этим кодом еще в 2012 пользовались. Лучше использовать базу данных для записи логов.

Son of the Moon
21.08.2016, 15:04
Этим кодом еще в 2012 пользовались. Лучше использовать базу данных для записи логов.
Хах, ты хочешь сказать что если я буду писать мод на файлах, из за логов я поставлю MySQL и логи писать в базу буду?

vovandolg
21.08.2016, 19:43
В бд надо хранить много разной отдельной инфы чтобы был толк от её чтения, а на файлах короткие строки типо логов,
но опять же на файлах будет всё быстрее и тут вывод зачем в бд выводить логи если это медленно и совсем не нужно:declare:
Когда можно просто открыть файл подобный server_log.txt и читать/листать его в блокноте-_- а?

Sp1ke
21.08.2016, 20:14
В бд надо хранить много разной отдельной инфы чтобы был толк от её чтения, а на файлах короткие строки типо логов,
но опять же на файлах будет всё быстрее и тут вывод зачем в бд выводить логи если это медленно и совсем не нужно:declare:
Когда можно просто открыть файл подобный server_log.txt и читать/листать его в блокноте-_- а?

Пруф, что файлы быстрей, а БД медленней? Если ты пишешь о скорости работы, то будь добр свои тесты...
А как же на счет тех ситуациях, что в проекте может быть вывод банов/варнов и прочих действий на главной странице сайте/ЛК/админ панели?

vovandolg
21.08.2016, 20:43
Пруф, что файлы быстрей, а БД медленней? Если ты пишешь о скорости работы, то будь добр свои тесты...
А как же на счет тех ситуациях, что в проекте может быть вывод банов/варнов и прочих действий на главной странице сайте/ЛК/админ панели?

Запись в файл и в бд разная и файлы выигрывают это уже не раз обсуждали да и логически разбери оба запроса и посмотри что из чего состоит:acute:

Daniel_Cortez
21.08.2016, 20:46
Запись в файл и в бд разная и файлы выигрывают это уже не раз обсуждали да и логически разбери оба запроса и посмотри что из чего состоит:acute:
Запись в БД (MySQL) можно вынести в отдельный поток, чтобы не мешать серверу заниматься другими делами. С файлами такое можно сделать только с помощью плагина, который выше предложил ziggi. Стандартные функции работы с БД SQLite вообще в пролёте.

Son of the Moon
21.08.2016, 21:58
Вот мне просто интересно, если ты знаешь что лучше и как, при этом советуешь остальным, пишешь в коменты, почему бы просто не написать [Мануал/Урок] по использованию MySQL описать конкретнее, хотя бы вывод в отдельный поток. от того что ты написал здесь, легче стало не многим, многие вообще в MySQL не то что бы написать мод, базу подключить не смогут. Да и не все же пишут MySQL мод, некоторые принципиально пишут вообще на стандарте a_samp, a_file и т д.

Daniel_Cortez
21.08.2016, 22:24
Вот мне просто интересно, если ты знаешь что лучше и как, при этом советуешь остальным, пишешь в коменты, почему бы просто не написать [Мануал/Урок] по использованию MySQL описать конкретнее, хотя бы вывод в отдельный поток. от того что ты написал здесь, легче стало не многим, многие вообще в MySQL не то что бы написать мод, базу подключить не смогут. Да и не все же пишут MySQL мод, некоторые принципиально пишут вообще на стандарте a_samp, a_file и т д.
По использованию MySQL здесь уже есть урок (http://pro-pawn.ru/showthread.php?10548). То, что сервер SA-MP работает в одном потоке, тоже давно не секрет (http://pro-pawn.ru/showthread.php?8775), а понятия "процесс" и "поток" изучаются в школьном курсе информатики.

vovandolg
21.08.2016, 23:55
Запись в БД (MySQL) можно вынести в отдельный поток, чтобы не мешать серверу заниматься другими делами.

Это как? Можно пример?

Desulaid
22.08.2016, 00:17
for(new f; f < strlen(str); f++) // цикл


Правда?

#enotya
23.08.2016, 01:37
Правда?

Не поверишь, но да, правда:yahoo:

Saibot
23.08.2016, 02:17
Не поверишь, но да, правда
При каждой итерации будет вызвана функция strlen (кол-во итерация завесит от длины строки, функция вернет её в целочисленном числе).
Лучше то, число которое вернет функция, записать в переменную и потом итерировать переменную вместо функции.

for(new f, s = strlen(str); f < s; f++)

Desulaid
23.08.2016, 02:47
При каждой итерации будет вызвана функция strlen (кол-во итерация завесит от длины строки, функция вернет её в целочисленном числе).
Лучше то, число которое вернет функция, записать в переменную и потом итерировать переменную вместо функции.

for(new f, s = strlen(str); f < s); f++)

Можно вообще не узнавать длину строки.


new i;
while (str[i] != '\0')
{
i++;
}

DeimoS
23.08.2016, 21:37
Можно вообще не узнавать длину строки.


new i;
while (str[i] != '\0')
{
i++;
}

Обращение к ячейке массива дольше, нежели к переменной, ко-ко-ко. Как же оптимизация?

И да, не проще ли так?

for(new i; str[i] != '\0'; i++)
{

}
Видь for быстрее while)))0000)) Аптимизация :blum3:

Desulaid
23.08.2016, 22:59
Обращение к ячейке массива дольше, нежели к переменной, ко-ко-ко. Как же оптимизация?

И да, не проще ли так?

for(new i; str[i] != '\0'; i++)
{

}
Видь for быстрее while)))0000)) Аптимизация :blum3:


new i, c;
while ((c = str[i]) != '\0')
{
i++;
}

И используй переменную. Буква будет храниться в переменной c))))

DeimoS
23.08.2016, 23:01
new i, c;
while ((c = str[i]) != '\0')
{
i++;
}

И используй переменную. Буква будет храниться в переменной c))))

Таки обращение к массиву не исчезло же :3

Desulaid
23.08.2016, 23:05
Таки обращение к массиву не исчезло же :3

Но сахар в том, что тебе все равно надо обращаться к массиву. В внутри цикла. Блин, боги оптимизации xD

DeimoS
23.08.2016, 23:08
Но сахар в том, что тебе все равно надо обращаться к массиву. В внутри цикла. Блин, боги оптимизации xD


for(new f= strlen(str)-1; f != -1); f--)
И ни к какому массиву обращаться не надо. Точнее, "лишний" раз обращаться не нужно :3

Desulaid
23.08.2016, 23:14
for(new f= strlen(str)-1; f != -1); f--)
И ни к какому массиву обращаться не надо. Точнее, "лишний" раз обращаться не нужно :3

Я про


new i, c;
while ((c = str[i]) != '\0')
{
fputchar(LogFile, c, false);
i++;
}

DeimoS
23.08.2016, 23:16
Я про


new i, c;
while ((c = str[i]) != '\0')
{
fputchar(LogFile, c, false);
}

Ну так можно ведь сделать подобным образом:

for(new c = strlen(str)-1; c != -1); c--)
{
fputchar(LogFile, c, false);
}
И избавиться от присвоения нового значения для переменной "c" :3 Макрооптимизация <3

Desulaid
23.08.2016, 23:25
Ну так можно ведь сделать подобным образом:

for(new c = strlen(str)-1; c != -1); c--)
{
fputchar(LogFile, c, false);
}
И избавиться от присвоения нового значения для переменной "c" :3 Макрооптимизация <3

Сейчас бы слова с конца записывать :blush2::blush2:
EDIT: а от куда в переменную c значение из ячейки массива взялось?

Son of the Moon
23.08.2016, 23:27
одни оптимизаторы.. Проще оставить как есть.

Saibot
24.08.2016, 00:04
new i, c;
while ((c = str[i]) != '\0')
{
fputchar(LogFile, c, false);
}
В твоем варианте, будет выход за придела массива.


new str[] = "Привет";
new i, c;
while ((c = str[i]) != '\0')
{
print(str[c]);
}
Или я ошибаюсь?

Desulaid
24.08.2016, 00:23
В твоем варианте, будет выход за придела массива.


new str[] = "Привет";
new i, c;
while ((c = str[i]) != '\0')
{
print(str[c]);
}
Или я ошибаюсь?

В моем примере есть ошибка и она заключается в том, что цикл не "шагает в перед". Исправил. А в твоем примере выход за пределы массива как раз таки будут, правильнее вот так:


new str[] = "Привет";
new i, c;
while ((c = str[i]) != '\0')
{
printf("%c", c);
i++;
}

Saibot
24.08.2016, 00:26
А в твоем примере выход за пределы массива как раз таки будут, правильнее вот так:
Мой вообще пример на второй страницы с циклом for.

for(new f, s = strlen(str); f < s; f++)
{
fputchar(LogFile, str[f], false);
}
Делал по примеру, этого варианта

new i, c;
while ((c = str[i]) != '\0')
{
fputchar(LogFile, c, false);
}
Только я не учел то, что в функцию fputchar записывается по одному символу.


И ни к какому массиву обращаться не надо. Точнее, "лишний" раз обращаться не нужно :3
В твоем варианте, потом тоже придется обращаться к массиву (обращение будет выполнятся при каждой итерации) как и в моем варианте.
В данном случае обращение к массиву неизбежно.

DeimoS
24.08.2016, 09:21
В твоем варианте, потом тоже придется обращаться к массиву (обращение будет выполнятся при каждой итерации) как и в моем варианте.
В данном случае обращение к массиву неизбежно.

Я в курсе. Просто забыл подправить код Стяжкина.
Только суть в том, что у Стяжкина мы сначала обращаемся к массиву, потом записываем его значение в переменную, и лишь только потом работает со значением. В ситуациях, когда мы много раз обращаемся к массиву, выигрыш от этого, несомненно, есть (хоть и несущественный, о чём я говорил изначально), но если брать именно единичное обращение к массиву...
Вообще это был сугубо стёб аптимизаторов, которые отказываются от каких-то реализаций в угоды пары макросекунд. Странно, что он раздулся в нечто подобное

123
24.09.2017, 15:50
Для логов лучше воспользоваться специальным плагином (http://forum.sa-mp.com/showthread.php?t=603175), который обеспечивает запись логов в отдельном от сервера потоке.

С одной стороны, этот плагин используется в плагине MySQL, так что он в любом случае используется, и отдельно его подключать не нужно. Но с другой стороны, логи в базе даёт больше возможностей по сортировке, выводу на сайте. По этому что лучше, один большой вопрос.

DeimoS
24.09.2017, 15:56
С одной стороны, этот плагин используется в плагине MySQL, так что он в любом случае используется, и отдельно его подключать не нужно. Но с другой стороны, логи в базе даёт больше возможностей по сортировке, выводу на сайте. По этому что лучше, один большой вопрос.

Ответ на который кроется в конечных требованиях к логам: если нужно выводить на сайт/куда-либо ещё/сортировать - MySQL, а иначе можно взять плагин и писать в файл