Конференция "KOL" » Запись в log
 
  • rvi (03.03.09 12:15) [0]
    Добрый день.
    Есть два вопроса по методу записи лога программы, как идеологический, так и технический.

    1) Способ через StrSaveToFile работает и все просто, но при больших объемах лога слишком расточителен с точки зрения расхода памяти и времени работы с диском.
    Поэтому я решил перевести процедуру записи в лог на более низкий уровень, для чего использую процедуру FileWrite. Я считаю, что более правильно дописывать в конец файла, чем переписывать весь файл заного. Или я чего-то не понимаю и можно все оставить как есть?

    2) Пример кода:
    Procedure AddLog(S: string; LT: TLogType);
    var
     LogName: string;
     f: hFile;
     p:PChar;
    begin
     Case LT of
       ltError: LogName:='Error.log';
       ltNet: LogName:='Access.log';
     end;
     f:=FileCreate(LogName, ofOpenWrite or ofOpenAlways);
     FileSeek(f, 0, spEnd);
     FileWrite(f, s[1], length(s));
     FileClose(f);
    end;



    В результате некоторые записи дублируются в файле и порядок не соответствует хронологии. Я грешу на строчку позиционирования указателя на EOF -> FileSeek(f, 0, spEnd); Может кто сталкивался и подскажет где у меня ошибка?
    Спасибо.
  • Jon © (03.03.09 13:01) [1]
    From KOL.PAS - works well:


    procedure LogFileOutput( const filepath, str: AnsiString );
    var
     F: THandle;
     Tmp: AnsiString;
    begin
     F := FileCreate( filepath, ofOpenWrite or ofOpenAlways or ofShareDenyWrite );
     if F = INVALID_HANDLE_VALUE then Exit;
     FileSeek( F, 0, spEnd );
     Tmp := str + #13#10;
     FileWrite( F, PAnsiChar( Tmp )^, Length( Tmp ) );
     FileClose( F );
    end;

  • rvi (03.03.09 14:14) [2]
    Thank you, John, I will try
 
Конференция "KOL" » Запись в log
Есть новые Нет новых   [134431   +15][b:0][p:0.001]