log4j - rozne ConversionPattern dla roznych level

0

Czesc, moje pytanie jest nastepujace - czy dla roznych leveli logowania moge sobie zdefiniowac rozne sposoby ich wyswietlania? Np, teraz moj log4j.properties wyglada tak:

log4j.rootLogger=INFO, Console, File

#console settings
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%-5p [%d] %c %m

#logging level
log4j.appender.FA.Threshold = FATAL 

I dla wszystkiego wszystkich poziomow wyswietla mi wiadomosc w formacie: LEVEL DATA KLASA MESSAGE

A ja bym chciala miec taki format np tylko dla INFO i WARNING, zas dla ERROR i FATAL jakis inny, np tylko LEVEL MESSAGE

czy to sie da zrobic?

  pzdr,
          misty
0

tak, skradziono :)

Co do pierwszego linka - to jest oparte na xml, ja mam properties, na linku nr 2 bylam juz wczesniej i nie znalazlam w nim pomocy (lub nie skumalam, tak czy siak nie znalazlam w nim pomocy). Co wiecej, zdarzylo mi sie nawet zajrzec na strone projektu (!) zanim tu napisalam! http://logging.apache.org/log4j/1.2/manual.html

0

Jak sie nie da z properties, moze byc xml, ale z tego co tutaj juz potestowalam to i tak nie jest to co chce. Bo np:

 
	<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
		<param name="Threshold" value="INFO" />
		<param name="File" value="logs.log" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d %-5p  [%c{1}] %m %n" />
		</layout>
	</appender>

to zadziala mi tak, ze to bedzie nie dla INFO, ale dla Threshold od INFO (czyli dla wszystkiego!), a mi chodzi o to, by zdefiniowac cos innego tylko dla INFO, tylko dla ERROR, itd..
Poza tym - czy moznaby tam dodac warunki?

pzdr,
misty

0

Dobra, udalo sie.. Postanowilam przedstawic tu rozwiazanie poniewaz moze to kiedys komus zaoszczedzic pare h..
Moim problemem bylo to, ze w zaleznosci od tego jaki jest level, taki ma byc appender (ale nie level jako THRESHOLD, czyli jak np INFO to tylko INFO a nie wszystko od INFO wzwyz). Druga sprawa jest - jesli w czasie dziala programu zmienia sie jakies warunki (to moze byc cokolwiek) i w zwiazku z tym musze zmienic sposob logowania to jak zrobic?

Przyklad na czesc pierwsza przedstawiam ponizej:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
	<appender name="console" class="org.apache.log4j.ConsoleAppender">

		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" />
		</layout>

		<filter class="org.apache.log4j.varia.LevelMatchFilter">
			<param name="levelToMatch" value="ERROR" />
			<param name="acceptOnMatch" value="true" />
		</filter>

		<filter class="org.apache.log4j.varia.LevelMatchFilter">
			<param name="levelToMatch" value="INFO" />
			<param name="acceptOnMatch" value="true" />
		</filter>

		<filter class="org.apache.log4j.varia.StringMatchFilter">
			<param name="StringToMatch" value="test" />
			<param name="AcceptOnMatch" value="true" />
		</filter>

		<filter class="org.apache.log4j.varia.DenyAllFilter" />

	</appender>
	<appender name="console2" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d %-5p" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelMatchFilter">
			<param name="levelToMatch" value="WARN" />
			<param name="acceptOnMatch" value="true" />
		</filter>
		<filter class="org.apache.log4j.varia.DenyAllFilter" />
	</appender>

	
	<root>
		<level value="info" />
		<appender-ref ref="console" />
                        <appender-ref ref="console2" />
	</root>

</log4j:configuration>
 

czyli w appender "console" mam zdefiniowane dla INFO oraz ERROR, zas w console2 dla WARN.

Teraz kwestia przelaczania appenderow w czasie dzialania programu. Ja to sobie wyobrazalam ze moge zdefiniowac w xmlu (properties) x-appenderow, na starcie oznaczyc jakies tam jako domyslne, a potem przelaczyc to w programie. Ale cala definicje chcialam miec przygotowana juz w xml. Takiego rozwiazania nie udalo mi sie znalezc, moze ktos z Was wie czy tak sie w ogole da? Ale programowo mozna to zrobic tak:

 
 logger.getRootLogger().removeAllAppenders(); //tam jest wiecej tych metod, mozna pokombinowac

//konsolowy nowy appender:

        ConsoleAppender consoleAppender = 
            new ConsoleAppender(
              new PatternLayout("[%d{dd-MMM-yyyy HH:mm:ss,SSS}][%p][%t] %l %m%n")); 
          logger.getRootLogger().addAppender(consoleAppender); 

//plik:
            FileAppender fileAppender = 
                new FileAppender(
                  new PatternLayout("[%d{dd-MMM-yyyy HH:mm:ss,SSS}][%p][%t] %l %m%n"),
                 System.getProperty("user.dir")+"/mylog.log");
            
            logger.addAppender(fileAppender);


      logger.info("test ");

no i "test" wyswietli sie juz wg nowego loggera.

ps.

jesli ktos z Was jest mocny w tym temacie to zapraszam do dyskusji, mam jeszcze pare watpliwosci.

        pzdr,
               misty

1 użytkowników online, w tym zalogowanych: 0, gości: 1