Kontrola wersji bazy danych – SQL Source Control

Dzisiaj zostały udostępnione pierwsze screeny z nowego produktu firmy RedGateSQL Source Control.

SQL Source Control jest dodatkiem do dobrze znanego MS SQL Management Studio umożliwiającym podpięcie bazy danych pod system kontroli wersji, podobnie jak to robimy ze standardowym projektem.

Po pierwszym “zlinkowaniu” bazy z repozytorium tworzony jest skrypt do każdego obiektu z bazy. Następnie możemy “podglądać” wszystkie zmiany wprowadzone w bazie od czasu zlinkowania bazy oraz te zmiany wkomitować.

SSC_1

SSC_3

SSC_4

SSC_5

Docelowo SQL Source Control ma współpracować z Subversion oraz Team Foundation Server.

Pierwsza wersja tego narzędzia będzie dostępna w przeciągu dwóch miesięcy i będzie obsługiwała jedynie Subversion.

Nie wiem, jak dla Was, ale dla mnie kwestia zarządzania wersjami bazy danych jest dość dużym problemem. Mam nadzieję, że ten program to zmieni.

Więcej informacji na stronie: http://www.red-gate.com/products/SQL_Source_Control/. Tam również można się zapisać do programu Early Access Program.

chcę oglądać Twoje logi! – fLogViewer

Zgodnie z obietnicą dzisiaj chciałbym przedstawić program, który znacznie ułatwia czytanie logów – fLogViewer 6.8

flogviewer1

A oto co nam oferuje fLogViewer:

  • obsługuje wszystkie formaty plików tekstowych
  • dynamicznie aktualizuje zawartość analizowanych plików, co umożliwia czytanie logowanych zdarzeń na bieżąco – bardzo dobrze radzi sobie z dużymi plikami
  • umożliwia definiowanie zasad kolorowania linii – można np. ustawić, by każda linijka zawierająca [ERROR] miała kolor czerwony
  • możemy definiować własne filtry – domyślnie mamy ‘today’ oraz ‘dangerous ip’ – czyli możemy np. ograniczyć wyświetlanie logów tylko do tych, które są związane z daną klasą

flogviewer2

Niestety aplikacja chyba już nie jest rozwijana i ciężko znaleźć stronę, z której można ją pobrać.

Dlatego umieszczam instalkę tutaj – pobierz fLogViewer 6.8

Quick Tip: 07. Firefox – Smart keywords

Dzisiaj krótko na temat, jak ułatwić sobie pracę z Firefoxem.

Firefox posiada bardzo przydatny mechanizm – “Smart keywords“. Umożliwia on definiowanie słów kluczowych dla pól wyszukiwania na stronach.

Aby dodać nowe słowo kluczowe klikamy prawym przyciskiem myszki na danym polu i wybieramy: “Utwórz słowo kluczowe dla tej wyszukiwarki…“,

ff1

w nowym okienku “Nowa zakładka” podajemy nazwę zakładki oraz słowo kluczowe.

Dla google można zrobić tak:

ff2

po takiej konfiguracji w przeglądarce (jako adres) wpisujemy np. “g asp.net”  i uzyskujemy wyniki wyszukiwania dla asp.net :)

Takie skróty możemy definiować dla dowolnego pola na stronie www.

Ja np. często korzystam  ze skrótu “b + numer issue” jako odwołanie do BugTrackera.

Proste i bardzo przydatne :)

log4net – logujemy zdarzenia w aplikacji

Dzisiaj chciałbym poruszyć ważny element tworzenia aplikacji – logowanie zdarzeń. Odpowiednio przygotowane logi są często jedynym sposobem na zdiagnozowanie problemu w aplikacji, dlatego warto o tym pamiętać i z logowania korzystać.

Logowanie można przeprowadzić na wiele sposobów – ja chciałbym opisać przykład oparty na darmowej bibliotece log4net.

Temat ten podzieliłem na trzy części:

  • dzisiaj pokażę jak korzystać z log4net
  • w następnym poście pokażę, jak czytać/analizować logi
  • na koniec opiszę podstawową konfigurację log4net

To zaczynamy:
bibliotekę pobieramy ze strony: http://logging.apache.org/log4net/download.html. Z pobranego archiwum wypakowujemy plik: log4net.dll (incubating-log4net-1.2.10.ziplog4net-1.2.10binnet2.0releaselog4net.dll) i wgrywamy go np. do katalogu “lib“. Następnie dodajemy referencję do tego pliku.

log4net1

W swoich aplikacjach korzystam z takiej klasy:

[sourcecode language=”csharp”]
public class LogHelper
{
static LogHelper()
{
var confFile = ConfigurationSettings.AppSettings.Get("log4net.config");
var fi = new FileInfo(confFile);
XmlConfigurator.Configure(fi);
}

public static ILog GetLog()
{
return LogManager.GetLogger("WebAppLog");
}
}
[/sourcecode]

