Hlavní menu

Nástroje

SlovnikTerminologie / JemnyUvodDoLogovani

View (print) - Edit page | Recent changes - Page history

Updated 31 October 2009, 18:09 by JanSobisek

SlovnikTerminologie.JemnyUvodDoLogovani History

Hide minor edits - Show changes to markup

31 October 2009, 18:09 by JanSobisek -
Changed lines 88-91 from:

Instance Loggeru může volat několik metod. Jména metod jsou závislá na úrovni logu, který chceme vytvořit. Můžeme volit z dostupné škály uvedené na začátku kapitoly. Parametrem metod je Object, tedy můžeme logovat vše co potřebujeme. Jen je potřeba myslet na to, aby z logu vystupovala smysluplná data.

to:

Instance Loggeru může volat několik metod. Jména metod jsou závislá na úrovni logu, který chceme vytvořit. Můžeme volit z dostupné škály uvedené na začátku kapitoly. Parametrem metod je Object, tedy můžeme logovat vše co potřebujeme. Jen je potřeba myslet na to, aby z logu vystupovala smysluplná data.

Odkazy

21 February 2009, 21:45 by Tomas Peterka -
Changed lines 2-3 from:

Vyjmuto z me BP.

to:

Vyjmuto z me BP. (TP)

21 February 2009, 21:41 by Tomas Peterka -
Changed lines 62-76 from:

Na začátku souboru se definují balíky, které chci logovat. První řádek říká, že budu logovat celý balík cz.zcu.kiv.spot, který se bude logovat od úrovně DEBUG a výše, a tomuto logování jsou přiřazeny appendery R a stdout. Na dalších dvou řádcích přiřazuji konkrétní dvě třídy LoginController a LogoutController appenderu U a logování od úrovně INFO.\par

Rozdělení appenderů má ten smysl, že například můžu zmiňované controllery logovat do souboru, kam se zapisuje pouze přihlašování a odhlašování uživatelů. Zbylé dva appendery slouží k běžnému logování, R appender slouží k logování do souboru a stdout k výpisu do příkazové řádky. \par

Dále je třeba nakonfigurovat konkrétní appendery. První řádka specifikuje způsob výstupu. V rámci aplikace se používá @[ConsoleAppender?@] a RollingFileAppender. U RollingFileAppenderu se musí nakonfigurovat výstupní soubor, buď absolutně nebo relativně. Dále se určí maximální velikost souboru. Maximální velikost neznamená, že se soubor při dosažení maximální velikosti začne od konce přepisovat, ale vytvoří se nový soubor, do kterého přenese data ze souboru původního a nové záznamy dále ukládá do původního souboru. Pak se konfiguruje, u obou výstupů stejně, vzor výstupu a poslední je ConversionPattern, tedy formát výstupu.

Nyní je aplikace připravena pro logování. Následuje příklad logování v java kódu. Nejdříve se musí vytvořit instance {\it Loggeru}:\par

\begin{center} \fontsize{10pt}{1} \selectfont \begin{verbatim} private Logger logger = Logger.getLogger(getClass()); \end{verbatim} \end{center}

to:

Na začátku souboru se definují balíky, které chci logovat. První řádek říká, že budu logovat celý balík cz.zcu.kiv.spot, který se bude logovat od úrovně DEBUG a výše, a tomuto logování jsou přiřazeny appendery R a stdout. Na dalších dvou řádcích přiřazuji konkrétní dvě třídy LoginController a LogoutController appenderu U a logování od úrovně INFO.

Rozdělení appenderů má ten smysl, že například můžu zmiňované controllery logovat do souboru, kam se zapisuje pouze přihlašování a odhlašování uživatelů. Zbylé dva appendery slouží k běžnému logování, R appender slouží k logování do souboru a stdout k výpisu do příkazové řádky.

Dále je třeba nakonfigurovat konkrétní appendery. První řádka specifikuje způsob výstupu. V rámci aplikace se používá ConsoleAppender a RollingFileAppender. U RollingFileAppenderu se musí nakonfigurovat výstupní soubor, buď absolutně nebo relativně. Dále se určí maximální velikost souboru. Maximální velikost neznamená, že se soubor při dosažení maximální velikosti začne od konce přepisovat, ale vytvoří se nový soubor, do kterého přenese data ze souboru původního a nové záznamy dále ukládá do původního souboru. Pak se konfiguruje, u obou výstupů stejně, vzor výstupu a poslední je ConversionPattern, tedy formát výstupu.

Nyní je aplikace připravena pro logování. Následuje příklad logování v java kódu. Nejdříve se musí vytvořit instance Loggeru:

