2012-05-22 2 views
4

Исходная ситуация. В фоновом режиме есть большое приложение Winform с большим количеством диалогов и базы данных Oracle. Теперь существует потребность в реализации функции регистрации аудита, которая регистрирует изменения данных (до/после) пользователями (для последующих аудитов аудиторскими отделами компании) в некоторых диалоговых окнах. Как бы вы интегрировали такую ​​функцию ведения журнала? Кстати, лог-информация должна быть сохранена в базе данных (таблица истории), а приложение-администратор Winform-решения должно предоставить диалог браузера для данных ведения журнала.Вход в приложение Winform

Существуют ли существующие решения или каркасы, которые можно использовать. Имеет ли смысл использовать фреймворк регистрации, например NLOG, или лучше реализовать такой конкретный журнал с нуля?

+2

Вы можете попробовать Log4net или Microsoft Application Log Block. –

+0

Я лично использовал log4net, завернутый в свой собственный код, который уменьшает количество строк, необходимых для регистрации сообщения. Мой код просматривает зарегистрированного пользователя и добавляет некоторые другие общие сведения, которые имеют смысл для моего приложения. При некоторой тщательной настройке вы не потеряете мелкозернистый контроль log4net для ведения журнала. –

ответ

1

Многие люди игнорируют тот факт, что .NET имеет довольно мощную систему ведения журнала, построенную с использованием Trace class. Приятная часть - вы можете использовать его немедленно без какой-либо настройки, получать сообщения в окне отладки и когда вам действительно нужны файлы журнала, вы можете настроить Trace Listeners.

2

У вас есть несколько вариантов для этого, и ни один из них не включает регистрацию на системном уровне, которую некоторые предлагают.

Варианты:

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

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

EDIT:

Почему вам не нужно NLog или log4net

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

+0

Это совсем не очевидно. Фактически, OP говорит, что регистрация необходима «в некоторых диалоговых окнах», подразумевая, что требование заключается не в регистрации всех изменений - только в определенных диалогах. Будет гораздо сложнее установить ведение журнала на уровне базы данных, чем интегрировать структуру, такую ​​как log4net. –

+0

Я абсолютно уверен, что это будет сложнее, но зарегистрированные данные должны войти в базу данных, чтобы обозреватели все равно увидели. –

+0

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

6

Я создал довольно простой статический класс Logger, который просто имеет метод, который берет строку и регистрирует текущий DateTime с StreamWriter. Мне нравится писать собственные журналы, потому что это позволяет мне форматировать вывод, как я хочу. Вот краткий пример того, что мина выглядит следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace LoggerSpace 
{ 
    public static class Logger 
    { 
     private static StreamWriter swLog; 
     private const string sLOG_FILE_PATH = "log.txt";  

     static Logger() 
     { 
      Logger.OpenLogger(); 
     } 

     public static void OpenLogger() 
     { 
      Logger.swLog = new StreamWriter(sLOG_FILE_PATH, false); 
      Logger.swLog.AutoFlush = true; 
     } 

     public static void LogThisLine(string sLogLine) 
     { 
      Logger.swLog.WriteLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + "\t:" + "\t" + sLogLine); 
      Logger.swLog.Flush(); 
     } 

     public static void CloseLogger() 
     { 
      Logger.swLog.Flush(); 
      Logger.swLog.Close(); 
     } 
    } 
} 

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

+1

Я сделал это до того, как был представлен в nLog. Посмотрите на это, он достаточно прост и имеет все необходимые функции (форматирование). –

+0

Простая и эффективная! Хорошая идея ;) –

0

Если вы хотите регистрировать данные (в базе данных), вы должны использовать функции журнала, предлагаемые базой данных (с хранимой процедурой, триггером и в зависимости от встроенных функций продукта базы данных, таких как SQL Server Change Data Capture), потому что большую часть времени вы хотите регистрировать событие независимо от приложения/процесса (приложение Winforms, веб-сайт, программное обеспечение для управления базами данных), которые запускают его.

Вы не хотите (или не прощаете) воссоздать свои функции журнала в следующем новом клиентском приложении.

Используйте систему журнала приложение, если вы хотите, чтобы отслеживать события об использовании приложения (аварии, нажмите на кнопку, время начала, ...)

Предоставление доступа к журналу и сделать его читаемым человеком является еще история.

Смежные вопросы