powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Логирование работы потоков
26 сообщений из 26, показаны все 2 страниц
Логирование работы потоков
    #39668147
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На форуме видел несколько решений записи в файл из нескольких потоков: через крит. секции, через события, через отдельный поток.
Сравнение не проводил, но везде было накидано на вентилятор. Единственная реализация, которая внушает доверие, но много кода - это от Wildcat (точно не помню).
Написал вот это)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
procedure WriteLog(AWriteText : String; const AType: integer = 1);
var
  F: string;
  WriteText: AnsiString;
  FileStream : TFileStream;
begin
  WriteText:= AWriteText+ #13#10;
  try
    if AType = 1  then CSectionWrFile.Enter;
    F:= FileDir + PathDelim + FileName + '_' + inttostr(FileNumber) + '.txt';

    if FileExists(F)  then
    begin
      FileStream := TFileStream.Create(F, fmOpenWrite + fmShareDenyNone);
      try
        if FileStream.Size >= FileSize then
        begin  //создаем новый файл и записываем в него строку
          FileStream.Free;
          inc(FileNumber);
          FileNumber:= FileNumber mod FileCount;
          F:= FileDir + PathDelim+FileName + '_' + inttostr(FileNumber) + '.txt';
          if FileExists(F) then
            FileStream := TFileStream.Create(F, fmOpenWrite+ fmShareDenyNone)
          else
            FileStream := TFileStream.Create(F, fmCreate+ fmShareDenyNone);

          FileStream.Position := FileStream.Size;
          FileStream.WriteBuffer(Pointer(WriteText)^, Length(WriteText));
        end
        else
        begin
          FileStream.Position := FileStream.Size;
          //FileStream.Write(AnsiString(WriteText)[1], Length(WriteText));
          FileStream.WriteBuffer(Pointer(WriteText)^, Length(WriteText));
        end;

      finally
        FileStream.Free;
      end;
    end
    else  //если нужно создать новый файл
    begin
      try
        FileStream := TFileStream.Create(F, fmCreate + fmShareDenyNone);
        try
          FileStream.Position := FileStream.Size;
          //FileStream.Write(AnsiString(WriteText)[1], Length(WriteText));
          FileStream.WriteBuffer(Pointer(WriteText)^, Length(WriteText));
        finally
          FileStream.Free;
        end;
      except
      end;
    end;

  finally
    if AType = 1 then CSectionWrFile.Leave;
  end;
end; 



Задается размер файла, кол-во файлов. Запись при хорошем раскладе не очень часто (раз в 3-5 сек)
Что тут не так)? Покритикуйте, пожалуйста.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668149
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вся работа с файлом в критической секции и в том же потоке.

То есть все решение так себе для "безопасного многопоточного логирования", тут и writeln с append хватит.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668156
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, а скажите почему так себе? можно развернутый ответ?
Ведь крит. секции защищают файл от "плохой записи", а что здесь "опасного"?
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668167
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Это подозрений не вызывает?

Код: pascal
1.
FileStream.WriteBuffer(Pointer(WriteText)^, Length(WriteText));



Может лучше
Код: pascal
1.
Length(WriteText)*SizeOf(Char)

?
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668170
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster, вызвало бы, если бы не AnsiString, но да, лучше переделать
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668172
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbможно развернутый ответ?
Тут что-то пояснить нужно?
wadmanВся работа с файлом в критической секции и в том же потоке.
Проще тогда делать так, чтобы каждый поток писал в свой файл.

А лучше убрать тормоза при работе с файловой системой в отдельный поток.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668173
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, я думал над отдельным потоком, но может сложиться ситуация, когда приложение станет колом и я не увижу последнее удачное действие, так как в потоке писателе может скопиться очередь
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668175
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а потоков может быть много-много и файлов будет много много, а потом еще надо это все сводить
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668178
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbв потоке писателе может скопиться очередь
Причина надумана.
cptngrbраз в 3-5 сек
С тем же успехом процедура логирования может "свалиться" и не записать в файл.