private Logger logger = Logger.getLogger(getClass());

21 February 2009, 21:37 by Tomas Peterka -
Changed lines 62-63 from:

Na začátku souboru se definují balíky, které chci logovat. První řádek říká, že budu logovat celý balík {\tt cz.zcu.kiv.spot}, který se bude logovat od úrovně DEBUG a výše, a tomuto logování jsou přiřazeny appendery R a stdout. Na dalších dvou řádcích přiřazuji konkrétní dvě třídy {\it LoginController?} a {\it LogoutController?} appenderu U a logování od úrovně INFO.\par

to:

Na začátku souboru se definují balíky, které chci logovat. První řádek říká, že budu logovat celý balík cz.zcu.kiv.spot, který se bude logovat od úrovně DEBUG a výše, a tomuto logování jsou přiřazeny appendery R a stdout. Na dalších dvou řádcích přiřazuji konkrétní dvě třídy LoginController a LogoutController appenderu U a logování od úrovně INFO.\par

Changed lines 66-67 from:

Dále je třeba nakonfigurovat konkrétní appendery. První řádka specifikuje způsob výstupu. V rámci aplikace se používá {\it ConsoleAppender?} a {\it RollingFileAppender?}. U {\it RollingFileAppenderu?} se musí nakonfigurovat výstupní soubor, buď absolutně nebo relativně. Dále se určí maximální velikost souboru. Maximální velikost neznamená, že se soubor při dosažení maximální velikosti začne od konce přepisovat, ale vytvoří se nový soubor, do kterého přenese data ze souboru původního a nové záznamy dále ukládá do původního souboru. Pak se konfiguruje, u obou výstupů stejně, vzor výstupu a poslední je {\it ConversionPattern?}, tedy formát výstupu.\par

to:

Dále je třeba nakonfigurovat konkrétní appendery. První řádka specifikuje způsob výstupu. V rámci aplikace se používá @[ConsoleAppender?@] a RollingFileAppender. U RollingFileAppenderu se musí nakonfigurovat výstupní soubor, buď absolutně nebo relativně. Dále se určí maximální velikost souboru. Maximální velikost neznamená, že se soubor při dosažení maximální velikosti začne od konce přepisovat, ale vytvoří se nový soubor, do kterého přenese data ze souboru původního a nové záznamy dále ukládá do původního souboru. Pak se konfiguruje, u obou výstupů stejně, vzor výstupu a poslední je ConversionPattern, tedy formát výstupu.

21 February 2009, 21:32 by Tomas Peterka -
Changed lines 77-85 from:

Tento {\it Logger} si drží informaci o třídě, ve které je vytvořen. Pokud by bylo třeba použití statického logger, pak jen nahradíme {\it getClass()} za {\it Trida.class}.\par

Nyní už jen stačí na patřičném místě v kódu vytvořit logovací zprávu. Následují 2 příklady:\par

\begin{center} \fontsize{10pt}{1} \selectfont \begin{verbatim}

to:

Tento Logger si drží informaci o třídě, ve které je vytvořen. Pokud by bylo třeba použití statického logger, pak jen nahradíme getClass() za Trida.class.

Nyní už jen stačí na patřičném místě v kódu vytvořit logovací zprávu. Následují 2 příklady:

[@

Changed lines 85-96 from:

} \end{verbatim} \end{center}

Kód představuje zachycení vyjímky v try-catch bloku uvnitř controlleru.\par

\begin{center} \fontsize{10pt}{1} \selectfont \begin{verbatim} logger.info("Prihlaseni uzivatele: " + sessionUser.getLogin()

to:

}@]

Kód představuje zachycení vyjímky v try-catch bloku uvnitř controlleru.

