Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 := 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.04 c
14-1122653780
Alexander Panov
2005-07-29 20:16
2005.08.21
Фото от 24.06.2005г.


10-1099904482
Marina_Sm
2004-11-08 12:01
2005.08.21
COM


1-1122542872
sunsay
2005-07-28 13:27
2005.08.21
Проблема с видимостью полей объекта


14-1122290347
Rule
2005-07-25 15:19
2005.08.21
Делюся радостью !!!!


4-1119610541
DelphiN!
2005-06-24 14:55
2005.08.21
Вызов процедуры основного модуля из потока





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский