Ведение журнала корпоративной библиотеки не регистрируется на SQL

Я использую EntLib 6 для регистрации одного веб-приложения. Поскольку я использую n-слои, я хотел поместить журналирование в одну библиотеку, доступную со всех слоев.

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

Итак, вот что я сделал:

Я создал БД со сценарием, предоставленным в EntLib6, в БД, которая находится под строкой подключения DB_BELVAL, я поместил этот тестовый код С# в переносимый класс, который будет обрабатывать ведение журнала:

 public static void LogToDatabase()
        {
            try
            {
                //Bootstrapping logging
                DatabaseFactory.SetDatabaseProviderFactory(new DatabaseProviderFactory());
                IConfigurationSource configurationSource = ConfigurationSourceFactory.Create();
                LogWriterFactory logWriterFactory = new LogWriterFactory(configurationSource);
                Logger.SetLogWriter(logWriterFactory.Create());

                if (Logger.IsLoggingEnabled())
                {

                    LogEntry log = GetLogEntry();
                    log.Categories.Add("General");  // name of Categorie in EntLib Config editor
                    log.Priority = 5;
                    log.Severity = System.Diagnostics.TraceEventType.Information;
                    log.Message = "Hello dude, from AMLogger";
                    Logger.Write(log);

                }

            }
            catch (Exception ex)
            {
            }
        }

        private static LogEntry GetLogEntry()
        {
            LogEntry log = new LogEntry();
            log.TimeStamp = DateTime.Now;
            log.Title = "TANOLIS";
            log.Priority = 5;                       // default priority
            log.Severity = System.Diagnostics.TraceEventType.Verbose;  // default severity
            log.MachineName = "MachineName";//HttpContext.Current.Server.MachineName;
            log.ProcessId = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
            return log;
        }

И из UnitTest я вызываю метод LogToDatabase() переносимой библиотеки. Я настроил файл конфигурации модульного теста следующим образом:

Редактор EntLib

или xml:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
  </configSections>
  <loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
    <listeners>
      <add name="Database Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.Database.FormattedDatabaseTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging.Database, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Database.Configuration.FormattedDatabaseTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging.Database, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        databaseInstanceName="DB_Belval" writeLogStoredProcName="WriteLog"
        addCategoryStoredProcName="General" formatter="Text Formatter" />
    </listeners>
    <formatters>
      <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        template="Timestamp: {timestamp}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Priority: {priority}{newline}&#xA;EventId: {eventid}{newline}&#xA;Severity: {severity}{newline}&#xA;Title:{title}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;ProcessId: {localProcessId}{newline}&#xA;Process Name: {localProcessName}{newline}&#xA;Thread Name: {threadName}{newline}&#xA;Win32 ThreadId:{win32ThreadId}{newline}&#xA;Extended Properties: {dictionary({key} - {value}{newline})}"
        name="Text Formatter" />
    </formatters>
    <categorySources>
      <add switchValue="All" name="General">
        <listeners>
          <add name="Database Trace Listener" />
        </listeners>
      </add>
    </categorySources>
    <specialSources>
      <allEvents switchValue="All" name="All Events">
        <listeners>
          <add name="Database Trace Listener" />
        </listeners>
      </allEvents>
      <notProcessed switchValue="All" name="Unprocessed Category">
        <listeners>
          <add name="Database Trace Listener" />
        </listeners>
      </notProcessed>
      <errors switchValue="All" name="Logging Errors &amp; Warnings">
        <listeners>
          <add name="Database Trace Listener" />
        </listeners>
      </errors>
    </specialSources>
  </loggingConfiguration>
  <dataConfiguration defaultDatabase="DB_Belval" />
  <connectionStrings>
    <add name="DB_Belval" connectionString="Data Source=serverIP;Initial Catalog=APP_Dev;Persist Security Info=True;User=login;Password=password"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

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

Спасибо помог мне

** РЕДАКТИРОВАТЬ 1: **: logWriterFactory выглядит так, как будто он загрузил XML: visual_studio

РЕДАКТИРОВАТЬ 2: я отредактировал хранимую процедуру [dbo].[WriteLog], чтобы сделать своего рода флаг (один INSERT INTO [dbo].[TestLog]), чтобы узнать, является ли хранимая процедура вызывается, и похоже, что приложение не вызывает хранимую процедуру:

ALTER PROCEDURE [dbo].[WriteLog]
(
    @EventID int, 
    @Priority int, 
    @Severity nvarchar(32), 
    @Title nvarchar(256), 
    @Timestamp datetime,
    @MachineName nvarchar(32), 
    @AppDomainName nvarchar(512),
    @ProcessID nvarchar(256),
    @ProcessName nvarchar(512),
    @ThreadName nvarchar(512),
    @Win32ThreadId nvarchar(128),
    @Message nvarchar(1500),
    @FormattedMessage ntext,
    @LogId int OUTPUT
)
AS 


INSERT INTO [dbo].[TestLog]
           ([text]) VALUES ('Storeproc1')




    INSERT INTO [dbo].[Log] (
        EventID,
        Priority,
        Severity,
        Title,
        [Timestamp],
        MachineName,
        AppDomainName,
        ProcessID,
        ProcessName,
        ThreadName,
        Win32ThreadId,
        Message,
        FormattedMessage
    )
    VALUES (
        @EventID, 
        @Priority, 
        @Severity, 
        @Title, 
        @Timestamp,
        @MachineName, 
        @AppDomainName,
        @ProcessID,
        @ProcessName,
        @ThreadName,
        @Win32ThreadId,
        @Message,
        @FormattedMessage)

    SET @LogID = @@IDENTITY
    RETURN @LogID