Jak widać w pliku Web.config podajemy ścieżkę do pliku konfiguracyjnego, czyli:

[sourcecode language=”xml”]
<appSettings>
<add key="log4net.config" value="conflog4net.config"/>
</appSettings>
[/sourcecode]

Brakuje jeszcze zawartości pliku log4net.config:

[sourcecode language=”xml”]
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<file value="logstest_log.log" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<param name="StaticLogFileName" value="true"/>
<appendToFile value="true" />
<param name="RollingStyle" value="Date"/>
<param name="DatePattern" value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %type.%method – %message%newline"/>
</layout>
</appender>

<logger name="WebAppLog">
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</logger>
</log4net>
[/sourcecode]

Podana konfiguracja zapisuje logi do pliku (może to być również baza danych, e-mail, konsola lub inne źródło) – file określa, do jakiego pliku będą zapisywane logi, a layout określa format zapisu logów.

Samo logowanie jest operacją niezwykle prostą:

[sourcecode language=”csharp”]
LogHelper.GetLog().Info("My sample comments");
[/sourcecode]

lub

[sourcecode language=”csharp”]
catch (Exception ex)
{
LogHelper.GetLog().Error("Error occurred!", ex);
}
[/sourcecode]

log4net dostarcza kilka poziomów logowania:

  • Debug
  • Info
  • Warn
  • Error
  • Fatal

Nazwy poziomów logowania są bardzo czytelne i nie wymagają większego opisu.

Powyższy kod w logu zapisać może coś takiego:

[sourcecode language=”text”]
2009-12-07 22:22:33,202 [8] INFO  LogForNetWebSample._Default.Page_Load – My sample comments
2009-12-07 22:22:33,292 [8] ERROR LogForNetWebSample._Default.Page_Load – Error occurred!
System.DivideByZeroException: Attempted to divide by zero.
at LogForNetWebSample._Default.Page_Load(Object sender, EventArgs e) in Default.aspx.cs:line 14
[/sourcecode]

Jak widać log zawiera wiele cennych dla nas informacji – wiemy, kiedy i co się zdarzyło oraz w jakiej metodzie. Wiemy również, co działo się w aplikacji zanim wystąpił wyjątek.

Osobiście jestem zwolennikiem logowania jak największej ilości zdarzeń w naszej aplikacji – użytkownik wchodzi na stronę, klika button A, pobrano dane użytkownika, itp – jako poziom Debug. Przy przenoszeniu aplikacji na serwer produkcyjny możemy ograniczyć poziom logowania i logować jedynie logi z poziomu Error, Fatal czy Warn – bez zmiany kodu aplikacji!
log4net jest biblioteką bardzo elastyczną i posiada wiele parametrów konfiguracyjnych.

Oczywiście podczas logowania trzeba uważać, żeby nie zalogować danych poufnych – np. haseł.

Dzisiaj to tyle – zachęcam do zabawy z log4net i czytaniem logów – tylko uwaga – TO UZALEŻNIA!! :)

Quick Tip: 06. zamieniamy URL na link

Dzisiaj prosty przykład jak w tekście zamienić url na link, czyli np. użytkownik wpisuje:

“Zapraszam na moją stronę http://gasior.net.pl”

a my wyświetlając ten tekst chcemy otrzymać coś takiego

“Zapraszam na moją stronę <a href=”http://gasior.net.pl”>http://gasior.net.pl</a>

Z pomocą przychodzą wyrażenia regularne:

[sourcecode language=”csharp”]
protected string ConvertUrlsToLinks(string msg)
{
Regex r = new Regex("(http://[^ ]+)");
return r.Replace(msg, "<a href="$1">$1</a>");
}
[/sourcecode]

Jeżeli zachodzi taka potrzeba możemy ten sam efekt uzyskać w JavaScripcie:

[sourcecode language=”csharp”]
var objRegExp = /(http:[^ ]+)/g;
var convertedValue = msg.replace(objRegExp, "<a href=’$1′>$1</a>");
[/sourcecode]

EDIT:
w nawiązaniu do słusznej uwagi z komentarza (użytkownik apl) podaję poprawioną, dokładniejszą metodę:
[sourcecode language=”csharp”]
var reg = @"((www.|(http|https)+://)[&#95;.a-z0-9-]+.[a-z0-9/&#95;:@=.+?,##%&~-]*[^.|’|# |!|(|?|,| |>|<|;|)])";
Regex r = new Regex(reg, RegexOptions.IgnoreCase);
return r.Replace(msg, "<a href="$1">$1</a>").Replace("href="www", "href="http://www");
[/sourcecode]