eigener logger mittels classe (dynamische logfilename) log4j

Status
Nicht offen für weitere Antworten.
G

gast

Gast
hallo leute,

proge gerade eine webanwendung mittels tomcat, axis,...

zum loggen verschiedener meldungen verwende ich die log4j.properties sowie eine eigene logger-classe:

Code:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.FileAppender;


public class JusERVRCodeLog4j {

	private static Logger logger = null;
	
	public myLog4j(String logfile, Class _class){
		 logger = Logger.getLogger(_class);
		 String pattern = "%-5p;%d{yyyy-MM-dd HH:mm:ss};%m%n";
		 PatternLayout layout = new PatternLayout(pattern);
		 FileAppender appender = null;
		 try {
			 appender = new FileAppender(layout,logfile,true);
		 } 
		 catch(Exception e){
			 System.out.println(e.getMessage());
		 }
		 logger.addAppender(appender);
		 logger.setAdditivity(false);
		 logger.setLevel((Level) Level.INFO);
	}
	
	public void setDebug(Object arg0){
		logger.debug(arg0);
	}
	public void setInfo(Object arg0){
		logger.info(arg0);
	}
	public void setWarn(Object arg0){
		logger.warn(arg0);
	}
	public void setError(Object arg0){
		logger.error(arg0);
	}
	public void setFatal(Object arg0){
		logger.fatal(arg0);
	}
}

die klasse wird in mehreren anderen klasse instanziert.
myLog4j log = new myLog4j("log.txt",klasse.class);
nun werden ja die logs geschrieben jedoch nicht nur einmal sonder jedesmals n+1, wobei
n die anzahl der aufrufe des service ist.

nun glaub ich das dies deshalb passiert weil des object log nicht zerstört wird.
wie kann ich die mehrfachen log einträe vermeiden und trozdem bestimmen wie die logdatei heist.

danke mfg peter
 

Murray

