Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизСоздание логов Найти похожие ветки
← →
Dust © (2005-07-26 13:00) [0]Народ, поделитесь соображениями кто и как пишет логи.
мне интересны общие принцыпы (хочется значть общую организацию).
в общем, насколько я понимаю - нужен отдельный юнит, который должны использовать все остальные юниты, т.е. из остальных юнитов нужно будет вызывать AppendString(,,,,).
Есть ли уже готовые решения на эту тему?
← →
Fay © (2005-07-26 13:04) [1]2 Dust © (26.07.05 13:00)
>> Есть ли уже готовые решения на эту тему?
Есть!
CreateFile + WriteFile + CloseHandle.
← →
Alexander Panov © (2005-07-26 13:05) [2]http://delphibase.spb.ru/?action=viewtopic&topic=fileini
← →
Ega23 © (2005-07-26 13:05) [3]Для Exception-лога
Application.OnException.
В нём ставишь запись в лог.
Все исключения передаёшь наверх через raise.
← →
Dust © (2005-07-26 13:09) [4]2 Fay это не готовое решение, это вообще не решение, к тому же это неудобно.
← →
Ega23 © (2005-07-26 13:11) [5]2 Fay это не готовое решение, это вообще не решение, к тому же это неудобно.
Это удобно.
Это - вполне нормальное решение.
А готовность - так тебе же деньги за программирование платят, не так ли?
← →
Fay © (2005-07-26 13:19) [6]2 Dust © (26.07.05 13:09) [4]
Готовое решение пишется за 18 минут 39 секунд.
← →
Dust © (2005-07-26 15:56) [7]у меня на решение этого вопроса ушло 2,5 часа рабочего времени.
если желаете, то могу выложить модуль.
← →
Fay © (2005-07-26 16:09) [8]2 Dust © (26.07.05 15:56) [7]
Клади!
← →
Fay © (2005-07-26 17:26) [9]2 Dust © (26.07.05 15:56) [7]
Ау!
← →
Dust © (2005-07-26 18:23) [10]да блин, занят я был... конденционер устанавливали у себя в кабинете
← →
Fay © (2005-07-26 18:34) [11]2 Dust © (26.07.05 18:23) [10]
Поздравляю! Мы тоже поставили (не сегодня, правда) и стало Щястье.
← →
Dust © (2005-07-27 14:51) [12]оцените
http://nostdal.org/paste/f7ad5d66f9538874089be31cde7c5f21.html
← →
Fay © (2005-07-27 17:59) [13]2 Dust © (27.07.05 14:51) [12]
В общем неплохо. Только вот
1)fname := Pchar(DateTimeToStr(Now()) + ".dump" + IntToStr(GetTickCount()));
Думаю, так делать нельзя. Почему бы не использовать просто строку (fname : String) ?
2)//создание файла
fh := 0;
fh := CreateFile(fname, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_NEW, 0, 0);
Зачем первое присвоение?
Зачем GENERIC_WRITE?
Почему 0, а не nil?
Почему CREATE_NEW, а не CREATE_ALWAYS?
3)if not WriteFile(fh, Pointer(pt)^, count, pCount, nil) then
begin
MessageBox(0, "Debug Unit " + #10#13 + " Ошибка записи в файл", nil, MB_OK);
Result := -1;
exit;
end;
Result := pCount;
CloseHandle(fh);
Почему не вызывается CloseHandle при неудачной записи?!
← →
Fay © (2005-07-27 18:05) [14]
function SaveDumpToFile(const pt : DWORD; const count : Integer) : Integer;
function DumpToLog(data : dword; const size : dword) : boolean;
Почему такие странные прототипы? pt нигде не используется в качестве DWORD.
Дальше мелочи либо то же самое.
Но в целом очень приятное впечатление, особенно после всякихAssignFile
иFileMode := 64
8)
Удачи.
← →
Dust © (2005-07-27 18:34) [15]спасибо за хорошую оценку
> CloseHandle(fh);
> Почему не вызывается CloseHandle при неудачной записи?!
исправлю
> fh := 0;
> fh := CreateFile(fname, GENERIC_READ or GENERIC_WRITE,
> FILE_SHARE_READ, 0, CREATE_NEW, 0, 0);
> Зачем первое присвоение?
> Зачем GENERIC_WRITE?
> Почему 0, а не nil?
> Почему , а не ?
1-е - просто душу успокаивает, по большей части привычка
2-е - а какая разница? nil (по крайней мере в винде) равно нулю,
и указывает на пустую заблокированную страницу.
3-е - потому что сочетание Now()и GetTickCount() даст в любом случае уникальную строку, а потому тоже без разницы CREATE_NEW или CREATE_ALWAYS.
← →
Dust © (2005-07-27 18:36) [16]кстати, насчёт строки - очевидно можно, раз без глюков и проволочек эта функция сделала не один десяток дампов
← →
Fay © (2005-07-27 18:57) [17]2 Dust © (27.07.05 18:34) [15]
> а потому тоже без разницы CREATE_NEW или CREATE_ALWAYS.
Тогда точно CREATE_ALWAYS.
>какая разница? nil (по крайней мере в винде) равно
>нулю, и указывает на пустую заблокированную страницу
Зачем тебе лишние сообщения при сборке?
2 Dust © (27.07.05 18:36) [16]
Судя по приведённому доказатеьству, не очевидно.
Удачи.
← →
Dust © (2005-07-28 18:22) [18]Вышел новый вариант того же модуля, можете использовать в своих программах с одним условием - обязательной ссылкой на меня. Просьба не менять заголовок, если это возможно.
http://nostdal.org/paste/2866277779a4f5d1e84bb35daa86ca49.html
кстати, оцените, может чей-то острый глаз увидит ошибку, или возможность улучшения (например увеличения скорости).
так же было бы интересно узнать чего в этом модуле не хватает,,,... короче хочу услышать (или увидеть критическую оценку этого кода)
← →
Fay © (2005-07-28 19:57) [19]
//запись в файл
if not WriteFile (fh, Pointer(pt)^, count, pCount, nil) then begin
MessageBox (0, "Debug Unit " +#10#13+ " Ошибка записи в файл", nil, MB_OK);
Result:=-1;
exit; // !!!!!!!!!!!!!
end;
Result:=pCount;
StrToLog ("записано в файл "+IntToStr(pCount)+" байт "+"имя дампа: ["+fname+"]");
//освобождение ресурсов
CloseHandle (fh);
Где CloseHandle?
← →
Defunct © (2005-07-29 05:28) [20]> Dust
гм.. зачем так много кода для такой простой задачи?
у меня подобный модуль - 81 строка кода (занял около 20 минут при написании, и юзается уже годами во всех прогах, требующих log), при этом, в отличие от вашего, сохраняет не в log.txt, а в <app_exe_name>.log
работаю через ReWrite/Append ибо для лога ничего более и не надо.
интерфейс модуля:
interface
uses SysUtils, Windows, Classes, Forms {<-- для навешивания обработчика App.OnException};
procedure ShowException( AMethod, ACls : String; E:Exception);
procedure SetSilentMode( SMode: Boolean); // при SMode = True на экран сообщения не выводятся
function GetLastExceptionMessage:String;
var OnLogException : TNotifyEvent = nil;
implementation
..
← →
Fay © (2005-07-29 08:54) [21]Я вАщЕ не очень силён в правовых вопросах, поэтому не могу понять, согласуется ли
>> можете использовать в своих программах
c
>> Copyright (c) 1982-2005, Харченко А. В.(Dust)
Ещё я не понимаю зачем автор "хочет услышать (или увидеть критическую оценку этого кода)".
Код так и не исправлен. Видимо 2 минуты не нашлось. Бывает.
З.Ы.
Что-то я с утра разбурчался 8).
← →
Dust © (2005-07-29 09:27) [22]где CloseHandle вставить вы и так знаете (уже,, спасибо Fay)
а выкладывать заново из-за исправления одной маленькой некритической ошибки...
у себя я уже давно эту ошибку исправил
//*********
2 Defunct
иногда я пишу программы в которых нет и не должно быть модулей
Classes, Forms, например когда очень критичен размер..
к тому же Я ЭТОТ МОДУЛЬ ИСПОЛЬЗУЮ В ОСНОВНОМ ДЛЯ ОТЛАДКИ, если уж в этом модуле будут исключения!!!! (а они могут возникнуть только если не удастся выделить память) то уж извините..
← →
Fay © (2005-07-29 09:31) [23]2 Dust © (29.07.05 9:27) [22]
Я правильно понял, Вы пишете создающие логи и выгружающие дампы программы, для которых критичен размер?
Прикольно! 8)
← →
Dust © (2005-07-29 18:19) [24]2Fay
блин, ну неужели вы никогда не игрались с троянами и шпионами...
во-вторых - я недолюбливаю исключения, и в третьих - предпочитаю писать именно такой код, действие которого я полностью понимаю
что например делают процедуры AssignFile, Reset, CloseFile,,,
что из себя представляет файловая переменная.....
← →
Fay © (2005-07-29 18:25) [25]2 Dust © (29.07.05 18:19) [24]
Не надо про AssignFile, плиззз!
Меня от него пучит 8((
← →
Dust © (2005-07-29 19:11) [26]народ.... тут... вот такой интересный вопрос:
(это кусочек функции).......
при повторном её вызове я получаю запись в логе следующего содержания:
Result:=nil;
hf:=CreateFile (Pchar(inifilename),GENERIC_READ, FILE_SHARE_READ,0 ,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , 0);
if hf = INVALID_HANDLE_VALUE then begin
tmpstr:="Попытка открыть существующий файл "; tmpstr:=tmpstr+""""+inifilename;
StrToLog(tmpstr);
StrToLog(SysErrorMessage(GetLastError()));
StrToLog("========");
StrToLog("предполагается, что файл не существует Попытка создать файл с таким именем ");
hf:=CreateFile (Pchar(inifilename),GENERIC_READ, FILE_SHARE_READ,0 ,CREATE_NEW, FILE_ATTRIBUTE_NORMAL , 0);
if hf = INVALID_HANDLE_VALUE then begin
StrToLog(SysErrorMessage(GetLastError()));
StrToLog("========");
Result :=nil;
Exit;
end else begin
CloseHandle (hf);
//DeleteFile (inifilename);
.......
Попытка открыть существующий файл "..\Config.ini
Невозможно создать файл, так как он уже существует
========
предполагается, что файл не существует Попытка создать файл с таким именем
← →
Dust © (2005-07-29 19:13) [27]после чего он есстественно создаётся, а затем удаляется,,,, но почему невозможно создать файл??????
Win XP Prof Rus SP2
это что сообщения везде так переведены?
← →
Fay © (2005-07-29 20:11) [28]2 Dust © (29.07.05 19:11) [26]
Пиши полное имя файла.
← →
Fay © (2005-07-29 20:13) [29]2 Dust © (29.07.05 19:11) [26]
А вАщЕ этот код просто какой-то удивительный. Для чего он такой?
← →
simpson © (2005-07-29 20:44) [30]Позволю внести свои 5 копеек :)
Приложение, работающее под NT-линейкой Windows, должно вести свои логи либо в журнале "Приложение" (который для этого и создан), либо, если объем логов существенный, создавать свой custom log, как делает, например, DNS-сервер от Microsoft.
Все остальное - велосипеды, которые грамотного пользователя будут только раздражать.
← →
Dust © (2005-07-30 09:21) [31]2 simpson
Ты бы ещё сказал, что приложение ОБЯЗАНО хранить настроийки в реестре (лично я их храню в ini, и на то есть свои основания).
А ты сам пишешь логи? В системном журнале говоришь,,, научи!
хотябы ткни пальцем в доступную литературу
← →
Anatoly Podgoretsky © (2005-07-30 12:16) [32]Dust © (29.07.05 09:27) [22]
Нифига себе не критичная.
Dust © (30.07.05 09:21) [31]
http://www.microsoft.com
← →
Defunct © (2005-07-30 22:16) [33]Dust © (29.07.05 19:11) [26]
Объясни пожалуйста, что это за ошибка такая:
tmpstr:="Попытка открыть существующий файл "; tmpstr:=tmpstr+""""+inifilename;
Попытка открыть существующий файл "..\Config.ini
Невозможно создать файл, так как он уже существует
Ведь бред полнейший пишешь.
открыть можно только существующий файл, не существующий файл открыть нельзя.
← →
simpson © (2005-07-30 23:58) [34]> Dust © (30.07.05 09:21) [31]
> А ты сам пишешь логи?
Да, пишу. Есть ряд моих проектов, в которых и сервисы, и простые приложения создают свои event logs.
> научи!
Денег не хватит оплатить учебу. :) Максимум, могу помочь строчкой-другой кода по теме.
> хотябы ткни пальцем в доступную литературу
По просьбам трудящихся, тыкаю в доступную литературу
(уточняю пост уважаемого Anatoly Podgoretsky):
MSDN, раздел Platform SDK: Debugging and Error Handling.
Привел бы ссылку на онлайн-MSDN, но он чего-то лежит. :(
Как пример советую глянуть реализацию функции в TService.LogMessage . Хотя пример, мягко говоря, не ахти.
> Ты бы ещё сказал, что приложение ОБЯЗАНО
> хранить настроийки в реестре
Нет, не обязано. Мухи - отдельно, котлеты - отдельно. Речь ведь идет о ведении логов? Так причем здесь механизм хранения настроек приложения?
Для этой задачи предусмотрен штатный механизм ОС. Если человек знает, как просмотреть любой системный журнал, значит, он с легкостью просмотрит и твой. Ему не нужно изучать ничего нового. То же самое можно сказать и о любом, кому придется сопровождать твою программу.
Плюсы для тебя, как разработчика:
1. Не нужно писать приложение для просмотра, фильтрации и т.п. этих логов.
2. Готовый механизм удаленного доступа.
3. Представь, что в один лог пишет несколько приложений из твоего пакета прикладных программ. Не нужно обеспечивать синхронизацию доступа к логу.
4. Готовый механизм безопасности доступа к логу.
Вопросы?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.036 c