И нет новых строк в [dbo].[TestLog], когда я запускаю UnitTest, поэтому проблема, похоже, в C#


person clement    schedule 02.07.2015    source источник
comment
@lrb где? Я поставил весь файл конфигурации UnitTest в вопрос. Я полагаю, да, потому что Logger.IsLoggingEnabled() возвращает true, нет? Спасибо чувак   -  person clement    schedule 02.07.2015
comment
По какой-то причине флаг TracingEnabled показывает false на вашем шаге, хотя в вашей конфигурации он установлен на true. Не знаю, проблема ли это, просто наблюдение.   -  person Ross Bush    schedule 02.07.2015
comment
@lrb хорошее наблюдение, но на самом деле я только что сравнил и внес некоторые изменения в свою конфигурацию из другого файла конфигурации (увидел здесь shahzy1.blogspot.com/2014/09/ ). Он поставил трассировку включенной в false, я пробовал в своей, но не работает... но спасибо (Сейчас я удаляю эту трассировку и она меняется и в переменной)   -  person clement    schedule 02.07.2015
comment
Вероятно, у вас есть исключение, записывающее в базу данных, которую проглатывает Enterprise Library. Добавьте прослушиватель трассировки ошибок на основе файлов и настройте специальный источник ошибок. Прямо сейчас источник ошибок записывает в базу данных, что и вызывает сбой (поэтому он не будет записываться). Это хорошо для устранения неполадок, но также полезно в рабочей среде, если вы хотите свести к минимуму потерю сообщений об ошибках (хотя они будут в другом формате).   -  person Randy supports Monica    schedule 05.07.2015


Ответы (1)


Похоже, вы уже потратили некоторое время на то, чтобы рвать на себе волосы. Мои 2 цента - собрать как можно больше отладочной информации. У меня нет опыта работы с EL.

Вот мои советы;

  1. Я бы посоветовал вам отслеживать ВСЕ транзакции/запросы в целевой базе данных. Для этого просто откройте SQL Profiler из SSMS и запустите его без какого-либо фильтра, кроме имени базы данных (или на всем сервере). Кстати, это локальная или удаленная БД? Если удаленно, отфильтруйте свое имя пользователя, чтобы избежать носа от других разработчиков/пользователей.

  2. Проверьте, нет ли отсутствующих DLL или исключений загрузки, вызванных EL. Используйте журнал Fusion. Я могу предоставить вам информацию о том, как его использовать, если это необходимо.

Запустите утилиту Fuslogvw.exe из инструментов MS SDK (C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools), возьмите самую старшую версию. Запустите от имени администратора, чтобы изменить настройки Fusion (установите для пользовательского пути к журналу значение «C:\Fuslog»). Создайте каталог «C:\Fuslog» (должен существовать, чтобы включить ведение журнала). ОТКЛЮЧИТЕ слияние, как только закончите.

  1. В окне «Исключения» Visual Studio отключите «Включить только мой код», включите «прерывать, когда исключение пересекает домен приложения или ...» (последнее не очень актуально в вашем случае, мы никогда не знаем).

Вы также можете включить ".NET Framework Source Stepping", но для загрузки символов потребуется некоторое время.

Если вы выберете этот, убедитесь, что символы правильно загружены для EL, отобразив окно символов.

Подробнее здесь: http://blogs.msdn.com/b/saraford/archive/2008/08/26/did-you-know-how-to-load-symbols-from-the-modules-window-299.aspx

Держать нас в курсе!

person Andrew    schedule 03.07.2015
comment
Большое спасибо за ваш ответ @andrew! Я не могу использовать профилировщик, потому что у меня не было права, кроме как ответить на ваш вопрос, db удален. Я пробовал fusionLog (средство просмотра журнала привязки сборки), ничего не появляется, когда я регистрирую текст исключения, если это то, что мне нужно попробовать: -/ - person clement; 03.07.2015
comment
и если я проверю перерыв, когда исключение пересекается с приложением..., приложение работает, ничего не меняется - person clement; 03.07.2015
comment
mm' Есть ли в EL по умолчанию сбой тишины? Например, NLog имеет свойство throwExceptions. Если True, он будет кричать, если что-то пойдет не так, иначе ничего не говорит... - person Andrew; 04.07.2015
comment
в соответствии с этим сообщением инструмент устранения неполадок, такой как внутренний журнал nlog "> stackoverflow.com/questions/6336595/, он что-то записывает в журнал Windows, если есть ошибка, но этого не происходит (я ничего не вижу в своем журнале Windows) - person clement; 07.07.2015
comment
Черт. Я видел на вашем скриншоте TracingEnabled = false для вашего logWriterFactory. Вы пытались установить его в True? - person Andrew; 07.07.2015
comment
Обратите внимание, если бы вы сказали мне, но какой тип приложения вы создаете? Хранится ли приложение в IIS или автономно (WPF, WinForm и т. д.)? Если вы размещены на IIS, не могли бы вы изменить идентификатор своего пула приложений на пользователя-администратора или, по крайней мере, на пользователя, на которого вы на 100prc уверены, что он может получить доступ к БД в CRUD. - person Andrew; 07.07.2015
comment
Да, я использую ту же строку подключения, что и приложение (CRUD в порядке с этой БД с этими учетными данными) - person clement; 07.07.2015