Top Contributor
Ist es Absicht, dass das Member logger static deklariert ist? So erzeugst du immer, wenn du den Konstruktor für eine andere Klasse aufrufst, einen neuen Logger, der dann von allen vorher entstandenen Instanzen verwendet wird. Wenn du den Konstruktor hingegen zweimal für die gleiche Klasse aufrufst, dann wird kein neuer Logger erzeugt (Logger#getLogger liefert dann die existierende Instanz zurück); du hängst aber trotzdem an diesen Logger einen weiteren Appender an, wodurch die Einträge dann dopplet protokolliert werden dürften.
 
G

gast

Gast
auch wenn ich den logger nicht statisch deklariere erhalte ich merfache gleiche einträge im logfile.

peter
 

Murray

Top Contributor
gast hat gesagt.:
auch wenn ich den logger nicht statisch deklariere erhalte ich merfache gleiche einträge im logfile.

Wenn du den Konstruktor mehrfach für die gleiche Klasse aufrufst, muss das wohl passieren (s.o.). Vermutlich muss du noch irgendwie unterscheiden, ob Logger#getLogger ein neues Objekt erzeugt hat, oder ob du eine existierende Instanz bekommen hast.
 

byte

Top Contributor
AFAIK erben doch alle Logger in der Hierarchie die Appender. Du musst also nur einmal auf dem Top-Level Logger den Appender hinzufügen.
 
G

gast

Gast
byto hat gesagt.:
AFAIK erben doch alle Logger in der Hierarchie die Appender. Du musst also nur einmal auf dem Top-Level Logger den Appender hinzufügen.

das würde doch bedeuten das ich den appender im log4j.properties file anlegen muß, wie kann ich dann dan ort und den namen des logfiles zur laufzeit bestimmen

mfg peter
 

byte

Top Contributor
Ob Du das nun über Properties, XML oder direkt im Code angibst, spielt keine Rolle. Wenn Du allen Loggern den gleichen Appender zuweisen willst, dann appende den am besten beim Root-Logger, denn von dem erben alle weiteren Logger.

Code:
Logger.getRootLogger();
 

zc

Mitglied
das problem ist das ja auch noch andere logger laufen die mit mylog nicht zu tun haben.

zusätzlich läuft ein sys.log der über log4j.properties bestimmt ist und ein rootLogger

Code:
# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, LOGFILE
log4j.category.SYS=INFO, SYSLOG

# Set the enterprise logger category to FATAL and its only appender to LOGFILE.
log4j.logger.org.apache.axis.enterprise=FATAL, LOGFILE 

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.Threshold=FATAL
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%-5p;%d{yyyy-MM-dd HH:mm:ss};%-4r;[%t];%c;%x;%m%n

# SYSLOG is set to be a File appender using a PatternLayout.
log4j.appender.SYSLOG=org.apache.log4j.FileAppender
log4j.appender.SYSLOG.File=sys.log
log4j.appender.SYSLOG.Append=true
log4j.appender.SYSLOG.Threshold=ERROR
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern= %-5p;%d{yyyy-MM-dd HH:mm:ss};%m%n

der SYS Logger wird auch über eine Java-Class angestossen hat also mit mylog nichts zu tun.

ich brauch den mylog um für verschiedene user eigene log-files zu schreiben. d.h. ja nach dem welcher user das service aufruft (angemeldet ist) muß das xxx.log bestimmt werden und auch nur in dieses geschrieben werden.
 

Murray

Top Contributor
Du machst also etwas in der Art:
Code:
myLog4j( "logfile_fuer_user_1", MyFabulousService.class);
myLog4j( "logfile_fuer_user_2", MyFabulousService.class);

Dann schlägt der bereits beschriebene Effekt zu: Logger#getLogger liefert zu einem Namen (resp. einer Klasse) nur eine Instanz zurück. Beim ersten Aufruf bekommst du also einen neuen Loger, und alles ist gut. Beim zweiten Aufruf bekommst du aber das selbe Logger-Objekt zurück wie beim ersten Aufruf. Diesem Logger-Objekt verpasst du dann einen weiteren Appender, wodurch alle Meldungen dann in beiden Log-Files landen dürften.

//EDIT: Typos
 

zc

Mitglied
ja stimmt so mach ich das, programmiere jetzt schon ein ganze weil daran herum und komme auf keinen grünen zweig,

ich möchte bloß das log file für mylog dynamisch zu laufzeit des services bestimmen.

vielleicht bin ja mit meinem ansatz völlig falsche.
 

wranger

Mitglied
Hallo,

wie implementiert man denn nu so eine Logger-Klasse, kann hier auch allgemein sein. Erstellt man die, erzeugt nur ein Objekt und übergiebt dieses dann an all die Klassen die erzeugt werden. Oder gibt es auch einen weg ohne expliziete Übergabe an die Klasse. Oder über eine statische Klasse?

@Ontopic in deinem Fall würde ich einen statischen Zähler einbauen der das append nur macht wenn der zähler kleiner als 1 ist.

Code:
class logger{
private static zaehler;
logger()
{
zaehler++;
}
public methode(){
if(zaehler <2)
 logger.append();
}
}
 

byte

Top Contributor
Ich verstehe das Problem echt gar nicht. Du musst doch einfach nur zusehen, dass Du lediglich einmal pro User dem Logger einen Appender mit dem entsprechenden Userfile zuordnest. ???:L
 

Murray

Top Contributor
Dazu müsste man vermutlich dafür sorgen, dass es für jede Klasse auch pro Benutzer einen eigenen Logger gibt.

Code:
   public myLog4j(String logfile, Class _class){
       logger = Logger.getLogger( _class.getName() + "-" + logfile);
 /* ...*/

Mit doppelten Einträgen ist dann allerdings immer noch zu rechnen, wenn myLog4j mehrfach mit den gleichen Parametern aufgerufen wird.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JavaDocu in eigener Bibliothek Allgemeine Java-Themen 2
HarleyDavidson Eigener PropertyChangeListener funktioniert einfach nicht Allgemeine Java-Themen 3
T Datei öffnen mit eigener Applikation.exe Allgemeine Java-Themen 4
D Arraylist eigener Klasse an iReport übergeben Allgemeine Java-Themen 7
K Jar mit eigener JRE ausliefern Allgemeine Java-Themen 13
G eigener PropertyChangedListener Allgemeine Java-Themen 2
S OOP ClassCastException bei casting von eigener Klasse aus Iterator Allgemeine Java-Themen 3
V Serialisierung von Instanz eigener Klasse Allgemeine Java-Themen 5
N Vergleich eigener Klassen Allgemeine Java-Themen 5
T Vererbung Eigener Datentyp: Betriebsmittel Allgemeine Java-Themen 2
J Erste Schritte Kommerzielle nutzung eigener Javaapplets auf der Homepage Allgemeine Java-Themen 2
B Probleme mit eigener equals Methode Allgemeine Java-Themen 18
Kr0e Eigener Updatemechanismus Allgemeine Java-Themen 7
J Mein eigener Messenger und dessen Probleme Allgemeine Java-Themen 48
S Profiler-Funktionen in eigener Applikation nutzen..? Allgemeine Java-Themen 5
R Eigener Comparator Allgemeine Java-Themen 2
T Zeit von einem Server/Webseite auslesen und in eigener GUI anzeigen Allgemeine Java-Themen 6
V Probleme mit eigener Hashmap Allgemeine Java-Themen 10
B Eigener ClassLoader Allgemeine Java-Themen 9
R Eigener Assoziativ-Speicher Allgemeine Java-Themen 7
T CP Problem: Webstart + Logging properties file + eigener Handler Allgemeine Java-Themen 7
P eigener Klassenname Allgemeine Java-Themen 4
D Eigener Key bei AES Verschlüsselung Allgemeine Java-Themen 4
T enums - eigener startwert Allgemeine Java-Themen 5
J Eigener ClassLoader wird nicht immer verwendet Allgemeine Java-Themen 3
P eigener Thread für einen JButton Allgemeine Java-Themen 32
F Checkbox in JTable , eigener Cellrenderer -wie gehts weiter? Allgemeine Java-Themen 2
A JRE auf eigener Seite verlinken oder zum Download anbieten? Allgemeine Java-Themen 13
E Wie: Eigener Listener, eigenes Event (möglichst einfach) Allgemeine Java-Themen 29
D Eigener Maven2 Plugin Server? Allgemeine Java-Themen 3
I RSA - Eigener Quelltext Allgemeine Java-Themen 4
M eigener LautstärkeRegler schädlich für soundkarte? Allgemeine Java-Themen 4
K JTree plus eigener FileLoader Allgemeine Java-Themen 2
L Problem mit eigener, abgeleiteter Klasse Allgemeine Java-Themen 2
S Eigener Editor Allgemeine Java-Themen 7
L Eigener Onlinestunden- Zähler / Problemchen Allgemeine Java-Themen 2
N Was sind Logger in Java? (bzgl. SonarLint) Allgemeine Java-Themen 3
ralfb1105 LogManager logger schreibt nicht in Catch() Zweig Allgemeine Java-Themen 2
I Alle logs von Logger bekommen Allgemeine Java-Themen 3
B Best Practice Start-Applikation mit Logger? Allgemeine Java-Themen 3
A Threads Log4J Logger wird "überschrieben" Allgemeine Java-Themen 3
S log4j, root logger logt nur FATAL? Allgemeine Java-Themen 9
B OOP java.util.logging.Logger: Wie kann ich mehre Klassen in ein Logfile schreiben lassen? Allgemeine Java-Themen 12
E Logger loggt nicht alle Level Allgemeine Java-Themen 2
S Java Logger Allgemeine Java-Themen 5
3 Logger teilweise ausschalten Allgemeine Java-Themen 7
S Anonymer Logger - kann man irgendwie eine komplexere Config hinkriegen? Allgemeine Java-Themen 6
D Logger mit verschiedenen Ausgabezielen Allgemeine Java-Themen 2
J Logger gibt nicht alle Level aus Allgemeine Java-Themen 3
F Logger in mehrere Dateien mit log4J Allgemeine Java-Themen 4
Q Unterschied der Logger Allgemeine Java-Themen 9
G Java Logger Allgemeine Java-Themen 2
hdi Logger - wie am schlausten? Allgemeine Java-Themen 14
G Java Logger ohne Stack Trace ausgaben. Allgemeine Java-Themen 2
H java.util.Logger Allgemeine Java-Themen 5
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
N Value Wert aus HTML-Button mittels thymeleaf spring an java übergeben Allgemeine Java-Themen 2
N Lottowebsite programmieren mittels Java, HTML,.... Allgemeine Java-Themen 7
W PDFs signieren mittels IText / Lowagie Allgemeine Java-Themen 0
Zrebna Möglichkeit regelmäßige indentation mittels/innerhalb Stringbuilder Allgemeine Java-Themen 14
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
LimDul Mittels Streams aus Strings A B C den String A, B und C machen Allgemeine Java-Themen 12
X Brüche kürzen mittels Methoden und ggT Allgemeine Java-Themen 15
D HTTP Http-Link mittels GUI schreiben Allgemeine Java-Themen 5
B Java Sternchen ausgeben mittels Rekursion Allgemeine Java-Themen 3
J GUI-Einstellungen mittels Preferences Allgemeine Java-Themen 6
Todesbote JFileChooser im Vordergrund (*.jar wird mittels shell_exec in PHP aufgerufen) Allgemeine Java-Themen 1
E Videosequenz mittels Java aus Video schneiden Allgemeine Java-Themen 10
B Ordner öffnen mittels Java in Linux-Umgebung Allgemeine Java-Themen 7
I Webseite auslesen (welche mittels Javascript Inhalt einbindet) Allgemeine Java-Themen 4
T HTML Tag Position mittels Pattern ermitteln Allgemeine Java-Themen 7
RySa Variablenname mittels Reflexions rausbekommen (als String) ? Allgemeine Java-Themen 9
U Classpath DLLs mittels System.load() laden: Allgemeine Java-Themen 6
T Wie rufe ich mittels String-Inhalts eine Methode auf? Allgemeine Java-Themen 3
T Exif mittels Java auslesen Allgemeine Java-Themen 14
A Sudoku mittels Backtracking Problem Allgemeine Java-Themen 6
7 Webseiten mittels Java auslesen Allgemeine Java-Themen 7
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
dunhillone Mittels Annotations Methoden "erweitern"? Allgemeine Java-Themen 11
S Mittels eines Applets Bilder generieren die in einer Webseite angezeigt werden..? Allgemeine Java-Themen 8
X String zerlegen mittels regulärem Ausdruck Allgemeine Java-Themen 31
O Programm mittels Java installieren Allgemeine Java-Themen 15
S Array-Sort mittels Binärsuche Allgemeine Java-Themen 2
J Setter mittels invoice aufrufen Allgemeine Java-Themen 4
S Eingabeprüfung mittels Regexp Allgemeine Java-Themen 5
J Objekt in Datei speichern mittels Streams Allgemeine Java-Themen 6
D Einfaches Nutzen von Plugins mittels generischer Methode Allgemeine Java-Themen 3
E Aus mehreren PDFs eines machen, zusammenfügen mittels iText Allgemeine Java-Themen 1
G Graph mittels Punkte erstellen Allgemeine Java-Themen 27
M Problem bei PDF-Anzeige mittels Acrobat Viewer Bean Allgemeine Java-Themen 2
G HTML Code aus String mittels REGEX entfernen Allgemeine Java-Themen 2
spacegaier Performanceproblem beim Einlesen aus Datei mittels Threads Allgemeine Java-Themen 23
G Screenshot mittels robot ausführen Allgemeine Java-Themen 4
B Html Formulare mittels Java automatisch senden Allgemeine Java-Themen 5
E import mittels Eclipse Allgemeine Java-Themen 3
F mittels Collection<A> an A.class kommen? Allgemeine Java-Themen 7
T IF Abfrage + YES_NO Option mittels JOptionPane Allgemeine Java-Themen 3
F Zugriff mittels getObject() oder this.object ? Allgemeine Java-Themen 8
J Tonbalance mittels JMF regeln Allgemeine Java-Themen 3
G Font mittels ClassLoader in .jar wirft NotFoundException Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben