Articles

Jak Log4J2 Funguje: 10 Způsobů, jak se Dostat co Nejvíce Z toho

Log4j2 je aktualizovaná verze populární a vlivný log4j knihovna, používán značně v průběhu Java ekosystém pro tak mnoho let. Verze 2.x udržuje všechny funkce protokolování svého předchůdce a staví na tomto základu s některými významnými vylepšeními, zejména v oblasti výkonu.

a samozřejmě, vzhledem k tomu, jak instrumentální protokolování je pro každou aplikaci, a to jak pro účely auditu a ladění, výběr pevné knihovny protokolování je docela důležité rozhodnutí.

v následujících částech se podíváme na to, proč je knihovna log4j2 skvělou volbou pro toto rozhodnutí a jak ji můžeme použít v aplikaci.

základní konfigurace Log4j2

Chcete-li začít používat log4j2 ve vašem projektu, stačí přidat závislost log4j-core. Pokud používáte Maven, můžete do svého pom přidat následující závislost.xml soubor:

a pokud pracujete s Gradle, musíte přidat závislost do sestavení.gradle souboru:

dependencies { compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.8.2'}

po Vybalení z krabice, log4j2 automaticky poskytnout jednoduchou konfiguraci, pokud nechcete explicitně definovat sami. Výchozí konfigurace se přihlásí do konzoly na úrovni chyb nebo vyšší.

Chcete-li začít protokolovat zprávy pomocí této základní konfigurace, stačí získat instanci loggeru pomocí třídy LogManager:

private static Logger logger = LogManager.getLogger(MyService.class);

Pak můžete použít logger objekt, pomocí metody odpovídající úroveň protokolu chcete:

logger.error("This is an error message");

Přizpůsobení Log4j2 Konfigurace

vlastní log4j2 konfigurace mohou být vytvořeny buď programově nebo prostřednictvím konfiguračního souboru.

knihovna podporuje konfigurační soubory napsané v XML, JSON, YAML, stejně jako .formát vlastností. Zde budeme používat XML, abychom diskutovali především o všech příkladech.

nejprve můžete přepsat výchozí konfiguraci jednoduše vytvořením log4j2.xml soubor na classpath:

Pojďme se blíže podívat na značky používané v této jednoduché konfigurace:

  • Konfigurace: kořenový prvek log4j2 konfigurační soubor, stav atribut představuje úroveň, na které vnitřní log4j události by měly být přihlášen
  • Appenders: tento prvek obsahuje seznam appenders; v našem příkladu, appender odpovídající Systém konzole je definována
  • Dřevorubci: tento prvek obsahuje seznam instance Logger. Kořenový element je standardní logger, který vypíše všechny zprávy

je důležité pochopit, že Root logger je povinné v každé konfiguraci. Jak bylo uvedeno, pokud jej neposkytnete, bude ve výchozím nastavení automaticky nakonfigurován s appenderem konzoly a úrovní protokolu chyb.

konfigurace Appenderů

v architektuře log4j2 je appender v podstatě zodpovědný za odesílání zpráv protokolu do určitého výstupního cíle.

zde jsou některé z nejužitečnějších typů appenderů, které Knihovna poskytuje:

  • ConsoleAppender – protokoly, zprávy k konzoly Systému
  • FileAppender – píše zprávy protokolu do souboru
  • RollingFileAppender – píše zprávy k válcování log
  • JDBCAppender – použití relační databáze pro logy
  • AsyncAppender – obsahuje seznam dalších appenders a určuje protokoly pro tyto být napsán v samostatném vlákně

Pro lepší pochopení, jak appenders práce, pojďme se podívat na některé příklady konfigurace.

RollingFileAppender

logování všeho do jednoho souboru samozřejmě není ideální. Obvykle je mnohem lepší pravidelně převrátit aktivní soubor protokolu – což je přesně to, co RollingFileAppender dělá.

budete také moci jít nad rámec základů s tímto typem appenderu a nakonfigurovat jak vlastní spouštěcí politiku,tak strategii převrácení.

spouštěcí politika určuje, kdy je soubor protokolu válcované za tepla, což znamená, že je vytvořen nový soubor, zatímco převrácení strategie určuje, jak souboru, je vrácena.

Jako rychlý příklad, pojďme konfigurace appender, že vytvoří nový soubor protokolu na základě 3 zásady:

  • OnStartupTriggeringPolicy – nový soubor protokolu je vytvořen pokaždé, když JVM začne
  • TimeBasedTriggeringPolicy – soubor protokolu je vrácena založené na datum/čas vzor
  • SizeBasedTriggeringPolicy – souboru je vrácena, když to dosáhne určité velikosti

konfigurace bude používat DefaultRolloverStrategy:

můžete vidět, jak flexibilní je tento styl konfigurace a jak můžete naladit přesnou sémantiku vaší logovací strategie-až do posledního detailu.

Jdbcappender

Jak název napovídá, tento appender používá JDBC k zápisu protokolů do relační databáze.

pro tuto konfiguraci je třeba definovat ConnectionSource, který může být buď zdrojem dat JNDI, nebo vlastní ConnectionFactory. Logger používá ConnectionSource k získání připojení JDBC, proto je důležité použít fond připojení pro lepší výkon.

Chcete-li nakonfigurovat appender v konfiguračním souboru XML, můžete použít značku JDBC:

jak vidíte, zdroj dat JNDI je jednoduše specifikován pomocí atributu jndiname značky DataSource. Spolu s ConnectionSource můžete definovat tabulku a sloupce, které mají být použity pro ukládání dat protokolu.

FailoverAppender

a Konečně, pojďme se podívat na FailoverAppender; to definuje primární appender a seznam záloh, které bude krokem zvládnout přihlášení v případě, že primární jeden selže.

například, můžete nakonfigurovat primární JDBCAppender, s sekundárním RollingFile a Konzole appenders v případě, že databázi nelze navázat připojení:

V produkčním prostředí, s podporou převzetí služeb při selhání strategie pro vaše přihlášení mechanismus je vždy dobrý nápad.

Konfigurace Rozvržení

Zatímco appenders jsou odpovědné za odeslání zprávy protokolu do cíle, rozvržení jsou používány appenders definovat, jak zprávu záznamu bude formátován.

zde je stručný popis některých běžně používaných rozvržení, které log4j2 nabízí:

  • PatternLayout – konfiguruje zprávy podle Řetězcový vzorek
  • JsonLayout – definuje JSON formátu pro zprávy záznamu
  • CsvLayout – může být použit k vytvoření zprávy v CSV formátu

PatternLayout

první typ uspořádání budeme dívat na je PatternLayout. Jedná se o poměrně flexibilní řešení, které vám dává velkou kontrolu nad konečným výstupem zprávy protokolu.

mechanismus je primárně poháněn konverzním vzorem, který obsahuje specifikátory konverze. Každý specifikátor začíná znak%, následuje modifikátory, které ovládají věci, jako je šířka a barva zprávy, a konverzní znak, který představuje obsah, jako jsou data nebo nit jméno.

Pojďme se podívat na příklad konfigurace PatternLayout, že konfiguruje protokol řádky ukazují datum, nitě, úroveň protokolu a zprávu záznamu s různými barvami pro různé úrovně logování:

Tyto specifikátory jsou dobře stojí za to pochopit, v detailu, takže pojďme se blíže podívat:

  • %d{HH:mm:ss.SSS} – vypíše datum událost protokolu v zadaném formátu
  • %t – výstupy závit jméno
  • %level – zobrazí úroveň protokolu zprávy
  • %zvýrazněte {%} – slouží k definování barev pro vzor mezi složené závorky
  • %msg%n – výstupy zprávu záznamu

výstup se zobrazí log úrovní s různých barev:

můžete Si přečíst více o kompletní sadu možností pro definování vzorů v log4j2 dokumentace na PatternLayout.

JsonLayout

Protokolování dat pomocí formátu JSON má některé významné výhody, jako je vytváření protokolů jednodušší, které mají být analyzovány a zpracovány protokolování nástroje.

konfigurovat JSONLayout v log4j2, můžete jednoduše definovat odpovídající tag:

<JSONLayout complete="true" compact="false"/>

kompletní Nastavení=true bude produkovat dobře-tvořil JSON dokumentu:

být schopen produkovat JSON, musíte také přidat jackson-databind knihovnu na classpath:

konfigurace filtrů

filtry v log4j2 se používají k určení, zda má být zpráva protokolu zpracována nebo přeskočena.

filtr lze konfigurovat pro celou konfiguraci nebo na úrovni loggeru nebo appenderu.

knihovna poskytuje několik typů filtrů, které lze použít:

  • BurstFilter – určuje počet událostí protokolu povoleno
  • DynamicThresholdFilter – filtry řádky záznamu na základě určité atributy
  • RegexFilter – filtry zpráv na základě toho, zda jsou regulární výraz

můžete, například, ovládat rychlost, s jakou aplikace je umožněno, aby data protokolu.

Chcete-li to provést, můžete nastavit BurstFilter a použít to pro informační zprávy:

<Filters> <BurstFilter level="INFO" rate="10" maxBurst="100"/></Filters>

Tento bude selektivně ignorovat kontrolu dopravní INFO úrovni zpráv a níže, zatímco ujistěte se, že jste neztratili žádné další důležité zprávy výše uvedených INFORMACÍ.

V tomto případě, sazba určuje průměrná protokoly zpráv, které by měly být zpracovány za sekundu, a maxBurst řídí celkovou velikost provozu praskla, než se filtr začíná odstranění položek protokolu.

podobně můžeme nakonfigurovat appender pouze pro přijímání zpráv protokolu, které odpovídají určitému regulárnímu výrazu:

<Appenders> <JDBC name="JDBCAppender"> <RegexFilter regex="*jdbc*" onMatch="ACCEPT" onMismatch="DENY"/> </JDBC></Appenders>

Celkově to filtrování mechanismus, může být použit s velkou přesností, aby se ujistil, každý appender v celkové protokolování konfigurace je sledování správné informace. Možnost se přihlásit pouze velmi konkrétních a relevantních informací zpravidla vede k velmi rychlé analýzy hlavních příčin, a to zejména ve složitých systémech – zvlášť, když spolu s výkonným log prohlížení nástroj.

konfigurace loggerů

kromě kořenového loggeru můžeme také definovat další Loggerové prvky s různými úrovněmi protokolu, appendery nebo filtry. Každý Logger vyžaduje název, který může být později použit pro odkaz je:

<Loggers> <Logger name="RollingFileLogger"> <AppenderRef ref="RollingFileAppender" /> </Logger></Loggers>

psaní zprávy protokolu pomocí této konkrétní Logger, můžete získat odkaz na něj pomocí LogManager třída:

Logger rfLogger = LogManager.getLogger("RollingFileLogger");rfLogger.info("User info updated");

Další velmi časté způsob, jak se struktura hierarchie těchto kláves je založen na Java třídy:

Logger logger = LogManager.getLogger(MyServiceTest.class);

Použití Vyhledávání

Vyhledávání představují způsob, jak vložit externí hodnoty do log4j2 konfigurace. Příklad vyhledávání Data jsme již viděli v konfiguraci RollingFileAppender:

<RollingFile name="RollingFileAppender" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">

${datum:rrrr-MM} vyhledávání bude-li vložit aktuální datum do názvu souboru, zatímco předchozí $ je řídicí znak, chcete-li vložit do vyhledávání výraz do filePattern atribut.

můžete také vložit vlastnosti Systému hodnot do log4j2 konfigurace pomocí formátu ${sys:property_name}:

<File name="ApplicationLog" fileName="${sys:path}/app.log"/>

Další typ informací, můžete vyhledávání a vložte je Java prostředí informace:

<PatternLayout header="${java:version} - ${java:os}"> <Pattern>%d %m%n</Pattern></PatternLayout>

můžete Si najít více informací na druhu údajů, můžete vložit přes vyhledávání v log4j2 dokumentace.

programová konfigurace

kromě konfiguračních souborů lze log4j2 konfigurovat také programově. Existuje několik různých způsobů, jak to udělat:

  • vytvořit vlastní ConfigurationFactory
  • použití Konfigurátoru třídy
  • změnit nastavení po inicializaci
  • kombinovat vlastnosti souborů a programové konfigurace

Pojďme se podívat na to, jak nastavit rozvržení a appender programově:

Next, můžete definovat logger pomocí LoggerConfig třídy, spojit appender, a aktualizovat konfiguraci:

Potom můžete začít používat logger jako obvykle:

Logger pLogger = LogManager.getLogger("programmaticLogger");pLogger.info("Programmatic Logger Message");

Tento styl fluent API může vést k rychlejšímu rozvoji a opakování na více komplexní protokolování konfigurace, protože jste se nyní těží z výhod práce přímo s kódu v jazyce Java.

vzhledem k tomu, že XML může být stále čitelnější a kompaktnější, můžete často vytvořit konfiguraci programově a poté ji převést na XML, když je vše hotovo.

vlastní úrovně protokolu

vestavěné úrovně protokolu pro log4j2 jsou:

  • OFF
  • FATÁLNÍ
  • CHYBA
  • VAROVAT,
  • INFORMACE
  • LADĚNÍ
  • STOPY
  • VŠECHNY

kromě těchto, můžete také definovat vlastní úroveň protokolu podle vašich potřeb aplikací.

Chcete-li například definovat tuto novou úroveň protokolu, můžete tuto úroveň použít.forName () API-určení nového názvu úrovně a celého čísla, které představuje místo úrovně v hierarchii úrovní protokolu:

Level myLevel = Level.forName("NEW_LEVEL", 350);

určit, co celočíselná hodnota k použití, můžete se podívat na hodnoty definované pro jiné úrovně logování v log4j2 dokumentace:

350 hodnota staví na úroveň mezi VAROVAT a INFO, což znamená, že zprávy se zobrazí, když je nastavena úroveň INFO nebo výše.

Pro přihlášení zprávu na vlastní úroveň, budete muset použít log() metoda:

logger.log(myLevel, "Custom Level Message");

ekvivalent XML konfigurace může být:

<CustomLevels> <CustomLevel name="NEW_XML_LEVEL" intLevel="350" /></CustomLevels>

Pak to může být použit pomocí standardního protokolu API:

logger.log(Level.getLevel("NEW_XML_LEVEL"),"Custom XML Level Message");

nové vlastní úrovně se zobrazí stejným způsobem jako standardní:

11:28:23.558 NEW_LEVEL - Custom Level Message11:28:23.559 NEW_XML_LEVEL - Custom XML Level Message

migrace z Log4j 1.x

Pokud migrujete aplikaci pomocí 1.x verze knihovny na aktuální 2.x verze, existuje několik tras, které můžete sledovat:

  • použijte log4j 1.x bridge
  • ručně aktualizuje API a konfigurace

pomocí mostu je triviální. Potřebujete pouze nahradit závislost log4j knihovnou log4j-1.2-api:

i když se jedná o rychlejší metodu, má tu nevýhodu, že je omezena v typu konfigurace, kterou lze převést.

manuální metoda je samozřejmě více práce, ale nakonec povede k flexibilnějšímu a výkonnějšímu řešení protokolování.

Zde jsou některé nejběžnější typ změny, budete muset udělat:

Závěr

soubory Protokolu jsou důležité v jakémkoli výrobním prostředí, a výběr dobrý protokolování řešení může být rozdíl mezi výdaji 5 minut a strávit celý den, pochopit problém ve výrobě.

Log4j2 je výkonné a robustní logovací řešení pro moderní Java aplikace se širokou škálou možností konfigurace.

To umožňuje snadnou konfiguraci pokročilé protokolování osvědčených postupů, jako jsou rolling soubory, různé typy protokolování výstupu destinace, podpora pro strukturované protokolování formáty jako JSON nebo XML, použití více kláves a filtry, a vlastní úrovní záznamu.

A konečně, když potřebujete jít nad rámec ruční analýzy dat protokolu, určitě se podívejte na možnosti protokolování obsažené v Retrace APM.