[ sspasic @ 11.02.2004. 17:11 ] @
Imam sledeći problem:

Želim da konfigurišem log4j iz properties fajla ali nisam siguran gde da postavim kod za inicijalizaciju, pošto koristim struts.

Zna li neko rešenje?

Palo mi je napamet da nasledim struts servlet (org.apache.struts.action.ActionServlet) i preklopim init metod. Postoji li nešto elegantnije?
[ Last Man Standing @ 12.02.2004. 03:54 ] @
Pogledaj:

http://logging.apache.org/log4j/docs/manual.html pri dnu.

Kod za init mozes da stavis i u context listener (Dejane, hvala za tip). Mislim da je to najelegantnije. U web.xml:

<listener>
<listener-class> tvojaKlasa </listener-class>
</listener>

tvojaKlasa treba da implementira ServletContextListener. Property file definisi kao servlet parameter, procitaj ga u tvojaKlasa i gotovo. Svejedno je da li koristis Struts ili ne.
[ dejankr @ 12.02.2004. 07:56 ] @
Da li si siguran da ti treba uopšte kod za inicijalizaciju? Ako staviš log4j.properties u classpath tj. u classes direktorijum web aplikacije log4j bi trebalo sve sam da odradi. Isto važi i ako log4j koristiš preko commons-logging-a (koji i Struts koristi). Commons-logging ti je možda i najjednostavnije rešenje jer će uvek da ti vrši logovanje, čak i ako ne podesiš ništa izbacivaće poruke na ekran (nema ono log4j error: cannot initalize...).

Citat:
(Dejane, hvala za tip)

Molim, i drugi put!
[ mca @ 12.02.2004. 12:10 ] @
Mislim da nece moci.
Tj ako vec postoji (a recimo u JBoss-u postoji definisan log4j.properties) onda dzabe, mora kroz servlet ili kako je napisano iznad.

E sad da li neko ima ideju kako kod Jboss-a ubaciti log4j, ali bez servleta ili web aplikacije, jer nekad mi treba samo business deo (ejbovi) i voleobih da imam log4j, a ne mogu bez servleta.
Ili generalnije pitanje: gde smestiti neke konfigurabilne propertije koji bi se loadovali pri podizanju business dela, bez web aplikacije? Do sad sam sve ubacivo iz servleta, ali to je lose resenje.

Milan
[ dejankr @ 12.02.2004. 13:05 ] @
Kod web aplikacija (Tomact na primer) ovo sigurno radi, jer se svaka Web aplikacija ima svoj classloader. S JBoss-om nisam preterano radio tako da nisam siguran...
[ sspasic @ 12.02.2004. 13:57 ] @
Prvo, hvala svima na pomoci - ovo sa stavljanjem log4j.properties u CLASSPATH radi
sa Tomcat-om. Dovoljno je staviti fajl u WEB-INF/classes aplikacije.

Inace, za inicijalizaciju mi je palo napamet da bi mogla da se izvede i pomocu filtera.
Trenutno npr. u istoj aplikaciji u filteru postavljam NDC za log4j. Mislim da bi tu mogla i inicijalizacija, ako onaj fazon sa classpath iz nekog razloga ne moze da se iskoristi.
Treba samo povesti racuna da se inicijalizacija izvrsi samo jednom i da inicijalizaciona funkcija bude sinhronizovana.
[ dejankr @ 12.02.2004. 14:06 ] @
Citat:
sspasic:
Inace, za inicijalizaciju mi je palo napamet da bi mogla da se izvede i pomocu filtera.
Trenutno npr. u istoj aplikaciji u filteru postavljam NDC za log4j. Mislim da bi tu mogla i inicijalizacija, ako onaj fazon sa classpath iz nekog razloga ne moze da se iskoristi.
Treba samo povesti racuna da se inicijalizacija izvrsi samo jednom i da inicijalizaciona funkcija bude sinhronizovana.


Za inicijalizaciju kod web aplikacija uvek koristi ContextListener klasu kako je Miša objasnio jer se ona izvršava samo jednom, prilikom inicijalizacije web aplijacije (u istoj klasi možeš da implementiraš kod koji se izvršava prilikom obaranja aplikacije). Ovo je ubedljivo najelegantnije rešenje pošto mislim da inicijalizacija filtera ne mora da se obavi prilikom dizanja aplikacije. Jedino u slučaju da koristiš servlet 2.2 specifikaciju (Tomcat 3.x) onda koristi Servlet sa load-on-startup opcijom pošto su se ContextListeneri pojavili sa Servlet 2.3 spec.
[ sspasic @ 12.02.2004. 14:17 ] @
Da, u pravu si...
[ dejankr @ 13.02.2004. 08:40 ] @
Citat:
mca:
E sad da li neko ima ideju kako kod Jboss-a ubaciti log4j, ali bez servleta ili web aplikacije, jer nekad mi treba samo business deo (ejbovi) i voleobih da imam log4j, a ne mogu bez servleta.


Baš danas sam nabavio knjigu (dobro nije baš knjiga - 30 strana, ali je JBoss naplaćuje) Using Log4j with JBoss. Strašno na šta oni uzimaju pare a još gore je to što ti uopšte treba knjiga da bi podesio Log4j u JBoss!!!! Ako ti treba, mogu da ti šibnem na mail...
[ mca @ 13.02.2004. 09:38 ] @
Citat:
dejankr:

Baš danas sam nabavio knjigu (dobro nije baš knjiga - 30 strana, ali je JBoss naplaćuje) Using Log4j with JBoss. Strašno na šta oni uzimaju pare a još gore je to što ti uopšte treba knjiga da bi podesio Log4j u JBoss!!!! Ako ti treba, mogu da ti šibnem na mail...


Znam da su knjige katastrofalne, ali bio bih zahvalan ako mogu da je dobijem.
Ja imam onu kao glavnu koja je velika oko 10 mb, a 90% stvari je samo nabrojano bez i jednog konkretnog primera.

Moj mail ide u PM.

Usput, da ponovim pitanje da li mozda imas neku ideju kako i gde staviti inicijalizaciju za enterprise deo (neki property fajl koji bi se loadovao prvi i i posle koristio u EJB-ovima - tj koristili bi se propertiji). JBoss ima neke svoje varijante, koje su naravno daleko od portabilinih. Znaci generalno pitanje, kako obezbediti da se neka klasa prva loaduje.

Ima recimo varijanta da se napravi metoda za lodaovanje sa fajl sistema,
i da se ona poziva iz static bloka neke klase, koja bi opet sa svoje strane bila static polje u recimo nadklasi svih EJB klasa. Sta mislite o tome?

Milan
[ dejankr @ 13.02.2004. 13:16 ] @
Citat:
mca:

Usput, da ponovim pitanje da li mozda imas neku ideju kako i gde staviti inicijalizaciju za enterprise deo (neki property fajl koji bi se loadovao prvi i i posle koristio u EJB-ovima - tj koristili bi se propertiji). JBoss ima neke svoje varijante, koje su naravno daleko od portabilinih. Znaci generalno pitanje, kako obezbediti da se neka klasa prva loaduje.

Ima recimo varijanta da se napravi metoda za lodaovanje sa fajl sistema,
i da se ona poziva iz static bloka neke klase, koja bi opet sa svoje strane bila static polje u recimo nadklasi svih EJB klasa. Sta mislite o tome?

Milan


U principu izbegavam EJB-ove kad god je to moguće ali koliko se sećam pristup fajl sistemu iz EJB-ova je zabranjen. Verovatno možeš praviti neke helper klase za indirektan prisup ali pretpostavljam da je pristup fajl sistemu zabranjen iz dobrih razloga (rad u klasterima i sl). Po meni je bolja varijanta držati fajlove u classpath-u (jar fajlu) i učitavati ga kao resurs preko ClassLoadera.
Code:

InputStream is = Thread.getCurrentThread().getContextClassLoader().getResourceAsStream(fileName);