Но если все так серьезно, то логированием должен заниматься и вовсе отдельный процесс, а не поток.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668190
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем так сложно, достаточно открывать с share_deny_write, а если не открылось - небольшой слип и повтор. При записи раз в 3 секунды проблем не будет.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668199
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2, ну пока 3-5 сек, а потом 1 раз в секунду. А если 5-10 раз в секунду, то такая схема работать не будет?
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668200
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbА если 5-10 раз в секунду, то такая схема работать не будет?
У меня опрос нескольких десятков железяк по RS полностью пишется в формате дампа в один файл отдельным потоком-логером, плюсом в tmemo. В теории и тысячи ему не проблема.
Работает без нареканий.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668201
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне хватает mutex + writeln ля многопроцессного протокола и критической секции + writeln для многопоточного. Трудностей ни со скоростью ни с полнотой протоколирования не испытываю
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668207
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanА лучше убрать тормоза при работе с файловой системой в отдельный потокНе только тормоза. А и очередность действий, записанных в лог, может нарушиться, если куча потоков будет ждать входа в секцию. Сами действия нарушатся, логика работы. Изменится, скажем так. Тормоза изменят логику.
А добавление в очередь происходит мгновенно, и потому всё работает, как задумано.

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

P.S. Ни разу у меня ничего не "становилось колом". Наоборот, всегда видно, кто перестал писать, а кто еще пишет.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668210
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
Код: pascal
1.
procedure WriteLog(AWriteText : String; const AType: integer = 1);


Если речь о записи логов, то имхо разумнее каждому потоку писать в свой файл. Точнее, не "в свой", а в "в файл, соответствующий тому главному объекту, с которым работает поток". Скажем, если у меня в репликации настроены двенадцать связанных серверов - логи пишутся в \2018\07\02-Питер.log, \2018\07\02-Самара.log итп. Поток, начиная работу с конкретным сервером - начинает писать в соответствующий ему лог, при этом дополнительная синхронизация не нужна по той причине, что два потока с одним сервером работать никогда не будут.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668211
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, а очередь как организовывали?
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668229
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockу меня в одну миллисекунду добавляется куча записей из разных потоков в 1 файл.
И таких файлов несколько может бытьпорой кажется что основное чем занимается сервис это гадить в логи/базу и размер одного файла в десятки гиг в порядке вещей, так что логи архивировать/херить только успевай
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668244
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbYuRock, а очередь как организовывали?TList с крит. секцией обычный.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668247
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanразмер одного файла в десятки гиг в порядке вещей, так что логи архивировать/херить только успевай
Ну не одного а многих файлов разбитых. Огромные файлы читать неудобно.
И логи старше 30 (по умолчанию) дней автоматом прибиваются.
но гиг ~30 стабильно лежат постоянно, это да. Никому не мешают особо.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668267
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockне одного а многихтак я про свои
YuRockОгромные файлы читать неудобнопорой да, но если часто бить то порой накопиться их может изрядно, тоже неудобняк. хорошо когда динамически можно подстроить частоту/размерность дробления
YuRockлоги старше 30 (по умолчанию) дней автоматом прибиваютсяя несколько месяцев стараюсь архивы держать пока есть возможность, читай свободное место. никогда не знаешь когда разбор полетов понадобится
YuRockгиг ~30 стабильно лежат постоянностолько у меня и за день может навалить
а, еще и каталоги с логами сжимаются ср-вами винды, тоже выручает несколько
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668270
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, а почему не TThreadList?
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668351
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbYuRock, а почему не TThreadList?
Не могу сказать. Когда-то мне так захотелось, не помню - решил всю логику скрыть. Это фактически и есть TList с крит. секцией.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668447
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я использую TQueue, так как не нужно задумываться какое сообщение брать следующее. В TList всегда первый элемент брать. Не красиво. Или я не прав?
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668494
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb, будет, только там уже код ожидания будет не очень оптимальный - либо усыплять на большее время, либо делать больше попыток захватить файл. А это чревато торможением потока или перемешиванием событий (более позднее может успеть захватить файл раньше, чем более раннее). Но если нагрузка не очень большая, то сойдет.
Более правильно, разумеется, сделать очередь записей и выгрузку на диск отдельным потоком. Но для 2-3 записей в секунду это оверхед)
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668546
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbЯ использую TQueue, так как не нужно задумываться какое сообщение брать следующее. В TList всегда первый элемент брать. Не красиво. Или я не прав?Ну у меня тоже TQueue, только самописное
Из TList, конечно, первый (нулевой) элемент брать, если FIFO. А для логов так и нужно.
...
Рейтинг: 0 / 0
Логирование работы потоков
    #39668733
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockА для логов так и нужно.Для логов бы LinkedList использовать. И по памяти идеально и по блокировкам. Почему его еще не реализовали в делфях для меня загадка
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Логирование работы потоков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]