Где написать журнал для приложения Windows - PullRequest
2 голосов
/ 08 апреля 2009

У меня есть приложение .NET для Windows, которое развернуто через ClickOnce на веб-сервере. В любой момент времени около 100 пользователей находятся в центре. Я использую log4net для входа в приложение, но у меня возникают проблемы с поиском лучшего места для размещения журнала.

Я пытался сделать так, чтобы они записали в общую сетевую папку, но некоторые пользователи столкнулись с плохим вводом-выводом при таком подходе. Я попытался войти во временную папку пользователя, но это усложняет получение журналов. Я не пробовал журнал событий, потому что мне, вероятно, придется перепрыгивать через некоторые обручи, чтобы это заработало, и я не уверен, стоит ли оно того. Я никогда не пробовал вести журнал базы данных, но всегда предполагал, что это будет относительно медленно.

Кто-нибудь имеет опыт входа в приложение Windows, развернутое в корпоративной среде? Любые предложения о том, где я могу разместить журнал, чтобы он был (1) быстрым, (2) надежным и (3) доступным?

Ответы [ 8 ]

2 голосов
/ 08 апреля 2009

Я использовал log4net с базами данных MS SQL. Обычно я помещаю их в выделенную базу данных на другом сервере, если это возможно. Таким образом, если возникают проблемы с сервером приложений или базой данных, я не теряю логирование.

Скорость никогда не была проблемой.

2 голосов
/ 08 апреля 2009

log4net поддерживает дополнения баз данных для некоторых основных баз данных. Это может быть лучшей альтернативой, если у вас есть подходящая база данных. Однако подходите с осторожностью, поскольку при неправильном управлении это может снизить надежность вашего приложения.

Вы можете использовать его вместе с локальной регистрацией файлов, используя BufferingForwardingAppender для пакетной регистрации вашей сети и отправки только тогда, когда вы получите сообщение, которое превышает определенный порог. Таким образом, вы можете иметь достаточный контекст для отслеживания ошибок, но только при возникновении ошибок.

<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender">
<bufferSize value="1024" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
  <threshold value="ERROR"/>
</evaluator>
<appender-ref ref="DatabaseAppender" />

2 голосов
/ 08 апреля 2009

Проблема с ведением журнала базы данных не в скорости, а в надежности. Вы регистрируетесь, когда что-то идет не так, и если что-то идет не так, шансы недоступной БД не в вашу пользу.

Как правило, вы хотите записать в локальный текстовый файл и где-нибудь еще, например, в сетевой ресурс или БД. Если у вас проблемы со скоростью ввода-вывода / скоростью, вы можете использовать текстовый файл в качестве буфера и записывать логи в ресурс, на который претендуете, в пакетном режиме. Затем вы периодически очищаете локальные «резервные» журналы.

1 голос
/ 08 апреля 2009

Вы можете использовать комбинацию локальных журналов и синхронизировать журналы с центральной базой данных при успешном выходе из системы.

Это зависит от того, какую регистрацию вы хотите выполнять и как работает ваше приложение. Если приложение, выполняющее ведение журнала, является клиентским приложением, то если вы записываете в журналы событий, это может быть бесполезно.

Если вы хотите записать в журналы событий, это довольно просто:

http://support.microsoft.com/kb/307024

Еще одна вещь, если вы ищете место, к которому вы точно знаете, что у пользователя есть доступ, вы можете использовать изолированное хранилище, но тот факт, что вы пытались записать в общую папку, делает меня тем, что вам нужно одно центральное место для ваших журналов, в этом случае БД, вероятно, является вашей лучшей ставкой, и мое лучшее предложение может быть лучшим для вас.

1 голос
/ 08 апреля 2009

А как насчет папки ApplicationData? На Vista это будет примерно так:

C: \ Users \ Ray \ AppData \ Local \ MyCompanyName

Если вы хотите центральное расположение, я бы пошел с журналом базы данных. Но, как сказал Джоэл, вам понадобится как локальное местоположение, которое всегда работает (или как можно ближе к нему), и центральное место для сбора журналов, когда все работает нормально.

0 голосов
/ 08 апреля 2009

В наших приложениях мы log4net и используем общий файл журнала для всех наших пользователей в каталоге CommonAppData (C: \ Documents and Settings \ All Users \ Application Data \ Company \ Product). В этом случае наш установщик должен вручную установить права доступа к файлу для каталога и файла журнала, чтобы все пользователи могли получить к нему доступ, разрешения по умолчанию предназначены только для пользователя, устанавливающего приложение.

Мы также регистрируем необработанные исключения (когда можем) в журнал событий, используя обработчик исключений верхнего уровня (используя реализацию, аналогичную: http://www.wintellect.com/cs/blogs/jclark/archive/2005/03/30/simple-main.aspx). Мы используем журнал событий, так как все ставки отключены относительно состояния файловых потоков, которые открываются. Опять же, наш установщик должен настроить источник журнала событий в журнале событий приложений.

Если вы используете журнал событий, убедитесь, что ваш журнал довольно минимален. Если вы регистрируете много событий, так как журнал событий может быть заполнен довольно быстро, и политика по умолчанию в XP заключается в том, что журнал событий начинает сбрасывать события, если журнал заполнен, а размер по умолчанию относительно мал (512 КБ, и перезаписывать только события старше 7 дней).

0 голосов
/ 08 апреля 2009

Вы можете попробовать где-нибудь в папке CommonAppData - то есть CommonAppData \ YourAppName \ Logs - при условии, что вы обеспечите ограничения размера и / или периодическую очистку. Люди используются для периодической очистки временных папок, но опасаются начинать копать в CommonAppData, AppData или LocalAppData.

Запись в другом месте, кроме здесь или в Temp, рано или поздно доставит вам неприятности в Vista и выше.

Если журналы не являются жизненно важными, то есть, если незаменимые данные не будут потеряны, если кто-то удалит журнал, я бы определенно выбрал подпапку в Temp и имел бы отдельное задание планировщика задач для их загрузки. Это наименее болезненное место.

0 голосов
/ 08 апреля 2009

Если приложение является типичным двухуровневым заданием, возможно, целесообразно выполнить вход в базу данных с помощью AdoNetAppender. AdoNetAppender объединяет сообщения журнала в порции по 100 штук, хотя вы, вероятно, захотите настроить его на запись по крайней мере WARN событий серьезности.

Вы также можете рассмотреть возможность входа в каталог данных приложения для всех пользователей, хотя это может сделать его не менее громоздким для получения журналов. Возможно, рассмотрите возможность добавления ярлыка где-нибудь?

Наконец, если проблемы доступности журналов являются распространенной темой в вашей организации, вы можете рассмотреть приложение для сбора журналов, например Splunk .

...