/********************************************************* begin of preamble
**
** Copyright (C) 2003-2010 Software- und Organisations-Service GmbH.
** All rights reserved.
**
** This file may be used under the terms of either the
**
** GNU General Public License version 2.0 (GPL)
**
** as published by the Free Software Foundation
** http://www.gnu.org/licenses/gpl-2.0.txt and appearing in the file
** LICENSE.GPL included in the packaging of this file.
**
** or the
**
** Agreement for Purchase and Licensing
**
** as offered by Software- und Organisations-Service GmbH
** in the respective terms of supply that ship with this file.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
********************************************************** end of preamble*/
package com.sos.JSHelper.Logging;
//import java.io.File;
//import java.io.FileNotFoundException;
//import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;
import org.apache.log4j.Appender;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.net.SMTPAppender;
import com.sos.JSHelper.Listener.JSListener;
import com.sos.JSHelper.io.Files.JSTextFile;
/**
* \file Log4JHelper.java
* \brief Erweiterung des Log4J-Apis
*
* \class Log4JHelper
* \brief Erweiterung des Log4J-Apis
*
* \details
* Diese Klasse erweitert das Log4J-Api um einige n�tzliche Funktionen. Sie betreffen vorallem
* die automatische Anlage einer Konfigurationsdatei, sowie die M�glichkeit komplette Logfiles
* (auf Wunsch mit Anhang) per Mail zu versenden.
*
* Eine Instanz dieser Klasse sollte i.d.R. 1x an oberster Stelle in der Klassenhierachie (Main-Klasse)
* gebildet werden. Ist das Logging-Environment einmal �ber diese Klasse konfiguriert worden, k�nnen alle
* untergeordneten Klassen eine Loggerinstanz mit der folgenden Zuweisung abrufen:
* \code
* Logger logger = Logger.getRootLogger();
* \endcode
*
* \note
* Es ist also \b nicht notwendig, eine Referenz auf das Logging-Objekt an untergeordnete Klassen weiterzugeben.
*
* Dieses Beispiel zeigt, wie diese Klasse in der Main-Klasse verwendet werden sollte:
* \code
* import org.apache.log4j.Logger;
* import org.apache.log4j.Level;
* import com.sos.logging.Log4JHelper;
*
* public class TestLog {
*
* private Log4JHelper objLogger = null;
* private Logger logger = null;
*
* public TestLog {
* objLogger = new Log4JHelper("log4j-TestLog.properties");
* logger = Logger.getRootLogger();
* objLogger.message("Aufruf der message-Methode"); // JSHelper-konform
* objLogger(Level.WARN);
* logger.debug("dieser Nachricht darf nicht ausgegeben werden");
* logger.debug("dieser Nachricht darf nicht ausgegeben werden");
* logger.warn("dieser Nachricht MUSS ausgegeben werden");
* logger.error("dieser Nachricht MUSS ausgegeben werden");
* logger.fatal("dieser Nachricht MUSS ausgegeben werden");
* SubClass = new SubClass();
* }
*
* }
* \endcode
*
* Einzelheiten zur Anwendung dieser Klasse in Log4JHelperTest.java.
*
* \author EQCPN
* @version $Id: Log4JHelper.java 14731 2011-07-05 20:50:42Z sos $04.03.2009
*
*
* <div class="sos_branding">
* <p>� 2009 APL/Software GmbH - Berlin - generated by ClaviusXPress (<a style="color:silver" href="http://www.sos-berlin.com" target="_blank">http://www.sos-berlin.com</a>)</p>
* </div>
*/
public class Log4JHelper implements JSListener {
private static final String conClassName = "Log4JHelper";
public static final String conPropfile = "log4j.properties";
// Standardappender f�r die Mailkonfiguration
public static final String conMailAppender = "mail";
//
public static final String conFileAppender = "mailfile";
public static boolean flgUseJobSchedulerLog4JAppender = false;
private String strFileAppender = conFileAppender;
private SMTPAppender objMailApp = null;
private Vector<String> objFiles = new Vector<String>();
public String Subject = conClassName;
private String strName = conClassName;
private Level objLevel;
private boolean flgPrintComputerName = false;
private static String strPropfileName = null;
private static Logger objCurrentLog = null; /*!< Ausgabe via individuellem Logger (log4j.category.xxx) */
private static Logger objRootLog = null; /*!< Ausgabe via RootLogger (log4j.rootCategory) */
/**
* \brief Standard-Instanziierung des Logging-Objektes
*
* \details
* Wird die Instanz des Logging-Objektes �ber diesen Konstruktor erzeugt, erfolgt die Konfiguration
* implizit �ber den Properties-File \c log4j.properties. Existiert diese Datei nicht, wird sie
* automatisch erzeugt. Sie enth�lt dann eine minimale Konfiguration des Log4J_Environments, welche
* lediglich Testausgaben auf der Konsole erlaubt.
* \verbatim
log4j.rootCategory=debug, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
\endverbatim
* Bei Bedarf ist diese Datei entsprechend zu erweitern.
*/
public Log4JHelper() {
configure(conPropfile, conClassName);
}
/**
* \brief Instanziierung des Logging-Objektes mit vorgegebener Konfigurationsdatei
*
* \details
* Wird die Instanz des Logging-Objektes �ber diesen Konstruktor erzeugt, erfolgt die Konfiguration
* �ber den Properties-File, der mit dem Parameter \c pstrProperties �bergeben worden ist. Existiert diese Datei nicht, wird sie
* automatisch erzeugt. Sie enth�lt dann eine minimale Konfiguration des Log4J_Environments, welche
* lediglich Testausgaben auf der Konsole erlaubt.
* \verbatim
log4j.rootCategory=debug, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
\endverbatim
* Bei Bedarf ist diese Datei entsprechend zu erweitern.
*/
public Log4JHelper(String pstrPropFile) {
configure(pstrPropFile, conClassName);
}
/**
* \brief Instanziierung des Logging-Objektes mit vorgegebener Konfigurationsdatei und Loggernamen
*
* \details
* Entspricht dem Konstruktor Log4JHelper(String pstrPropFile) mit der Erweiterung, dass mit dem
* Parameter \c pstrName ein eigener Name f�r die Logging-Instanz vergeben werden kann (Standard ist
* \c Log4JHelper).
* Die Verwendung dieses Konstruktors ist sinnvoll, wenn mehrere Logging-Instanzen parallel
* verwendet werden sollen.
*/
public Log4JHelper(String pstrPropFile, String pstrName) {
configure(pstrPropFile, pstrName);
}
/**
* \brief Vorbereitung des Logging-Environments
*
* \details
* Liest die Logging-Einstellungen aus der dem Properties-File. Existiert die Datei nicht, wird ein
* einfache Properties-Datei angelegt, welche die Ausgaben auf der Konsole erzeugt.
*
* @param pstrPropFileName
*/
private void configure(String pstrPropFileName, String pstrName) {
strPropfileName = pstrPropFileName;
strName = pstrName;
/**
* Anlegen der Properties-Datei, falls diese fehlt
*/
JSTextFile objFile = new JSTextFile(strPropfileName);
boolean flgNew = false;
boolean flgPropFileIsOk = true;
if (objFile.exists() == false) {
try {
objFile.WriteLine("log4j.rootCategory=debug, stdout");
if (flgUseJobSchedulerLog4JAppender == false) {
objFile.WriteLine("log4j.appender.stdout=org.apache.log4j.ConsoleAppender");
}
else {
/**
* von aussen steuern. bei junit-tests ist der consoleappender richtig, sonst nicht.
*/
objFile.WriteLine("log4j.appender.stdout=com.sos.JSHelper.Logging.JobSchedulerLog4JAppender");
}
objFile.WriteLine("log4j.appender.stdout.layout=org.apache.log4j.PatternLayout");
objFile.WriteLine("log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n");
objFile.close();
flgNew = true;
}
catch (Exception e) {
System.err.println(conClassName + ": unable to create the log4j-property-file " + objFile.getAbsolutePath());
e.printStackTrace();
flgPropFileIsOk = false;
}
}
/**
* Vorbereitung des Logging-Environments
*/
objRootLog = Logger.getRootLogger();
if (flgPropFileIsOk == true) {
PropertyConfigurator.configure(strPropfileName);
// TODO exception abfangen und direkt konfigurieren
}
else {
/**
* hier jetzt direkt konfigurieren
*/
try {
SimpleLayout layout = new SimpleLayout();
// Appender consoleAppender = new JobSchedulerLog4JAppender(layout);
Appender consoleAppender = new ConsoleAppender(layout);
objRootLog.addAppender(consoleAppender);
// ALL | DEBUG | INFO | WARN | ERROR | FATAL | OFF:
objRootLog.setLevel(Level.DEBUG);
objRootLog.debug("Log4J configured programmatically");
}
catch (Exception ex) {
ex.printStackTrace();
}
}
if (pstrName.equals(conClassName))
objCurrentLog = objRootLog;
else
objCurrentLog = Logger.getLogger(strName);
if (flgNew) {
objRootLog.warn("log4j-property-file did not exist - a simple default-file was created");
objRootLog.debug("using log4j-property-file " + objFile.getAbsolutePath());
objRootLog.warn("all log-entries will be written to the console");
}
objLevel = objCurrentLog.getLevel();
}
/**
* \brief message-Methode aus JSListener �berschreiben
*
* \details
* Diese Klasse implementiert das Interface JSListener, welches die Methode \c message()
* verlangt. Damit kann der vielfach im JSHelper verwendeten Methode \c registerMessageListener()
* eine Instanz dieser Klasse �bergeben werden, die dann die Ausgabe �bernimmt.
* Da das Interface JSListener keine Unterscheidung zwischen einfachen Testausgaben (debug), Hinweisen (info),
* Warnungen (warn) und Fehlern (error) macht, erfolgt die Ausgabe in Log4J bei Aufruf von message()
* immer mit \c warn um sicherzustellen, dass i.d.R. alle Ausgaben auch im Logging sichtbar sind, selbst
* wenn die Log4J-Konfiguration \c debug und \c info unterdr�ckt.
* Nach M�glichkeit sollten die Methoden des Log4J-Api verwendet werden, die diese in ihren Ausgaben den Namen
* des Java-Files und die Zeile, welche die Ausgabe erzeugt hat korrekt wiedergeben (wenn die Property
* ConversionPattern im Konfigurationsfile entsprechend festgelegt worden ist).
* \return
*
* @param pstrMsg
*/
public void message(String pstrMsg) {
objCurrentLog.warn(pstrMsg);
}
/**
* \brief Ver�ndern des Ausgabelevels zur Laufzeit
*
* \details
* F�r gew�hnlich wird der Ausgabelevel (debug, info, warn, error) einmalig in der log4J-Konfigurationsdatei
* vorgegeben. Der Aufruf dieser Methode erlaubt das �ndern des Ausgabelevels zur Laufzeit. Als Parameter
* mu� einer der in Log4J zugelassenen Ausgabelevel der Klasse Level �bergeben werden.
*
* @param intLevel
*/
public void setLevel(Level intLevel) {
objCurrentLog.setLevel(intLevel);
}
/**
* \brief Zur�cksetzen des Ausgabelevels
*
* \details
* Setzt (nach einem vorhergehenden Aufruf der Methode setLevel()) den Ausgabelevel auf den Ausgangswert der Konfigurationsdatei zur�ck.
*
* \return void
*
*/
public void restoreLevel() {
setLevel(objLevel);
}
/**
* \brief Anf�gen einer (externen) Datei als Mail-Anhang
*
* \details
* Neben der Logdatei k�nnen ein oder mehrere Dateien (beispielweise Datenfiles) als Anhang im
* Mail mitgeschickt werden.
*
* @param pstrFilename
* @throws Exception
*/
public void attachFile(String pstrFilename) throws Exception {
JSTextFile objF = new JSTextFile(pstrFilename);
objF.MustExist();
objFiles.add(pstrFilename);
}
/**
* \brief Logfile als Attachment f�r das Mail vormerken
*
* \details
* Mit dieser Methode wird ein Logfile als Attachment f�r das zu versendende Mail vorgemerkt. Als
* Parameter wird \b nicht der Name des Files, sondern der Name des Appenders aus der Log4J-Konfiguration
* angegeben. Voraussetzung ist, dass es sich um einen \c RollingFileAppender handelt.
* \verbatim
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=APOTransformer.log
log4j.appender.file.MaxFileSize=1000KB
log4j.appender.file.MaxBackupIndex=30
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.mailfile.layout.ConversionPattern=%t %-5p %-21d{hh:mm:ss,SSS} (%F:%L) %m %n
\endverbatim
* Mit dem Aufruf dieser Methode wird der Standard-Appender conFileAppender �berschrieben.
*
* @param pstrFileAppender - Name des FileAppenders
*/
public void setFileAppenderForMail(String pstrFileAppender) {
strFileAppender = pstrFileAppender;
}
/**
* \brief Mailverand des Loggings
*
* \details
* Mit dem Aufruf dieser Methode wird eine Mail versendet, die mindestens einen Logfile als Anhang hat.
* Voraussetzung ist, dass die Log4J-Konfigurationdatei den Appender \c conMailAppender vom Typ SMTPAppender
* enth�lt.
*
* \see sendMail(String pstrSubject, String pstrMailAppender)
*
* Existiert
* \return void
*
* @param pstrSubject
* @throws MissingAppenderException
* @throws IllegalAppenderTypeException
* @throws FileNotFoundException
*/
// public void sendMail(String pstrSubject) throws MissingAppenderException, IllegalAppenderTypeException, FileNotFoundException {
// sendMail(pstrSubject, conMailAppender);
// }
/**
* \brief Mailverand des Loggings
*
* \details
* Mit dem Aufruf dieser Methode wird eine Mail versendet, die mindestens einen Logfile als Anhang hat.
* Voraussetzung ist, dass die Log4J-Konfigurationdatei den Appender \c pstrMailAppender vom Typ SMTPAppender
* enth�lt:
* \verbatim
log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.BufferSize=1
log4j.appender.mail.SMTPHost=hostname.com
log4j.appender.mail.From=sender@root.com
log4j.appender.mail.To=receiver.address@global.com
log4j.appender.mail.Subject=an error was detected
log4j.appender.mail.threshold=error
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
\endverbatim
*
* Beispielhafter Code f�r den Mailversand:
* \code
Log4JMail objMail = logger.newMail();
logger.setFileAppenderForMail("file");
objMail.attachFile(objOptions.apoProdDataFile()); // Datendatei als Attachment
logger.sendMail("APOTransformer: daily logfile");
\endcode
*
* Existiert
* \return void
*
* @param pstrSubject
* @throws MissingAppenderException
* @throws IllegalAppenderTypeException
* @throws FileNotFoundException
*/
// public void sendMail(String pstrSubject, String pstrMailAppender) throws MissingAppenderException, IllegalAppenderTypeException, FileNotFoundException {
//
// objMailApp = checkMailAppender(pstrMailAppender);
// FileAppender objFile = checkFileAppender(strFileAppender);
// attachFile(objFile.getFile());
// Subject = pstrSubject;
//
// if (isSubjectPraefix()) {
// String strPre = (System.getenv("COMPUTERNAME") != null) ? System.getenv("COMPUTERNAME") : "???";
// Subject = "[" + strPre + "] " + Subject;
// }
//
// if (objFiles.size() == 0) {
// throw new MissingAppenderException("Kein Mailversand, da kein Logfile in den log4j-properties definiert (Appender 'file' nicht vorhanden");
// }
//
// objRootLog.debug("Mailversand an " + objMailApp.getTo());
//
// Properties objProp = new Properties();
// objProp.put("mail.smtp.host", objMailApp.getSMTPHost());
// Session objSess = Session.getInstance(objProp);
// MimeMessage objMess = new MimeMessage(objSess);
//
// // Absenderadresse setzen
// InternetAddress objFrom;
// try {
// objFrom = new InternetAddress(objMailApp.getFrom());
// objMess.setFrom(objFrom);
// }
// catch (AddressException e) {
// objRootLog.error(objMailApp.getFrom() + " ist (formal) keine g�ltige Mailadresse");
// e.printStackTrace();
// }
// catch (MessagingException e) {
// objRootLog.error("Interner Fehler beim Setzen der Absenderadresse " + objMailApp.getFrom() + "im Message-Objekt der Mail-Api.");
// e.printStackTrace();
// }
//
// // Emp�ngeradressen setzen
// String arrTo[] = objMailApp.getTo().split(",");
// for (int i = 0; i < arrTo.length; i++) {
// InternetAddress rcpt;
// try {
// rcpt = new InternetAddress(arrTo[i]);
// objMess.addRecipient(Message.RecipientType.TO, rcpt);
// }
// catch (AddressException e) {
// objRootLog.error(arrTo[i] + " ist (formal) keine g�ltige Mailadresse");
// e.printStackTrace();
// }
// catch (MessagingException e) {
// objRootLog.error("Interner Fehler beim Setzen der Emp�ngeradresse " + objMailApp.getFrom() + "im Message-Objekt der Mail-Api.");
// e.printStackTrace();
// }
// }
//
// // Subject setzen
// try {
// objMess.setSubject(Subject);
// }
// catch (MessagingException e) {
// objRootLog.error("Interner Fehler beim Setzen des Subjects im Message-Objekt der Mail-Api.");
// e.printStackTrace();
// }
//
// // Body setzen
// try {
//
// // Bodytext
// BodyPart objBody = new MimeBodyPart();
// objBody.setText("logfile created from " + conClassName + "\n");
// Multipart multipart = new MimeMultipart();
// multipart.addBodyPart(objBody);
//
// // Attachments verarbeiten
// Enumeration<String> objE = objFiles.elements();
// while (objE.hasMoreElements()) {
// objBody = new MimeBodyPart();
// String strFilename = objE.nextElement();
// objRootLog.debug("File " + strFilename + " an Mail angehangen");
// DataSource objSource = new FileDataSource(strFilename);
// objBody.setDataHandler(new DataHandler(objSource));
// objBody.setFileName(strFilename);
// multipart.addBodyPart(objBody);
// }
//
// // Schreiben in das Message-Objekt
// objMess.setContent(multipart);
// }
// catch (MessagingException e1) {
// objRootLog.error("Interner Fehler beim Schreiben des Bodys im Message-Objekt der Mail-Api.");
// e1.printStackTrace();
// }
//
// // Mailversand
// try {
// Transport.send(objMess);
// }
// catch (MessagingException e) {
// objRootLog.error("Interner Fehler beim Absenden des Mails im Message-Objekt der Mail-Api.");
// e.printStackTrace();
// }
//
// }
/**
* \brief Ausgabe des Aufrufstacks
*
* \details
* Der Aufrufstack wird normalerweise nicht in den Logfiles ausgegeben.
* Diese Methode schreibt den komplette Aufrufstack, so wie er mit dem Kommando
* Exception.printStackTrace() auf der Konsole ausgegeben wird, auf die Loggingkan�le.
*
* Aufrufbeispiel:
* \code
try {
...
}
catch (Throwable e) {
logger.error(e.getMessage());
logger.logStackTrace(e);
e.printStackTrace();
}
\endcode
* \return void
*
* @param e
*/
public void logStackTrace(Throwable e) {
StackTraceElement objEle[] = e.getStackTrace();
setLevel(Level.DEBUG);
for (int i = 0; i < objEle.length; i++) {
StackTraceElement s = objEle[i];
String strTarget = s.getFileName() + ":" + s.getLineNumber();
if (s.getLineNumber() == -1)
strTarget = "Unknown Source";
if (s.getLineNumber() == -2)
strTarget = "Native Method";
objRootLog.debug(" at " + s.getClassName() + "." + s.getMethodName() + "(" + strTarget + ")");
}
restoreLevel();
}
/**
* \brief Name des Property-Files
*
* \details
* Liefert den Namen der Konfigurationsdatei f�r das Logging.
*
* \return String
*/
public static String getPropertyFile() {
return strPropfileName;
}
/**
* \brief Existenz eines Appenders vom Typ \c FileAppender pr�fen
*
* \details
* Pr�ft das Vorhandensein und den Typ des Appenders \c pstrAppender in der Log4J-Konfigurationsdatei.
*
* \return FileAppender
*
* @param pstrAppender
* @throws MissingAppenderException - Appender ist nicht vorhanden
* @throws IllegalAppenderTypeException - Appender ist nicht vom Typ FileAppender
*/
public FileAppender checkFileAppender(String pstrAppender) throws MissingAppenderException, IllegalAppenderTypeException {
Appender objApp = checkAppender(pstrAppender);
if (!(objApp instanceof FileAppender)) {
throw new IllegalAppenderTypeException("Kein Mailversand, da der Appender '" + pstrAppender + "' in '" + getPropertyFile()
+ " nicht vom Typ 'FileAppender' ist");
}
return (FileAppender) objApp;
}
/**
* \brief Existenz eines Appenders vom Typ \c SMTPAppender pr�fen
*
* \details
* Pr�ft das Vorhandensein und den Typ des Appenders \c pstrAppender in der Log4J-Konfigurationsdatei.
*
* \return FileAppender
*
* @param pstrAppender
* @throws MissingAppenderException - Appender ist nicht vorhanden
* @throws IllegalAppenderTypeException - Appender ist nicht vom Typ SMTPAppender
*/
public SMTPAppender checkMailAppender(String pstrAppender) throws MissingAppenderException, IllegalAppenderTypeException {
Appender objApp = checkAppender(pstrAppender);
if (!(objApp instanceof SMTPAppender)) {
throw new IllegalAppenderTypeException("Kein Mailversand, da der Appender '" + pstrAppender + "' in '" + getPropertyFile()
+ " nicht vom Typ 'SMTPAppender' ist");
}
return (SMTPAppender) objApp;
}
/**
* \brief Existenz eines Appenders pr�fen
*
* \details
* Pr�ft das Vorhandensein des Appenders \c pstrAppender in der Log4J-Konfigurationsdatei.
*
* \return FileAppender
*
* @param pstrAppender
* @throws MissingAppenderException - Appender ist nicht vorhanden
*/
public Appender checkAppender(String pstrAppender) throws MissingAppenderException {
Appender objApp = null;
objApp = objRootLog.getAppender(pstrAppender);
if (objApp == null) {
throw new MissingAppenderException("Kein Mailversand, da keine Mailkonfiguration in den log4j-properties definiert ist (Appender '" + pstrAppender
+ "' ist nicht in '" + getPropertyFile() + "' vorhanden.");
}
return objApp;
}
public static void debugAppenders(Logger pobjLogger) {
objRootLog.debug("Alle Appenders des Loggers " + pobjLogger.getName());
Enumeration objE = pobjLogger.getAllAppenders();
while (objE.hasMoreElements()) {
Appender objA = (Appender) objE.nextElement();
objRootLog.debug(objA.getName());
}
}
public boolean isSubjectPraefix() {
return flgPrintComputerName;
}
public void setSubjectPraefix(boolean pflgPrintComputerName) {
this.flgPrintComputerName = pflgPrintComputerName;
}
}