Vă rugăm să inițializați corect sistemul log4j. În timpul rulării serviciului web (Programare, Java, Servicii Web, Log4J, Axis)

java_enthu a intrebat.

Poate că pare o prostie să întreb acest lucru, dar sunt confuz. M-am referit la Configurarea proprietății Log4j, dar nu pare să ajute.

Am scris un serviciu web simplu HelloWorld. Și în timp ce îl execut, primesc o eroare de genul acesta :

log4j:WARN Nu au putut fi găsite aplicații pentru logger (org.apache.axis.transport.http.AxisServlet). log4j:WARN Vă rugăm să inițializați corect sistemul log4j.

Nu sunt sigur de ce se întâmplă acest lucru.

Generez serviciul web folosind Eclipse și îl implementez în Tomcat 6.0. Am verificat pe Ghidul dezvoltatorului Axis și conform acestora

log4j.configuration=log4j.properties Utilizați această proprietate de sistem pentru a specifica numele unui fișier de configurare Log4J. Dacă nu este specificat, fișierul de configurare implicit este log4j.properties. Un fișier log4j.properties este furnizat în axis.jar.

Nu am găsit fișierul log4j.properties în fișierul axis.jar.

Aveți vreun ajutor în acest sens?

Comentarii

  • possible duplicate of Cum să inițializez corect log4j? –  > Por kenorb.
7 răspunsuri
user159088

Aceste mesaje sunt ceva complicat, suficient de complicat încât oamenii au creat acest lucru pentru a face mai clar:https://issues.apache.org/bugzilla/show_bug.cgi?id=25747

Ceea ce este complicat la ele este că avertismentele sunt scrise dacă Log4j nu-și găsește log4j.properties (sau log4j.xml), dar și în cazul în care fișierul este în regulă, dar conținutul său nu este complet din punct de vedere al configurației.

Următorul paragraf este preluat de aici:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_9/docs/TROUBLESHOOT.html

Ieșirea de logare este scrisă pe o țintă prin utilizarea unui appender. Dacă nu există niciun apender atașat la o categorie și nici la vreunul dintre strămoșii acesteia, veți primi următorul mesaj atunci când încercați să faceți logarea:

log4j: No appenders could be found for category (some.category.name).
log4j: Please initialize the log4j system properly.

Log4j nu are o țintă de logare implicită. Este responsabilitatea utilizatorului să se asigure că toate categoriile pot moșteni un apender. Acest lucru poate fi realizat cu ușurință prin atașarea unui apender la categoria rădăcină.

Puteți găsi informații despre cum să configurați loggerul rădăcină (log4j.rootLogger) în documentul log4j , , adăugând practic ceva atât de simplu ca acesta la începutul fișierului:

log4j.rootLogger=debug, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

Acest lucru ar trebui să elimine acele mesaje WARN pe care le primiți la pornire (asigurați-vă că nu aveți deja un apender numit stdout; de asemenea, aveți grijă la nivelul pe care îl dați loggerului rădăcină, debug va fi foarte verbos și fiecare bibliotecă din aplicația dvs. va începe să scrie lucruri în consolă).

În ceea ce privește log4j.properties/log4j.xml, , vă sugerez să plasați acest fișier în /WEB-INF/classes deoarece este important să fie expus pentru diferite modificări (activarea/dezactivarea jurnalelor, modificarea nivelurilor de jurnal etc.). Îl puteți avea în interiorul unui JAR în classpath, de asemenea (așa cum ați specificat în comentariu), dar va fi inclus în arhivă (sperăm că în locul potrivit în interiorul arhivei) și nu va fi la fel de ușor de manevrat ca în cazul în care ar fi fost în /WEB-INF/classes.

Comentarii

  • Crearea unui nou fișier log4j.properties în /WEB-INF/classes mi-a rezolvat problema. Vă mulțumim! –  > Por Jimmy Pelton.
flash

Trebuie să vă creați propriul fișier log4j.properties în folderul classpath.

Comentarii

  • Am adăugat log4j.properties în axis.jar în mod explicit, l-am pus în jar și l-am încărcat în serviciul web, dar am aceeași eroare. –  > Por java_enthu.
AlexD

Ei bine, dacă ați creat deja log4j.properties, ați adăuga calea acestuia la classpath, astfel încât să fie găsit în timpul execuției.
Da, chestia va căuta acest fișier în classpath.
Din moment ce ai spus că te-ai uitat în axis și nu ai găsit unul, presupun că nu ai un log4j.properties, așa că iată un exemplu rudimentar dar complet.
Creați-l undeva și adăugați-l în classpath. Puneți-l, de exemplu, în c:/proj/resurse/log4j.properties

În classpath-ul dvs. adăugați pur și simplu …….;c:/proj/resources

# Root logger option
log4j.rootLogger=DEBUG, stdout, file

# Redirect log messages to console
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=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=c:/project/resources/t-output/log4j-application.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

kenorb

Avertisment Nu au putut fi găsite aplicații pentru logger înseamnă că utilizați log4j sistemul de logare, dar nu ați adăugat niciun apender (cum ar fi FileAppender, ConsoleAppender, SocketAppender, SyslogAppender etc.) în fișierul de configurare sau fișierul de configurare lipsește.

Există trei moduri de a configura log4j: cu un fișier de proprietăți (log4j.properties), cu un fișier XML și prin cod Java (rootLogger.addAppender(new NullAppender());).

Dacă aveți un fișier de proprietăți prezent (de exemplu, la instalarea Solr), trebuie să plasați acest fișier în cadrul fișierului dvs. classpath director.

classpath

Iată câteva sugestii de comenzi pentru a determina valoarea classpath:

$ echo $CLASSPATH
$ ps wuax | grep -i classpath
$ grep -Ri classpath /etc/tomcat? /var/lib/tomcat?/conf

sau din Java: System.getProperty("java.class.path").

Tomcat

Dacă utilizați Tomcat, puteți plasa fișierul log4j.properties în: /usr/share/tomcat?/lib/ sau /var/lib/tomcat?/webapps/*/WEB-INF/lib/ folder.

Solr

Pentru referință, Solr log4j.properties arată astfel:

#  Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x u2013 %m%n

#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9

#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m


log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN

# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF

Kannan

Dacă afirmația de mai jos este prezentă în clasa dvs., atunci log4j.properties ar trebui să fie în dosarul java source(src), dacă este executabil în jar, ar trebui să fie împachetat în jar și nu într-un fișier separat.

static Logger log = Logger.getLogger(MyClass.class);

Mulțumesc,

keshava

Dacă utilizați Logger.getLogger(ClassName.class) atunci puneți log4j.properties în calea clasei:

yourproject/javaresoures/src/log4j.properties (Put inside src folder)

Knautiluz

Puteți configura log4j.properties ca răspunsurile de mai sus, sau puteți utiliza org.apache.log4j.BasicConfigurator

public class FooImpl implements Foo {

    private static final Logger LOGGER = Logger.getLogger(FooBar.class);

    public Object createObject() {
        BasicConfigurator.configure();
        LOGGER.info("something");
        return new Object();
    }
}

Deci, sub masă, configurați face:

  configure() {
    Logger root = Logger.getRootLogger();
    root.addAppender(new ConsoleAppender(
           new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN)));
  }