Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
11.5.2009, 20:09
Сообщение
#421
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Всем добрый вечер! Следущий вопрос... Как лучше всего собирать логи чата в файл? посмотрел несколько скриптов где пишутся логи, но не уверен что там самый лучший способ.
Смотрел их мельком но судя по всему, там пишутся логи при каждом сообщении (либо срабатывании проверки на сообщение, если это антимат к примеру). В другом вроде как сохраняются в память в таблицу до определенного числа, и потом с каждым последущим все это пишется (только опять же каждое новое сообщение). Мне кажется что лучше собирать в таблицу сообщения до тех пор пока их не станет там N (к примеру 100), как только набирается - сохранять таблицу в файл и обнулять в памяти, не так ли? Если есть у кого скрипт (или код) собирающий логи оптимальным путем - дайте плиз глянуть! |
|
|
11.5.2009, 20:25
Сообщение
#422
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Самым оптимальным путем будет думаю мгновенное занесение записи в базу данных, что избавит от всех морок. Следующим по оптимальности путем вижу открытие файла для записи (хендлер глобальный) и запись как в базу, не закрывая файл, лишь сохраняя в нем изменения (write, flush), файл закрываем по ошибке или выключению скрипта.
|
|
|
11.5.2009, 20:40
Сообщение
#423
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Пока что скрипщу без баз данных. Т.е. открываю файл на "дозапись в конец файла" в OnStartup, потом в ChatArrival логирую в конец файла сообщение, а закрываю в OnError или OnExit? хм...а если ребут компа или глюканет сама птока???
|
|
|
11.5.2009, 20:49
Сообщение
#424
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Вот вопрос назрел..
Есть у меня таблица, например такая: (ники юзеров с субтаблицами всяких данных) Код tWorkUsers[sNick] = { ["time"] = os.time(os.date("*t")), ["bans"] = #frmHub:GetPermBanList(), ["tempbans"] = #frmHub:GetTempBanList(), ["releases"] = 0 , ["daily"] = tScore["Daily"], ["total"] = tScore["Total"],} При внесении изменений в таблицу, будет ли метод Код rawset(tWorkUsers,sNick,{ ["time"] = ..., ["bans"] = ..., ["tempbans"] = ..., ["releases"] = ... , ["daily"] = ..., ["total"] = ...,} ) рациональнее чем Код tWorkUsers[sNick] = { ["time"] = ..., ["bans"] = ..., ["tempbans"] = ..., ["releases"] = ... , ["daily"] = ..., ["total"] = ...,} и почему ? |
|
|
11.5.2009, 20:54
Сообщение
#425
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Данные способы равносильны, так как в данных случаях отсутствуют метатаблицы.
Поэтому незачем вызывать функцию rawset |
|
|
11.5.2009, 20:55
Сообщение
#426
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
хотя поидее при ребуте или глюке сохранения в файле ведь останутся да?
|
|
|
11.5.2009, 21:01
Сообщение
#427
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Останутся, но возможно будет утечка в памяти из-за незакрытого файла.
|
|
|
11.5.2009, 21:37
Сообщение
#428
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Цитата Данные способы равносильны, так как в данных случаях отсутствуют метатаблицы. Ясно, а можно на пальцах объяснить, что подразумевает понятие "метатаблица" ? |
|
|
11.5.2009, 21:53
Сообщение
#429
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Метатаблица - это таблица, которая присоединяется к таблице
С помощью метатаблиц можно перегружать операторы и переопределять значения таблицы. Если значение таблицы не определено, то значение ищется в метатаблице. По большому счёту, именно понятие класса определяется и строится на метатаблицах. Для того, чтобы узнать как именно перегружаются операторы и строятся классы смотри тему http://mydc.ru/topic1429.html (в данной теме посмотри пример: "Ещё одна реализация ООП на примере вектора, как метатаблицы.") Вот кратко объяснил что это такое, однако не думаю что всё понятно. На словах сложно сказать. Нужно учиться на примерах. |
|
|
11.5.2009, 22:11
Сообщение
#430
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Цитата а закрываю в OnError или OnExit? хм...а если ребут компа или глюканет сама птока??? Так нельзя. Файл может быть закрыт в любой момент сборщиком мусора. |
|
|
11.5.2009, 22:14
Сообщение
#431
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Файл не закроется сборщиком мусора, если хендлер не будет им убран (например, в случае его глобальности, о чём тут и говорится).
|
|
|
13.5.2009, 22:33
Сообщение
#432
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Код tTimers = {} function OnStartup() TmrMan.AddTimer(60000*5,"MainTimer") end function UserConnected(user) local tmr = TmrMan.AddTimer(1000*10,"MainTimer") tTimers[tmr] = user.sNick end function UserDisconnected(user) for tmr in pairs(tTimers) do if tTimers[tmr] == user.sNick then tTimers[tmr] = nil break end end end function MainTimer(tmr) local msg = "blablabla" if tmr and tTimers[tmr] then local user = Core.GetUser(tTimers[tmr]) if user then Core.SendToUser(user,msg) end TmrMan.RemoveTimer(tmr) tTimers[tmr] = nil else Core.SendToAll(msg) end end Чет гдет не работает так как надо, в какой то момент получается так, что каждые 10 секунд начинается отсылаться msg всем...пока не ребутнуть скрипт. Я так понимаю в каком то случае не срабатывает Код if tmr and tTimers[tmr] then Подскажите...когда может такое получаться...хм..и как это исправить...чет я не догоню никак... |
|
|
13.5.2009, 23:12
Сообщение
#433
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
хехе. А это для чего:
Код function OnStartup() TmrMan.AddTimer(60000*5,"MainTimer") end Возможно в этом и проблема. Таймер регистрируется, но не заносится в таблицу tTimers, поэтому не выполняется условие и выполняется то, что после else Или попробуй поменять последовательность действий: Код tTimers[tmr] = nil TmrMan.RemoveTimer(tmr) Также можно отловить ошибку, если после else написать код: Код if not tmr then Core.SendToAll"not tmr" elseif not tTimers[tmr] then Core.SendToAll"not tTimers[tmr]" end Вообще говоря, работать с идентификаторами таймеров не очень хорошо, так как велика вероятность в ошибке или сбое. |
|
|
14.5.2009, 0:00
Сообщение
#434
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
1) Это для того чтобы Новости хаба выводились всем с заданным интервалом. А не только через 10 секунд после подключения.
Т.е. каждый пол часа всем выводятся новости, и независимо от этого они выводятся юзеру через 10 сек после его подключения. Но проблема вряд ли в этом таймере...у него интервал 30 минут...а когда происходт сбой новости начинают выводиться каждый 10 сек, т.е. при подключении юзера не срабатывает условия наличия tmr и tTimers[tmr] и они начинают всем выводиться каждые 10 сек 2)По поводу этого... проверю, но только как это может повлиять? 3) Да можно, только если и то и то = nil то я ее так не отловлю...надо ловить опять по всюду причем записывать логи входов выходов, чтобы понять в какой момент вышел сбой...боюсь запутаться... |
|
|
14.5.2009, 0:31
Сообщение
#435
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
2) при удалении таймера удаляется его идентификатор, поэтому tmr = nil, а следовательно будет выполняться tTimers[nil] = nil
3) тогда так: Код if not tmr then
Core.SendToAll"not tmr" elseif not tTimers[tmr] then Core.SendToAll"not tTimers[tmr]" else Core.SendToAll"not tmr and not tTimers[tmr]" end |
|
|
14.5.2009, 12:26
Сообщение
#436
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
поправил...жду...пока х.з. ничо нету!
2) понял, но тогда должно получаться что будет заполняться таблица и все....а очищаться не будет! Но как это могло повлиять на то что сообщение начинает слаться каждые 10 сек, не пойму...индификаторы то у таймеров разные все время...т.е. и поля таблицы всегда разные.....как какое-то неубранное поле таблицы могло повлиять на новый таймер? Кстати есть какие нить дебаггеры для ентого дела? Цитата 2) при удалении таймера удаляется его идентификатор, поэтому tmr = nil, а следовательно будет выполняться tTimers[nil] = nil Кстати...индификатор то удаляется...но переменная tmr не удаляется...т.е. второе условие получается не tTimers[nil] = nil а tTimers[tmr] = nil Я пробовал между TmrMan.RemoveTimer(tmr) и tTimers[tmr] = nil вставлять Core.SendToAll(""..tmr.."") и индификатор отсылался.... |
|
|
14.5.2009, 14:27
Сообщение
#437
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ну да. Идентификатор запоминается в переменную, поэтому и не обнуляется, это я с тобой согласен. Тогда хз в чём дело, однако, я повторяю, что работать с идентификаторами таймеров не совсем корректно!
|
|
|
14.5.2009, 15:39
Сообщение
#438
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Хе! Ну если ты не понимаешь...то я уж тем более не вкуриваю!))) Ну вообщем потестю седня еще погляжу че к чему...
кстати вот еще что мне интересно...я написал вот так: Код if tmr and tTimers[tmr] then local user = Core.GetUser(tTimers[tmr]) if user then Core.SendToUser(user,msg) end TmrMan.RemoveTimer(tmr) tTimers[tmr] = nil WriteTable(tTimers, "tTimers", sFileUI) else Core.SendToAll(msg) if not tmr then Core.SendToAll("not tmr") elseif not tTimers[tmr] then Core.SendToAll("not tTimers[tmr]") Core.SendToAll(""..tmr.."") else Core.SendToAll("not tmr and not tTimers[tmr]") end end И каждые пол часа (в моем случае) отсылаются общие новости и в общий чат отсылается тоже индификатор, строка: Код Core.SendToAll(""..tmr.."") Откуда он? tmr ведь объявляется только при 10 секундном таймере, откуда оно берется при отсылки общих новостей ведь там просто: Код TmrMan.AddTimer(60000*30,"News")
|
|
|
14.5.2009, 16:07
Сообщение
#439
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Нееее, тут всё верно. Он берётся из аргумента выполняемой таймером функции. При регистрации любого таймера создаётся идентификатор, который передаётся в выполняемую функцию в качестве аргумента
Кстати, конкатенация тут Core.SendToAll(""..tmr.."") лишняя, так как на неё нужны затраты по уборке мусора. Лучше писать так: Код Core.SendToAll(tostring(tmr))
|
|
|
14.5.2009, 16:07
Сообщение
#440
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Воооо...кажется родил такой метод...опровергните его, или скажите его минусы (можно плюсы)
Код tTimers = {}
function OnStartup() TmrMan.AddTimer(1000*1,"ChekTimers") end function UserConnected(tUser) tTimers[os.time()] = tUser.sNick end function UserDisconnected(tUser) for i,v in pairs(tTimers) do if v == tUser.sNick then tTimers[i] = nil end end end function ChekTimers() msg = "blablabla" for i,v in pairs(tTimers) do if (os.time() - i) > 10 then Core.SendToNick(v,msg) tTimers[i] = nil end end end |
|
|
Похожие темы
|
Сейчас: 27.11.2024, 19:57 |