Avatar billede margitbork Nybegynder
24. marts 2004 - 12:05 Der er 36 kommentarer og
1 løsning

hvordan kommer jeg igang med log4j ?

Jeg skal til at implementere en logning på en web applikation jeg vedligeholder, og jeg har hørt at log4j skulle være god.
Men hvordan kommer jeg igang.
Avatar billede arne_v Ekspert
24. marts 2004 - 12:08 #1
Log4j er et fremragende værktøj.

Start evt. her:
  http://www.eksperten.dk/artikler/97
Avatar billede arne_v Ekspert
24. marts 2004 - 12:16 #2
Du kan godt regne med at log4j allerede er installeret i din app-server, så
det kun er et soørgsmål om at finde config filen og ligge log kald
ind.
Avatar billede margitbork Nybegynder
24. marts 2004 - 12:53 #3
Jeg bruger en websphere 3.5.4 server - så den er ikke helt ny.
Jeg tror ikke den har log4j. men jeg kan jo blot includere log4j.jar i mit
eget projekt ( det har vi i forvejen gjort med Struts )
God artikel iøvrigt.
I din artikels eksempel hedder din klasse log4 og den kalder en logger der hedder log4 - men der behøver vel ikke være navnesammenfald ?
Er det rigtigt forstået at man i sin konfiguration definerer de forskellige loggere man vil have og så kan hente dem med logger.getLogger("navn") ? - og kan bruge den i mange forskellige klasser
Det med navn indikerer at man bør have en loggerkonfiguration for hver klasse man logger fra ?? eller i det mindste fra hver pakke ??
Hvis man har konfigureret en logger med navn log4 og så beder om en logger der hedder log4.log får man så log4 konfigurationen eller en fejl fordi der ikke er en logger konfiguration til det navn ?

Jeg går igang med at forsøge mig frem
Margit
Avatar billede arne_v Ekspert
24. marts 2004 - 13:12 #4
Nej. Logger hirakiet behøver ikke nødvendigvis følge klasse hirakiet.

Man plejer at gøre det. Fordi det ofte er logisk.

Pointen er at hvis man har xxx.yyy og xxx.zzz, så kan man konfigurere
begge ved at sægtte for xxx og xxx.yyy separat ved at sætte den.

Der er en default ROOT konfiguration, som gælder for alle loggere.

log4j er helle rikke ny, så WAS 3.5 kan sagtens have log4j.

Men selvom den har vil du muligvis foretrække at bruger ene nyere version af
log4j.
Avatar billede margitbork Nybegynder
24. marts 2004 - 13:15 #5
Jeg forstod ikke helt det i artiklen om 
Så kører man programmet med enten:

-Dlog4j.configuration=file:///C:/log4j.properties

eller:

-Dlog4j.configuration=file:///C:/log4j.xml

Hvordan angiver man det?
Avatar billede arne_v Ekspert
24. marts 2004 - 13:20 #6
Det er en parameter til JVM'en.

Det kan du også sætte for WAS.

Alternativt kan du lave en System.setProperty til at definere det med.
Avatar billede arne_v Ekspert
24. marts 2004 - 13:20 #7
Eller lave et eksplicit kald af log4j kode til at læse konfiguration.

Der er et par klasser til det også.
Avatar billede margitbork Nybegynder
24. marts 2004 - 13:24 #8
Til en lille test med en main metode tænker jeg at det er nemmest at sætte den inde fra koden.
hedder det så System.setProperty("Dlog4j.configuration","der hvor filen er"); ?
Du skriver at der også er et par klasser til det ??
Avatar billede arne_v Ekspert
24. marts 2004 - 13:27 #9
System.setProperty("log4j.configuration","der hvor filen er");
Avatar billede margitbork Nybegynder
24. marts 2004 - 14:36 #11
Jeg har nu en lille testklasse, men jeg kan ikke finde ud af hvorfor der ikke skrives til en fil, men istedet til en consol LogFactor5

Jeg bruger denne configuration:
# Log7 logger: minimum level=debug, one appender (logfile )
log4j.category.Log7 = debug, logfile
# console: minimum level=info, special format
#log4j.appender.console.threshold = info
#log4j.appender.console=org.apache.log4j.ConsoleAppender
#log4j.appender.console.layout = org.apache.log4j.PatternLayout
#log4j.appender.console.layout.ConversionPattern = %-30c %d %-5p %m%n
# logfile: minmum level=debug, fil=log4.log, special format
log4j.appender.logfile.threshold = debug
log4j.appender.logfile = org.apache.log4j.FileAppender
log4j.appender.logfile.file = D:\Niceweb\logs\log4j.log
log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern = %-30c %d %-5p %m%n
Avatar billede margitbork Nybegynder
24. marts 2004 - 15:01 #12
Når jeg logger til c:/log4j.log som i din artikel får jeg en logfil på c, men hvis jeg forsøger at få logfilen på d:/log4j.log så kommer der ikke nogen fil
Avatar billede margitbork Nybegynder
24. marts 2004 - 15:02 #13
Jeg holder for idag, men håber på mere hjælp imorgen
Avatar billede arne_v Ekspert
24. marts 2004 - 15:17 #14
Umiddelbart kan jeg ikke forstå hvorfor C: virker men ikke D: - du har husket
at vende slasherne unix way ?
Avatar billede margitbork Nybegynder
25. marts 2004 - 08:24 #15
Jeg har bare udskiftet C'et med et D - så der skulle ikke være andre forskelle. Jeg prøver videre idag.
Hvordan undgår man at consollen kommer frem ?
Avatar billede arne_v Ekspert
25. marts 2004 - 08:34 #16
consolen ?

Mit test program er en console app, så ...

Din web app bør ikke lave nogen console.
Avatar billede margitbork Nybegynder
25. marts 2004 - 09:15 #17
Jeg kører test fra Intellij Idea, hvor jeg har en main metode.
Jeg har fundet ud af at der skrives til en fil der hedder
niceweblogslog4j placeret i d:/niceweb.
Men lige nu står der i min config fil at der skal skrives til c:/log4j.
# Log3 logger: minimum level=debug, two appenders (logfile + console)
log4j.category.Log3 = info, logfile
# console: minimum level=info, special format
#log4j.appender.console.threshold = info
#log4j.appender.console=org.apache.log4j.ConsoleAppender
#log4j.appender.console.layout = org.apache.log4j.PatternLayout
#log4j.appender.console.layout.ConversionPattern = %-30c %d %-5p %m%n
# logfile: minmum level=debug, fil=log4.log, special format
log4j.appender.logfile.threshold = info
log4j.appender.logfile = org.apache.log4j.FileAppender
log4j.appender.logfile.file = C:\log4j.log
log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern = %-30c %d %-5p %m%n

desuden skrives der også debug linjer, det skulle der vel ikke når jeg har
skrevet level=info ?
Det er som om at properties ikke rigtigt bliver genindlæst - men hvordan tvinger jeg
den til det ?
Avatar billede arne_v Ekspert
25. marts 2004 - 21:11 #18
Når programmet genstartes så skulle dte genlæse konfigurationen.

Hvis du vil gøre det runtime skal du bruge PropertyConfigurator klassen.
Avatar billede margitbork Nybegynder
26. marts 2004 - 10:48 #19
Nu har jeg fået styr på det med filen - det var slashene der skulle vendes ( og så skulle det være i den version af properties filen som blev brugt :-())

Nu mangler jeg bare at få slukket for den der consol.
Det har måske noget med disse linjer som står øverst i properties filen at gøre

log4j.rootCategory=, A1

# A1 is set to be a LF5Appender which outputs to a swing
# logging console.
 
log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
log4j.appender.A1.MaxNumberOfRecords=1000

Hvad kan man skrive istedet for ??
Avatar billede arne_v Ekspert
26. marts 2004 - 11:01 #20
Hvis ikke du har nogen console appender, så burde du heller ikke få noget
console output.
Avatar billede margitbork Nybegynder
26. marts 2004 - 11:05 #21
Nu har jeg også fundet ud af at få A1 til at skrive i en fil....
Avatar billede margitbork Nybegynder
26. marts 2004 - 11:05 #22
Hvis du vil have lidt point så lav et svar Arne V
Avatar billede margitbork Nybegynder
26. marts 2004 - 11:07 #23
MEN min log skriver både til A1's fil og så til den fil der er defineret for den logger jeg instantierer, kan jeg undgå det ?
Avatar billede arne_v Ekspert
26. marts 2004 - 11:08 #24
svar
Avatar billede arne_v Ekspert
26. marts 2004 - 11:10 #25
Har jeg forstået dig ret: du har en file appender for alle loggere, du har
en special logger for en enkelt logger - og nu vil du undgå at få det du outputter
til special loggeren ud i fil loggeren - selvom level tillader det ?
Avatar billede margitbork Nybegynder
26. marts 2004 - 12:04 #26
Jeg har følgende:

log4j.rootCategory=, A1

# A1 is set to output to a file

 
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.file =  D:/Niceweb/logs/log4j.log
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern = %-30c %d %-5p %m%n




# Log4 logger: minimum level=debug, one appenders (logfile )
log4j.category.Log4 = info , logfile4
# console: minimum level=info, special format
#log4j.appender.console.threshold = info
#log4j.appender.console=org.apache.log4j.ConsoleAppender
#log4j.appender.console.layout = org.apache.log4j.PatternLayout
#log4j.appender.console.layout.ConversionPattern = %-30c %d %-5p %m%n
# logfile: minmum level=debug, fil=log4.log, special format
log4j.appender.logfile4.threshold = debug
log4j.appender.logfile4 = org.apache.log4j.FileAppender
log4j.appender.logfile4.file = D:/Niceweb/logs/log4j4.log
log4j.appender.logfile4.layout = org.apache.log4j.PatternLayout
log4j.appender.logfile4.layout.ConversionPattern = %-30c %d %-5p %m%n



