Разные приложения могут писать в один и тот же файл не заботясь о синхронизации
Возможно ли, чтобы 2 приложения записывали в один и тот же файл журнала с помощью log4net?
MinimalLock частично решает проблему (как упоминалось в @Mark), но если вы используете RollingFileAppender, вы столкнетесь с другими проблемами. Когда файл катится, вы можете оказаться в состоянии гонки, когда один процесс перезаписывает только что созданный файл журнала другого процесса.
Другие варианты включают RemoteLogger, где у вас есть простой сервер, настроенный для приема и записи событий ведения журнала, отправленных другими процессами. Аналогично, вы можете войти в базу данных SQL. Я написал простое приложение, которое записывается в Redis; вам понадобится простое приложение для чтения из Redis и записи в файл. Проблема с этими подходами заключается в том, что все они вводят точку отказа. Когда что-то не работает правильно, часто вам больше всего нужны журналы, и тогда они могут быть недоступны.
Поэтому мое решение состояло в том, чтобы полностью избежать этой проблемы, поместив каждый журнал процессов в свой собственный файл. Это было легко сделать с изменением конфигурации. В конфигурации (Rolling)FileAppender используйте:
Процесс ID становится частью имени файла. Да, это означает, что теперь у вас есть несколько файлов журналов для просмотра, но агрегатор файлов журналов, такой как Graylog, Splunk или Logscape, может помочь.
Они могут, но если одно приложение записывает файл, то другое приложение, скорее всего, столкнется с ошибкой, если ему также потребуется запись в журнал из-за того, что первое приложение будет держать файл открытым для записи. Всегда лучше иметь выделенные источники ведения журнала для ваших приложений - если вам нужно поделиться журналом, используйте базу данных, поскольку она предназначена для обработки одновременных записей.
Это одна из тех вещей, которые будут очень хорошо работать на вашей машине, когда вы разрабатываете, так как вы вряд ли создадите достаточно одновременных записей в файл журнала, чтобы заметить какие-либо проблемы. Как только ваше приложение начнет испытывать большую нагрузку, проблема начнет проявляться, и в этот момент она может проявляться странным образом. Я бы определенно попробовал другое решение.
Это зависит от FileAppender 's LockingModel . Если это ExclusiveLock , то другой процесс не может открыть файл для записи. Альтернативой является MinimalLock , но он не предназначен для этой цели. Он предназначен для того, чтобы позволить другому процессу переместить или удалить файл.
У меня есть 4 java/Java EE приложений- Два из них-это серверные приложения j2ee, работающие в WebSphere. Другие два являются автономными приложениями java. Мой фреймворк ведения журнала-это log4j с использованием log4j.properties. Вопрос 1: могу ли я иметь один и тот же файл журнала для ведения.
Я хочу читать и записывать в один и тот же файл EXCEL (file.xls), используя Ruby. Я попытался использовать Roo gem, который не позволяет записывать в файл. Теперь я использую электронную таблицу gem, но не могу обновить существующие данные в том же файле excel. Можно ли читать и записывать в один.
Да, это возможно, как указано выше, но сейчас я провел некоторое стресс-тестирование этого сценария.
Настройка довольно проста:
- Веб-проект 1 настроен со страницей, которая регистрирует одну запись + кнопка , которая отсылает 1000 запросов на одну и ту же страницу, со счетчиком в URL (подхваченным оператором ведения журнала).
- Веб-проект 2 настроен одинаково, в одном и том же файле журнала.
При одновременном нажатии обеих кнопок записи журнала чередуются по всему журналу. BUT, а это большой GOTCHA, судя по сопровождающему счетчику запросов, ясно, что есть условия гонки. Почти каждый раз, когда один веб-проект успешно регистрирует свою запись, другой терпит неудачу (запись пропускается).
Таким образом, при приличном трафике против этого общего журнала у вас практически не будет гарантии того, какие операторы журнала на самом деле окажутся в журнале. Вывод, по-видимому, состоит в том, чтобы всегда иметь конкретные файлы журналов проекта.
Тест был выполнен с значением по умолчанию "MinimalLock". Я также пересмотрел тест с "ExclusiveLock", только чтобы обнаружить, что первый веб-проект для настройки регистратора "won", в основном блокирует ALL других запросов на регистрацию. Так что, очевидно, это тоже no-go.
Или вы можете использовать Mutex для блокировки общего ресурса и, следовательно, для синхронизации доступа к общему файлу журнала из разных процессов.
Похожие вопросы:
У меня есть две запланированные задачи, которые записываются в один и тот же файл журнала log4net. Когда одна задача выполняется, она успешно записывает данные в файл журнала. Однако, когда оба.
У меня есть консольное приложение, которое записывает данные в скользящий файл журнала. Проблема в том, что приложение может быть вызвано несколькими процессами, и есть вероятность, что оно будет.
Мой вопрос похож на этот , но с несколько более простым контекстом. В моем случае у меня есть одно приложение, которое может быть запущено дважды (самое большее) одновременно с различными.
Я хочу ограничить свой журнал вращения до 500 MB. Таким образом, после 500 МБ один и тот же файл журнала будет переопределен. Теперь конфигурация открывает новый лог-файл после 500 МБ. Как я могу.
У меня есть 4 java/Java EE приложений- Два из них-это серверные приложения j2ee, работающие в WebSphere. Другие два являются автономными приложениями java. Мой фреймворк ведения журнала-это log4j с.
Я хочу читать и записывать в один и тот же файл EXCEL (file.xls), используя Ruby. Я попытался использовать Roo gem, который не позволяет записывать в файл. Теперь я использую электронную таблицу.
Я прочитал этот вопрос: log4net-and-logging-from-parallel-instances Я написал DLL, который использует log4net для ведения журнала. У меня есть процесс, который использует мой DLL с 2 экземплярами.
В моем config/environments/production.rb году у меня есть следующее: config.logger = Logger.new(log/production.log, 10, 1000.megabytes) config.log_formatter = ::Logger::Formatter.new Предположим, я.
Мы строим решение SAAS,и у нас есть планы использовать log4net для ведения журнала. Допустим, это приложение имеет 50 тысяч пользователей. Каков был бы наилучший подход к ведению журнала? Один файл.
Задача: Обеспечить параллельную (например, многотерминальную) работу с базой данных нескольких пользователей одновременно.
База данных текстовая, 1 файл, 10+к строк формата знач1;знач2;. ;знач12.
Запускается программа, в listBox выгружаются значения. Далее из программы с ними можно работать (удалить, изменить, добавить). Проблема в том что каждый раз меняя значения, нужно перезаписывать весь файл, поменял строку 5000 к примеру, надо перезаписывать весь файл, так же с удалением. Пока перезаписывается, вторая программа ожидает. Как можно более грамотно решить задачу?
- Вопрос задан более трёх лет назад
- 304 просмотра
Для одновременной работы с файлом несколькими приложениями его нужно открывать во всех приложениях со специальным указанием: FileShare.ReadWrite
В этом случае все приложения смогут одновременно читать и писать в файл. Это накладывает определённые ограничения на приложения - они должны как-то договариваться и понимать куда они могут писать, а куда - нет.
Каждая программа должна писать только изменения в файл, а не переписывать его - иначе другие программы отвалятся.
Это большой геморрой. Так делать не надо.
Если вы всё-таки решитесь, то нужно файл разбить на блоки. Перед записью в блок программа будет его помечать, что-бы другие программы ждали, пока вы закончите с ним работать, после записи - сбрасывать пометку. Если данные удалились - нужна пометка, что блок удалён, так как нельзя сдвигать файл - его могут читать другие программы. Если данные увеличились в размере - ставить отметку удаления и записывать новые данные в конец. И тд, и тп.
Большая часть из этого заложено, например, в формат dbf. Но реализовывать всё это придётся руками.
Кроме того остаётся вопрос с синхронизацией изменений. Если вы в одной программе поменяли список - как об этом узнает программа на другом компьютере. Это может быть слежение за временем изменения файла, или за специальными отметками в файле . Постоянные проблемы с синхронизацией, постоянное состояние гонки, взаимоблокировки и т.д. В общем, так делать не надо.
Конечно, если каждой запущенной программе отводится только одна строчка и другие её не трогают, то можно попробовать изменять только её.
Если у вас, в основном, чтения и иногда "точечные" изменения, то можно предложить следующий вариант:
при записи: ожидать завершение всех чтений, а затем блокировать файл с FileShare.None, изменить и отпустить.
при чтении: ожидать завершение записи, если она есть, затем открытие файла с FileShare.Read (это не блокирует другие чтения), быстрое чтение и закрытие файла.
Под ожиданием я понимаю попытку открытия файла с соответствующими параметрами, и в случае исключения повтор через таймаут.
Написать велосипед сервис/сервер, который будет с одной стороны взаимодействовать с программами, с другой писать файл на диск, а внутри - кэшировать это.
Получится сервер баз данных. Потихоньку он обрастет логикой хранения со страничной организацией, строки начнет хранить в файле в некоем упорядоченном формате поблочно и при необходимости будет писать-читать например только один блок.
возможно ли, чтобы 2 приложения записывались в один и тот же файл журнала с помощью log4net?
Они могут, но если одно приложение пишет файл, другое приложение, скорее всего, испытает ошибку, если ему нужно записать в журнал, а также из-за того, что первое приложение будет держать файл открытым для записи. Всегда лучше иметь выделенные источники ведения журнала для ваших приложений - Если вам нужно поделиться журналом, используйте базу данных, как она предназначена для обработки параллельных записей.
Это одна из тех вещей, которые будут работать очень хорошо на вашем машина при разработке, так как вы вряд ли создадите достаточно параллельных записей в файл журнала, чтобы заметить какие-либо проблемы. Как только ваше приложение начнет испытывать большую нагрузку, проблема начнет проявляться, и в этот момент она может проявляться странным образом. Я определенно попробую другое решение.
MinimalLock частично решает проблему (как упоминалось в @Mark), но если вы используете RollingFileAppender, вы столкнетесь с другими проблемами. Когда файл катится, вы можете оказаться в состоянии гонки, где один процесс перезаписывает новый файл журнала другого процесса.
другие опции включают RemoteLogger, где у вас есть простой сервер, настроенный для приема и записи событий журнала, отправленных другими процессами. Аналогичным образом можно войти в базу данных SQL. Я написал простую добавил эти журналы в Redis; вам понадобится простое приложение для чтения из Redis и записи в файл. Проблема с этими подходами заключается в том, что все они вводят точку отказа. Когда что-то не работает правильно, часто вам нужны журналы больше всего, и тогда они могут быть недоступны.
таким образом, мое решение состояло в том, чтобы полностью избежать проблемы, имея каждый журнал процессов в свой собственный файл. Это было легко сделать с изменением конфигурации. В (Rolling)FileAppender настройки, использовать:
идентификатор процесса становится частью имени файла. Да, это означает, что теперь у вас есть несколько файлов журнала, но агрегатор файлов журнала, такой как Graylog, Splunk или Logscape, может помочь.
зависит от FileAppender ' s LockingModel. Если это ExclusiveLock затем другой процесс не может открыть файл для записи. Альтернатива MinimalLock, но он не предназначен для этой цели. Он предназначен для разрешения другому процессу перемещать или удалять файл.
или вы можете использовать мьютекс для блокировки общего ресурса и, следовательно, для синхронизации доступа к общему файлу журнала из разных процессов.
Да, это возможно, как указано выше, но теперь я провел стресс-тестирование этого сценария.
настройка довольно проста:
- веб-проект 1 Настройка страницы, которая регистрирует одну запись + кнопка это устанавливает 1000 запросов на ту же страницу, со счетчиком в URL (подхвачен оператором logging).
- веб-проект 2 настроен идентично, против того же файла журнала.
при нажатии обеих кнопок одновременно время, записи журнала перемежаются по всему журналу. Но, и это большой GOTCHA, судя по сопроводительному счетчику запросов, ясно, что есть условия гонки. Почти каждый раз, когда один веб-проект успешно регистрирует свою запись, другой терпит неудачу (запись пропускается).
таким образом, с приличным трафиком против этого общего журнала у вас в основном не будет гарантии того, какие операторы журнала фактически окажутся в журнале. Вывод всегда имеют конкретного проекта журнала файлы, кажется.
тест был выполнен со значением по умолчанию "MinimalLock". Я также переделал тест с помощью "ExclusiveLock", только чтобы обнаружить, что первый веб-проект для настройки регистратора" выиграл", в основном блокируя все остальные запросы на вход. Так что, очевидно, это тоже не годится.
Каждый раз, когда вы копируете файл в папку Яндекс.Диска, редактируете или удаляете файл, все изменения дублируются на сервере Диска: их можно видеть на сайте Яндекс.Диска. И наоборот — если вы загружаете файлы на сайте, они автоматически отобразятся в программе Яндекс.Диск на вашем компьютере.
Таким образом со всех ваших устройств, подключенных к интернету, на Диске видны одни и те же файлы. И если, например, вы удалите файлы на компьютере, они удалятся и из облака. Если вы хотите удалить файл с компьютера, но сохранить на сервере, настройте выборочную синхронизацию.
Примечание. Синхронизировать файлы на телефоне не получится. Скачивать и загружать файлы можно только вручную. Но вы можете включить безлимитную автозагрузку фото и видео.Как синхронизируются измененные файлы
Яндекс.Диск определяет, какие именно части файла были изменены, и выгружает на сервер только измененные фрагменты, а не файл целиком.
Как использовать Диск на нескольких устройствах
Что происходит, когда файл изменяется одновременно на разных устройствах?Допустим, вы создали документ document.docx в папке Диска на домашнем ноутбуке, отключенном от интернета, а затем загрузили на Диск файл с тем же именем с рабочего\nкомпьютера.
Когда вы подключите ноутбук к интернету, Яндекс.Диск начнет синхронизацию. Обнаружив разные файлы с одинаковыми именами, Диск переименует один из них: в результате файлы будут называться document.docx и document (2).docx .
На скольких устройствах можно использовать Яндекс.Диск?
Теоретически вы можете установить приложение и программу Яндекс.Диск на любое количество устройств, но мы не рекомендуем этого делать. Если работать с одними и теми же файлами на разных устройствах одновременно, могут возникнуть конфликты — файлы могут дублироваться или пропадать.
Скорость синхронизации
Чтобы увидеть, с какой скоростью идет синхронизация, нажмите значок Яндекс.Диска: скорость загрузки и скачивания будет указана во всплывающем окне.
Скорость синхронизации рассчитывается с учетом экономии трафика и ресурсов системы. Также скорость может ограничиваться вашим провайдером — проверьте скорость соединения с интернетом.
Что произойдет, если переместить папку Яндекс.Диска?
Если вы перенесете папку Яндекс.Диска, не указав новое положение в настройках программы, программа создаст папку заново на прежнем месте. Как переместить вашу копию Диска, см. в разделе Как выбрать другую папку для синхронизации с сервером.
Что произойдет, если я удалю файлы из папки Яндекс.Диска?
Когда вы удаляете файлы в программе, они попадают в Корзину и хранятся в ней 30 дней. После этого они автоматически удаляются с сервера. Восстановить удаленные с сервера файлы нельзя. Восстановить файлы из Корзины можно только в веб-интерфейсе Яндекс.Диска.
Внимание. Файлы, перемещенные в Корзину, продолжают занимать место на вашем Диске. Если вам не хватает места, очистите Корзину.Если вы хотите удалить файл с компьютера, но сохранить на сервере, настройте выборочную синхронизацию по инструкции Выборочная синхронизация папок.
Читайте также: