Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Создание логов   Найти похожие ветки 

 
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 := 648)

Удачи.


 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.027 c
4-1120126541
BiN
2005-06-30 14:15
2005.08.21
Прототип IoVolumeDeviceToDosName в user-mode.


14-1122496407
DiamondShark
2005-07-28 00:33
2005.08.21
Дятлы.


14-1122620079
Ёжик
2005-07-29 10:54
2005.08.21
Net use


14-1122459674
DiamondShark
2005-07-27 14:21
2005.08.21
Почему живут идиоты?


1-1122615127
JetMan
2005-07-29 09:32
2005.08.21
Отобразить XML в виде дерева