# Log7 logger: minimum level=debug, one appender (logfile )
#log4j.category.Log7.Log4= debug, logfile7
log4j.category.Log4.Log7= debug
# console: minimum level=info, special format
#log4j.appender.console.threshold = info
#log4j.appender.console=org.apache.log4j.ConsoleAppender
#log4j.appender.console.layout = org.apache.log4j.PatternLayout
#log4j.appender.console.layout.ConversionPattern = %-30c %d %-5p %m%n
# logfile: minmum level=debug, fil=log4j.log, special format
#log4j.appender.logfile7.threshold = debug
#log4j.appender.logfile7 = org.apache.log4j.FileAppender
#log4j.appender.logfile7.file = D:/Niceweb/logs/log4j7.log
#log4j.appender.logfile7.layout = org.apache.log4j.PatternLayout
#log4j.appender.logfile7.layout.ConversionPattern = %-30c %d %-5p %m%n



Her skrives der så altid til A1 filen, samt til den fil den enkelte logger har tilknyttet.

Jeg har desuden problemer med at den ikke logger på det rigtige niveau.
Min Log4 skriver også sine debug linjer ud....
Avatar billede margitbork Nybegynder
26. marts 2004 - 12:07 #27
Jeg ville gerne have det således at jeg kunne skrive al min logning i f.eks en fil pr
javapakke - og så de forskellige loggere blot skrev på forskellig niveau (debug, info, etc.) Men det ser ud til at det er filens threshold der bestemmer om en loglinje skal udskrives og ikke loggeren selv ? Kan det virkeligt være rigtigt?
Avatar billede margitbork Nybegynder
26. marts 2004 - 13:01 #28
Problemet med loglevel er løst, der må ikke være et mellemrum mellem level og ,
det skal hedde info, og ikke info ,
Sådan er der jo så meget !
Avatar billede margitbork Nybegynder
26. marts 2004 - 13:02 #29
Men jeg kan stadig ikke få den til at lade være med at skrive til default filen - den som A1 loggeren har. Kan man undgå det ?
Avatar billede arne_v Ekspert
26. marts 2004 - 13:12 #30
Det er jeg overbevist om at man kan.

Men jeg skal lige hjem og eksperimentere lidt inden jeg vil forslå en opskrift
Avatar billede margitbork Nybegynder
26. marts 2004 - 13:15 #31
OK
Jeg eksperimenterer også, så kan vi udveksle på mandag.
Avatar billede arne_v Ekspert
28. marts 2004 - 22:46 #32
Du kan undlade at definere A1 overhovedet.

Eller du kan bruge:

logger.setAdditivity(false);

som betyder "skriv ikke til appendere som er definere højere oppe i hirakiet".
Avatar billede margitbork Nybegynder
29. marts 2004 - 09:24 #33
Så har jeg lige et problem med det med at loggere arver loglevel fra loggere højere oppe i hierakiet.
Hvis man har defineret en logger der hedder dk.minsti.mitprojekt
Skulle man så ikke kunne instantiere loggere der hedder dk.minsti.mitprojekt.pakke.klasse - og så arver de efter dk.minsti.mitprojekt ?? Eller skal man have defineret en logger der hedder dk.minsti.mitprojekt.pakke.klasse som så bare ikke har fået tildelt et level, for at den arver efter dk.minsti.mitprojekt ?
Avatar billede arne_v Ekspert
29. marts 2004 - 20:43 #34
Du mener om du kan springe over et niveau ?

Det har jeg aldrig prøvet.

Men jeg vil da tro at det virker.

Så prøv det !
Avatar billede margitbork Nybegynder
30. marts 2004 - 09:27 #35
Jeg tror at jeg har fået det til at virke. Jeg havde vist bare et problem med at når først jeg havde instantieret en logger der hed dk.minsti.mitprojekt.pakke.klasse så kunne jeg ikke bare fjerne den igen ved at fjerne konfigurationen. Objektet eksisterede stadig og blev så ikke påvirket at at konfigurationen blev fjernet. Det forvirrede mig lidt i mine forsøg med arv af loglevel, men vil nok ikke have nogen betydning i praksis, hvor man jo nok vil lade konfigurationen stå, blot med et ændret loglevel når man skal modellere logningen runtime
Så nu er jeg igang med at implementere log4j i mit projekt.
Der var en herude er spurgte mig om det var lovlig kode - hun havde hørt noget om en eller anden logger der vist havde "lånt" noget kode fra microsoft - og sådan noget kan vi jo ikke bare bruge i vores forretning. Kender du noget til det ??
Avatar billede arne_v Ekspert
30. marts 2004 - 09:32 #36
log4j bruges formentlig af 75% af alle J2EE projekter i hele verden.

Apache Group er en yderst respektabel open source organisation.

Jeg er ret sikker på at det er lovligt.

Jeg har iøvrigt lidt svært ved at se hvad man skulle have hapset
fra Microsoft. De gør jo ikke meget i Java. Og de har ikke et tilsvarende
logging framework. Eneste berørings punkt må være den appender som
skriver til NT/2000/XP event log.
Avatar billede margitbork Nybegynder
30. marts 2004 - 09:45 #37
Det lyder fint. Det var vist heller ikke log4j hun havde hørt om, men heller være på den sikre side.
Tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester