Ведение журнала с помощью приложения резервного копирования

Есть ли какая-либо среда ведения журналов .NET, которая может переключать приложение, если что-то не так с текущим. На самом деле я хочу следующее:

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

Есть ли у этой возможности одно из следующих: log4net, NLog, Enterprise Library? Я искал это, но не повезло.


person zvjerka24    schedule 13.01.2012    source источник
comment
Nlog позволяет вам написать свою собственную цель. Затем вы можете добавить свои требования. nlog-project.org/wiki/ (в крайнем случае :)   -  person robasta    schedule 13.01.2012
comment
Я нашел решение, см. Мой ответ ниже.   -  person zvjerka24    schedule 17.01.2012


Ответы (5)


Для полноты: Enterprise Library поддерживает настраиваемый специальный источник ошибок, в котором вы можете установить «приложение» для регистрации сообщений с ошибками. После настройки это работает без какого-либо программирования.

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

person Randy supports Monica    schedule 13.01.2012
comment
Я нашел решение, см. Мой ответ ниже. - person zvjerka24; 17.01.2012

Насколько мне известно, log4net в настоящее время не поддерживает приложения для резервного копирования, существует (или была?) Открытая проблема в невыполненной работе функции log4net. Но я думаю, что проект под названием FallbackAppender делает именно то, что вам нужно.

person Igor Korkhov    schedule 13.01.2012
comment
Вы правы, это именно то, что мне нужно, но когда я попробовал и протестировал, оказалось, что это работает не так, как ожидалось. например Если вы используете два FileAppender и один из них не работает, в следующий раз, когда он будет восстановлен, он попытается использовать его снова, но не удастся. Та же проблема возникает с базой данных. Возможно, я неправильно его настроил, но определенно он работает не так, как ожидалось. Спасибо за зубец. - person zvjerka24; 17.01.2012
comment
Я нашел решение, см. Мой ответ ниже. - person zvjerka24; 17.01.2012

Поскольку log4netContribute FallbackAppender не работает должным образом, я провел глубокое исследование и обнаружил, что эта способность имеет nLog. Я протестировал его, и он работает как шарм;) Вот пример:

[app.config]

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name="appTitle" value="My Application"/>
<targets>
<target name="file" xsi:type="FallbackGroup" returnToFirstOnSuccess="true">
<target xsi:type="File" fileName="x:\vladimir.txt" />
<target xsi:type="File" fileName="w:\pavlovic.txt" />
<target xsi:type="File" fileName="w:\zvjerka24.txt" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
</nlog>
</configuration>

[код]

Logger _logger = LogManager.GetCurrentClassLogger();
_logger.Info("Neki Info");
_logger.Debug("Neki debug");
_logger.Error("Neki  ERROR");
_logger.Error("Pa jos neki");
person zvjerka24    schedule 17.01.2012

Да, Log4Net позволяет иметь несколько мест назначения журналов, таких как: файл журнала, электронная почта, база данных и Просмотрщик событий.

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

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

person Joe Ratzer    schedule 13.01.2012
comment
Я знаю это, но есть ли способ переключить приложение из базы данных в файл во время выполнения (из кода), если мы получили исключение при входе в БД? - person zvjerka24; 13.01.2012
comment
Не через Log4Net, но вы можете легко обновить web.config в своем коде. Поскольку у одного места назначения журнала могут быть проблемы, всегда полезно иметь два. Это означает, что вам не нужно беспокоиться о написании кода, обновляющего web.config. - person Joe Ratzer; 13.01.2012
comment
Я нашел решение, см. Мой ответ ниже. - person zvjerka24; 17.01.2012

NLog позволяет вам регистрироваться для нескольких целей через файл конфигурации. Не забудьте установить для ignoreFailures значение true, чтобы игнорировать любые сбои при установке / удалении:

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <targets>
        <target name="logfile" xsi:type="File" />
        <target name="db" xsi:type="Database" />
    </targets>

    <rules>
        <logger name="*" levels="Info" writeTo="logfile,db" />
    </rules>
</nlog> 

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

Изменить: вы также можете создать настраиваемую цель, чтобы достичь этого в коде:

using NLog; 
using NLog.Targets; 

namespace MyNamespace 
{ 
    [Target("MyFirst")] 
    public sealed class MyFirstTarget: TargetWithLayout 
    { 
        public MyFirstTarget()
        {
            this.Host = "localhost";
        }

        [Required] 
        public string Host { get; set; }

        protected override void Write(LogEventInfo logEvent) 
        { 
            string logMessage = this.Layout.Render(logEvent); 

            SendTheMessageToRemoteHost(this.Host, logMessage); 
        } 

        private void SendTheMessageToRemoteHost(string host, string message) 
        { 
            // Detect your database state here or do something else with the error.
        } 
    } 
}

и используйте его с:

<nlog> 
  <extensions> 
    <add assembly="MyAssembly"/> 
  </extensions> 
  <targets> 
    <target name="a1" type="MyFirst" host="localhost"/> 
  </targets> 
  <rules> 
    <logger name="*" minLevel="Info" appendTo="a1"/> 
  </rules> 
</nlog>

Дополнительную информацию см. На этой странице.

person Nick    schedule 13.01.2012
comment
Я знаю это, но есть ли способ переключить приложение из базы данных в файл во время выполнения (из кода), если мы получили исключение при входе в БД? - person zvjerka24; 13.01.2012
comment
Для этого я бы создал настраиваемую цель. Я обновлю свой ответ сейчас. - person Nick; 13.01.2012
comment
Я нашел решение, см. Мой ответ ниже. - person zvjerka24; 17.01.2012