[@logger.info("Prihlaseni uzivatele: " + sessionUser.getLogin()

Changed lines 91-112 from:

\end{verbatim} \end{center}

Tento kousek kódu stačí k zápisu přihlášení uživatele tak, jak je vidět na obrázku \ref{log-users}\par

\begin{figure}[h]

	\begin{center}
    \includegraphics[width=0.8\linewidth]{pcs/log-users.eps}
	\caption{Výpis logovacího souboru, který loguje aktivitu uživatelů.}
	\label{log-users}
	\end{center}

\end{figure}

Instance {\it Loggeru} může volat několik metod. Jména metod jsou závislá na úrovni logu, který chceme vytvořit. Můžeme volit z dostupné škály uvedené na začátku kapitoly. Parametrem metod je {\it Object}, tedy můžeme logovat vše co potřebujeme. Jen je potřeba myslet na to, aby z logu vystupovala smysluplná data. Výstup z logu je vidět na obrázku \ref{log-commons}.\par \newpage \begin{figure}[h]

	\begin{center}
    \includegraphics[width=0.99\linewidth]{pcs/log-commons.eps}
	\caption{Výpis logovacího souboru.}
	\label{log-commons}
	\end{center}

\end{figure}

to:

@]

Instance Loggeru může volat několik metod. Jména metod jsou závislá na úrovni logu, který chceme vytvořit. Můžeme volit z dostupné škály uvedené na začátku kapitoly. Parametrem metod je Object, tedy můžeme logovat vše co potřebujeme. Jen je potřeba myslet na to, aby z logu vystupovala smysluplná data.

21 February 2009, 21:24 by Tomas Peterka -
Changed lines 1-3 from:

Logování - jemný úvod

Vyjmuto z me BP...

to:

Logování

Vyjmuto z me BP.

Motivace

Changed lines 7-51 from:

Přestože nám logování pomocí logovacích frameworků poskytuje možnosti, které se s {\it System.out.println()} nedají srovnávat, stále se setkávám s tím, že valná část studentů používá zásadně {\it System.out.println()}. Bohužel o takovýchto frameworcích ještě neslyšeli a v případě, že slyšeli, tak povětšinou tvrdí, že použití je příliš složité. Při tom ale bez logování se na profesionální úrovni neobejde žádný projekt. Použitím logovacího frameworku můžeme zrychlit vývoj aplikace a vlastní kód logování je přímý a přehledný. \par

\newpage Při psaní logů jsem se rozhodl použít 4 úrovně logování:\par

\begin{list}{}{} \item DEBUG - používám pro logování informací potřebných pro vývoj aplikace. \item INFO - používám pro logování aktivity uživatelů a informativní hlášky, o kterých si myslím, že by se v logu mohly vyskytnout. \item WARN - používám pro logování méně významných exceptions chycených v try-catch blocích, které nevedou k omezení funkčnosti aplikace. \item ERROR - používám pro logování exceptions chycených v try-catch blocích, při kterých dojde k omezení funkčnosti, případně spadnutí aplikace. \end{list}

\subsection{Realizace} Implementace logování pomocí framework log4j není nijak složitá. Stačí mít správně nakonfigurovaného listenera a připravený property soubor log4j.properties a pak už programátor může psát vlastní logování uvnitř tříd aplikace. Na následujích řádcích je popsáno, jak snadno lze logování aplikace zprovoznit. \par

Nejdříve jsem si připravil logování aplikace v souboru {\it web.xml}.\par

\begin{center} \fontsize{10pt}{1} \selectfont \begin{verbatim}

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/properties/log4j.properties</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.util.Log4jConfigListener?
        </listener-class>
    </listener>

\end{verbatim} \end{center}

První context-param určuje umístění, kde se nachází konfigurační soubor pro log4j {\it log4j.properties}. Logování by ale nefungovalo bez potřebného listeneru. Tento {\it Log4jConfigListener?} nám zajišťuje načtení konfigurace a následné zapisování do patřičných lokací uvedených v konfiguračním souboru.\par

\newpage Dále je třeba zanést konfiguraci do souboru:\par

\begin{center} \fontsize{10pt}{1} \selectfont \begin{verbatim}

log4j.category.cz.zcu.kiv.spot=DEBUG, stdout, R

to:

Přestože nám logování pomocí logovacích frameworků poskytuje možnosti, které se s System.out.println() nedají srovnávat, stále se setkávám s tím, že valná část studentů používá zásadně System.out.println(). Bohužel o takovýchto frameworcích ještě neslyšeli a v případě, že slyšeli, tak povětšinou tvrdí, že použití je příliš složité. Při tom ale bez logování se na profesionální úrovni neobejde žádný projekt. Použitím logovacího frameworku můžeme zrychlit vývoj aplikace a vlastní kód logování je přímý a přehledný.

Při psaní logů jsem se rozhodl použít 4 úrovně logování:

  • DEBUG - používám pro logování informací potřebných pro vývoj aplikace.
  • INFO - používám pro logování aktivity uživatelů a informativní hlášky, o kterých si myslím, že by se v logu mohly vyskytnout.
  • WARN - používám pro logování méně významných exceptions chycených v try-catch blocích, které nevedou k omezení funkčnosti aplikace.
  • ERROR - používám pro logování exceptions chycených v try-catch blocích, při kterých dojde k omezení funkčnosti, případně spadnutí aplikace.

Realizace

Implementace logování pomocí framework log4j není nijak složitá. Stačí mít správně nakonfigurovaného listenera a připravený property soubor log4j.properties a pak už programátor může psát vlastní logování uvnitř tříd aplikace. Na následujích řádcích je popsáno, jak snadno lze logování aplikace zprovoznit.

Nejdříve jsem si připravil logování aplikace v souboru web.xml.

 <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/properties/log4j.properties</param-value>
 </context-param>

 <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 </listener>

První context-param určuje umístění, kde se nachází konfigurační soubor pro log4j log4j.properties. Logování by ale nefungovalo bez potřebného listeneru. Tento Log4jConfigListener nám zajišťuje načtení konfigurace a následné zapisování do patřičných lokací uvedených v konfiguračním souboru.

Dále je třeba zanést konfiguraci do souboru:

[@log4j.category.cz.zcu.kiv.spot=DEBUG, stdout, R

Changed lines 60-63 from:

\end{verbatim} \end{center}

to:

@]

21 February 2009, 21:14 by Tomas Peterka -
Added lines 1-141:

Logování - jemný úvod

Vyjmuto z me BP...

Použití logovacího frameworku log4j namísto klasického System.out.println() má mnoho výhod. Mezi nimi jsou různé typy výstupů(xml soubor, příkazová řádka, log soubor, GUI komponenta, vzdálený socket server, JMS, NT Event Loggers, a vzdálený UNIX Syslog daemon). Možnost centrální konfigurace přes properties soubor. Předdefinovaná hiearchie úrovní logování(TRACE, DEBUG, INFO, WARN, ERROR a FATAL) s možností vytvoření vlastní úrovně logování pro nějaké speciální případy. Snadná implementace do aplikace. Poslední výhodou je snadno nastavitelný formát záznamů, do kterého můžeme snadno zanést mnoho rozličných informací.

Přestože nám logování pomocí logovacích frameworků poskytuje možnosti, které se s {\it System.out.println()} nedají srovnávat, stále se setkávám s tím, že valná část studentů používá zásadně {\it System.out.println()}. Bohužel o takovýchto frameworcích ještě neslyšeli a v případě, že slyšeli, tak povětšinou tvrdí, že použití je příliš složité. Při tom ale bez logování se na profesionální úrovni neobejde žádný projekt. Použitím logovacího frameworku můžeme zrychlit vývoj aplikace a vlastní kód logování je přímý a přehledný. \par

\newpage Při psaní logů jsem se rozhodl použít 4 úrovně logování:\par

\begin{list}{}{} \item DEBUG - používám pro logování informací potřebných pro vývoj aplikace. \item INFO - používám pro logování aktivity uživatelů a informativní hlášky, o kterých si myslím, že by se v logu mohly vyskytnout. \item WARN - používám pro logování méně významných exceptions chycených v try-catch blocích, které nevedou k omezení funkčnosti aplikace. \item ERROR - používám pro logování exceptions chycených v try-catch blocích, při kterých dojde k omezení funkčnosti, případně spadnutí aplikace. \end{list}

\subsection{Realizace} Implementace logování pomocí framework log4j není nijak složitá. Stačí mít správně nakonfigurovaného listenera a připravený property soubor log4j.properties a pak už programátor může psát vlastní logování uvnitř tříd aplikace. Na následujích řádcích je popsáno, jak snadno lze logování aplikace zprovoznit. \par

Nejdříve jsem si připravil logování aplikace v souboru {\it web.xml}.\par

\begin{center} \fontsize{10pt}{1} \selectfont \begin{verbatim}

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/properties/log4j.properties</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.util.Log4jConfigListener?
        </listener-class>
    </listener>

\end{verbatim} \end{center}

První context-param určuje umístění, kde se nachází konfigurační soubor pro log4j {\it log4j.properties}. Logování by ale nefungovalo bez potřebného listeneru. Tento {\it Log4jConfigListener?} nám zajišťuje načtení konfigurace a následné zapisování do patřičných lokací uvedených v konfiguračním souboru.\par

\newpage Dále je třeba zanést konfiguraci do souboru:\par

\begin{center} \fontsize{10pt}{1} \selectfont \begin{verbatim}

log4j.category.cz.zcu.kiv.spot=DEBUG, stdout, R log4j.category.cz.zcu.kiv.spot.controllers.LogoutController?=INFO, U log4j.category.cz.zcu.kiv.spot.controllers.LoginController?=INFO, U

  1. log4j.logger.org.springframework.web.servlet=DEBUG, stdout, R
  2. log4j.logger.org.springframework=DEBUG, stdout, R
  3. Nastaveni logovani pro konsoli

log4j.appender.stdout=org.apache.log4j.ConsoleAppender? log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout? log4j.appender.stdout.layout.ConversionPattern?=%5p C{1}:L):n

  1. Nastaveni logovani pro vystup do souboru

log4j.appender.R=org.apache.log4j.RollingFileAppender? log4j.appender.R.File=logs/spot-commons.log log4j.appender.R.MaxFileSize?=5MB log4j.appender.R.layout=org.apache.log4j.PatternLayout? log4j.appender.R.layout.ConversionPattern?=%5p c{1}:L) : n

  1. Appender pro logovani prihlaseni a odhlaseni uzivatelu

log4j.appender.U=org.apache.log4j.RollingFileAppender? log4j.appender.U.File=logs/spot-users.log log4j.appender.U.MaxFileSize?=5MB log4j.appender.U.layout=org.apache.log4j.PatternLayout? log4j.appender.U.layout.ConversionPattern?=%d{yyyy-MM-dd HH:mm:ss} - n

\end{verbatim} \end{center}

Na začátku souboru se definují balíky, které chci logovat. První řádek říká, že budu logovat celý balík {\tt cz.zcu.kiv.spot}, který se bude logovat od úrovně DEBUG a výše, a tomuto logování jsou přiřazeny appendery R a stdout. Na dalších dvou řádcích přiřazuji konkrétní dvě třídy {\it LoginController?} a {\it LogoutController?} appenderu U a logování od úrovně INFO.\par

Rozdělení appenderů má ten smysl, že například můžu zmiňované controllery logovat do souboru, kam se zapisuje pouze přihlašování a odhlašování uživatelů. Zbylé dva appendery slouží k běžnému logování, R appender slouží k logování do souboru a stdout k výpisu do příkazové řádky. \par

Dále je třeba nakonfigurovat konkrétní appendery. První řádka specifikuje způsob výstupu. V rámci aplikace se používá {\it ConsoleAppender?} a {\it RollingFileAppender?}. U {\it RollingFileAppenderu?} se musí nakonfigurovat výstupní soubor, buď absolutně nebo relativně. Dále se určí maximální velikost souboru. Maximální velikost neznamená, že se soubor při dosažení maximální velikosti začne od konce přepisovat, ale vytvoří se nový soubor, do kterého přenese data ze souboru původního a nové záznamy dále ukládá do původního souboru. Pak se konfiguruje, u obou výstupů stejně, vzor výstupu a poslední je {\it ConversionPattern?}, tedy formát výstupu.\par

Nyní je aplikace připravena pro logování. Následuje příklad logování v java kódu. Nejdříve se musí vytvořit instance {\it Loggeru}:\par

\begin{center} \fontsize{10pt}{1} \selectfont \begin{verbatim} private Logger logger = Logger.getLogger(getClass()); \end{verbatim} \end{center}

Tento {\it Logger} si drží informaci o třídě, ve které je vytvořen. Pokud by bylo třeba použití statického logger, pak jen nahradíme {\it getClass()} za {\it Trida.class}.\par

Nyní už jen stačí na patřičném místě v kódu vytvořit logovací zprávu. Následují 2 příklady:\par

\begin{center} \fontsize{10pt}{1} \selectfont \begin{verbatim} catch (Exception e) {

    logger.error("Nastala chyba v aplikaci. " + e);
    mv.addObject("errorImportMsg", "db.access-error");

} \end{verbatim} \end{center}

Kód představuje zachycení vyjímky v try-catch bloku uvnitř controlleru.\par

\begin{center} \fontsize{10pt}{1} \selectfont \begin{verbatim} logger.info("Prihlaseni uzivatele: " + sessionUser.getLogin()

             + " IP: " + request.getRemoteAddr());

\end{verbatim} \end{center}

Tento kousek kódu stačí k zápisu přihlášení uživatele tak, jak je vidět na obrázku \ref{log-users}\par

\begin{figure}[h]

	\begin{center}
    \includegraphics[width=0.8\linewidth]{pcs/log-users.eps}
	\caption{Výpis logovacího souboru, který loguje aktivitu uživatelů.}
	\label{log-users}
	\end{center}

\end{figure}

Instance {\it Loggeru} může volat několik metod. Jména metod jsou závislá na úrovni logu, který chceme vytvořit. Můžeme volit z dostupné škály uvedené na začátku kapitoly. Parametrem metod je {\it Object}, tedy můžeme logovat vše co potřebujeme. Jen je potřeba myslet na to, aby z logu vystupovala smysluplná data. Výstup z logu je vidět na obrázku \ref{log-commons}.\par \newpage \begin{figure}[h]

	\begin{center}
    \includegraphics[width=0.99\linewidth]{pcs/log-commons.eps}
	\caption{Výpis logovacího souboru.}
	\label{log-commons}
	\end{center}

\end{figure}