如何写一个调试良好的日志记录,毫无疑问,log4j,slf4j,,logback都是必选之一了。
日志记录器(Logger)的行为是分等级的。如下表所示:
分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
一般来说,这4个就够了,网上看到有人自定义日志级别,觉得完全没必要。还有人说log4j只有5个或者4个级别,此种说法不知是从何得来。
经典的log4j。
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender #log4j.appender.stdout.layout=org.apache.log4j.PatternLayout #log4j.appender.stdout.layout.ConversionPattern=(%F:%L) - %m%n log4j.rootLogger = DEBUG,A1,A4 log4j.appender.A1.Threshold=DEBUG log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout #log4j.appender.A1.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %l%n%m%n log4j.appender.A1.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%m%n log4j.appender.A1.File=${webappHome}/logs/log.txt log4j.appender.A1.DatePattern=yyyy-MM-dd'.txt' log4j.appender.A1.Encoding=UTF-8 #log4j.appender.A1.MaxFileSize= 1000KB log4j.appender.A4=org.apache.log4j.FileAppender log4j.appender.A4.Encoding=UTF-8 log4j.appender.A4.file=alllog.txt log4j.appender.A4.Append=true log4j.appender.A4.layout=org.apache.log4j.PatternLayout log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
如果是WEB项目,可在web.xml中配置。
<servlet> <servlet-name>Log4jinit</servlet-name> <servlet-class>com.sinoglobal.servlets.Log4jinit</servlet-class> <init-param> <param-name>log4j</param-name> <param-value>WEB-INF/classes/log4j.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Log4jinit</servlet-name> <url-pattern>/log4jinit</url-pattern> </servlet-mapping>
package com.sinoglobal.servlets; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.apache.log4j.PropertyConfigurator; import com.sinoglobal.cons.Const; import com.sinoglobal.utils.DateUtils; public class Log4jinit extends HttpServlet { private static final long serialVersionUID = -3297990648398759356L; @Override public void init() throws ServletException { String prefix = getServletContext ().getRealPath ("/"); String test = getServletContext ().getRealPath (""); System.setProperty ("webappHome",test); String file = getServletConfig ().getInitParameter ("log4j"); Const.SysStartTime=DateUtils.getNowDate("yyyy-MM-dd HH:mm:ss.SSS"); // 从Servlet参数读取log4j的配置文件 if(file != null) { PropertyConfigurator.configure (prefix + file); } } }
如果是JAVA项目,可以这样配置:
private void initLog4j(){ String path=IconUtils.root; System.setProperty("webappHome", path); PropertyConfigurator.configure (path + "/src/log4j.properties"); logger.info("一个错误。。"); }IconUtils中:
package com.ui; import java.awt.Color; import java.awt.Toolkit; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; /** * 设置背景图片和系统图标的公用方法 * @author lz * */ public class IconUtils { public final static String root = System.getProperty("user.dir"); public final static Toolkit tk = Toolkit.getDefaultToolkit(); private final static ImageIcon img = new ImageIcon(root + "/resource/img/login.JPG"); private final static JLabel imgLabel = new JLabel(img);// 将背景图放在标签里 public static void setIcon(JFrame jf) { jf.setIconImage(tk.createImage(root + "/resource/img/Emule.png")); } public static void setBackgroundImage(JFrame jf) { jf.getContentPane().setBackground(Color.white); jf.add(imgLabel, new Integer(Integer.MIN_VALUE)); imgLabel.setBounds(0, 0, img.getIconWidth(), img.getIconHeight()); } }
以上配置一个为alllog.txt,一个为一天生成一个的日志,生成错误后,你可以改变电脑时间,发现它会把之前一天的log.txt后面加上时间,也就是log4j.appender.A1.DatePattern=yyyy-MM-dd'.txt'这句话。
System.getProperty("user.dir");获取的是当前项目的主目录。
而关于它的更详细的记录,此处不赘述了,网上有许多。
重点要知道其中ConversionPattern[输出格式]以及日志输出地。日志级别即可。
可以写一个自己的dtd声明:
<?xml version="1.0" encoding="UTF-8" ?> <!-- Authors: Chris Taylor, Ceki Gulcu. --> <!-- Version: 1.2 --> <!-- A configuration element consists of optional renderer elements,appender elements, categories and an optional root element. --> <!ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?, categoryFactory?)> <!-- The "threshold" attribute takes a level value such that all --> <!-- logging statements with a level equal or below this value are --> <!-- disabled. --> <!-- Setting the "debug" enable the printing of internal log4j logging --> <!-- statements. --> <!-- By default, debug attribute is "null", meaning that we not do touch --> <!-- internal log4j logging settings. The "null" value for the threshold --> <!-- attribute can be misleading. The threshold field of a repository --> <!-- cannot be set to null. The "null" value for the threshold attribute --> <!-- simply means don't touch the threshold field, the threshold field --> <!-- keeps its old value. --> <!ATTLIST log4j:configuration xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/" threshold (all|debug|info|warn|error|fatal|off|null) "null" debug (true|false|null) "null" > <!-- renderer elements allow the user to customize the conversion of --> <!-- message objects to String. --> <!ELEMENT renderer EMPTY> <!ATTLIST renderer renderedClass CDATA #REQUIRED renderingClass CDATA #REQUIRED > <!-- Appenders must have a name and a class. --> <!-- Appenders may contain an error handler, a layout, optional parameters --> <!-- and filters. They may also reference (or include) other appenders. --> <!ELEMENT appender (errorHandler?, param*, layout?, filter*, appender-ref*)> <!ATTLIST appender name ID #REQUIRED class CDATA #REQUIRED > <!ELEMENT layout (param*)> <!ATTLIST layout class CDATA #REQUIRED > <!ELEMENT filter (param*)> <!ATTLIST filter class CDATA #REQUIRED > <!-- ErrorHandlers can be of any class. They can admit any number of --> <!-- parameters. --> <!ELEMENT errorHandler (param*, root-ref?, logger-ref*, appender-ref?)> <!ATTLIST errorHandler class CDATA #REQUIRED > <!ELEMENT root-ref EMPTY> <!ELEMENT logger-ref EMPTY> <!ATTLIST logger-ref ref IDREF #REQUIRED > <!ELEMENT param EMPTY> <!ATTLIST param name CDATA #REQUIRED value CDATA #REQUIRED > <!-- The priority class is org.apache.log4j.Level by default --> <!ELEMENT priority (param*)> <!ATTLIST priority class CDATA #IMPLIED value CDATA #REQUIRED > <!-- The level class is org.apache.log4j.Level by default --> <!ELEMENT level (param*)> <!ATTLIST level class CDATA #IMPLIED value CDATA #REQUIRED > <!-- If no level element is specified, then the configurator MUST not --> <!-- touch the level of the named category. --> <!ELEMENT category (param*,(priority|level)?,appender-ref*)> <!ATTLIST category class CDATA #IMPLIED name CDATA #REQUIRED additivity (true|false) "true" > <!-- If no level element is specified, then the configurator MUST not --> <!-- touch the level of the named logger. --> <!ELEMENT logger (level?,appender-ref*)> <!ATTLIST logger name ID #REQUIRED additivity (true|false) "true" > <!ELEMENT categoryFactory (param*)> <!ATTLIST categoryFactory class CDATA #REQUIRED> <!ELEMENT appender-ref EMPTY> <!ATTLIST appender-ref ref IDREF #REQUIRED > <!-- If no priority element is specified, then the configurator MUST not --> <!-- touch the priority of root. --> <!-- The root category always exists and cannot be subclassed. --> <!ELEMENT root (param*, (priority|level)?, appender-ref*)> <!-- ==================================================================== --> <!-- A logging event --> <!-- ==================================================================== --> <!ELEMENT log4j:eventSet (log4j:event*)> <!ATTLIST log4j:eventSet xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/" version (1.1|1.2) "1.2" includesLocationInfo (true|false) "true" > <!ELEMENT log4j:event (log4j:message, log4j:NDC?, log4j:throwable?, log4j:locationInfo?) > <!-- The timestamp format is application dependent. --> <!ATTLIST log4j:event logger CDATA #REQUIRED level CDATA #REQUIRED thread CDATA #REQUIRED timestamp CDATA #REQUIRED > <!ELEMENT log4j:message (#PCDATA)> <!ELEMENT log4j:NDC (#PCDATA)> <!ELEMENT log4j:throwable (#PCDATA)> <!ELEMENT log4j:locationInfo EMPTY> <!ATTLIST log4j:locationInfo class CDATA #REQUIRED method CDATA #REQUIRED file CDATA #REQUIRED line CDATA #REQUIRED >
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <!-- 将日志信息输出到控制台 --> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" /> </layout> </appender> <!-- 以下根据级别将日志信息输出到不同的文件中 --> <!--设定级别为debug的配置信息 --> <appender name="DEBUG" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="D:\\logs\\app-debug.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="500MB" /> <param name="MaxBackupIndex" value="2" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="DEBUG" /> </filter> </appender> <!--设定级别为info的配置信息 --> <appender name="INFO" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="D:\\logs\\app-info.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="500KB" /> <param name="MaxBackupIndex" value="2" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="INFO" /> </filter> </appender> <!--设定级别为warn的配置信息 --> <appender name="WARN" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="D:\\logs\\app-warn.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="500KB" /> <param name="MaxBackupIndex" value="2" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="WARN" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <!--设定级别为deb的配置信息 --> <appender name="ERROR" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="D:\\logs\\error.log" /> <param name="Append" value="true" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <param name="LevelMax" value="ERROR" /> </filter> </appender> <!--配置具体要实现的方式,这边只设定了STDOUT,ERROR这2种情况,没有使用到的情况,不要在上面 配置,否则会出错 --> <root> <priority value="info" /> <appender-ref ref="STDOUT" /> <appender-ref ref="ERROR" /> </root> </log4j:configuration>
可以参考以下2篇文章:
1篇为基础,1篇为内部挖掘。
其一:http://www.blogjava.net/zJun/archive/2006/06/28/55511.html
Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。
1. 配置文件
Log4J配置文件的基本格式如下:
a输出创建日志的AppDomain的名称 c默认输出logger的全名称。后面可跟“{数字}”,则表示输出与数字对应的logger名称级别(从右边开始)。如全名为“a.b.c”,“%c{2}”输出“b.c” C输出调用日志纪录请求的类名。后面可跟“{数字}”,表示输出与数字对应的类名称(包含命名空间,从右边开始)。 d输出日志记录时间,后可跟“{时间格式}”。默认为yyyy-MM-dd HH:mm:ss,fff F输出调用日志纪录请求的文件全名。(会影响速度) l输出调用日志纪录请求的一些本地信息。如类和成员名,调用文件和调用声明的代码行数。(极其影响性能) L输出调用日志纪录请求的声明代码行数。(极其影响性能) m输出应用程序所要输出的信息。 M输出调用日志纪录请求的成员名称。(极其影响性能) n输出换行符号 p输出日志请求的Level值 r输出从应用程序启动开始到日志纪录请求的时间(毫秒) t输出产生日志的线程名称,如果没有名称则输出线程的编号 u输出当前活动用户的名称。(Principal.Identity.Name) W输出当前活动用户的windows标识。 %输出一个%号
其二:http://heavyz.sourceforge.net/homepage/homepage_zh/comp/notes/log4j.html
Apache Logging Project Homepage: http://logging.apache.org
Logger对象是用来取代System.out或者System.err的日志写出器,用来供程序员输出日志信息。
Logger类对象提供一系列方法供程序员输出日志信息:
Logger由一个String类的名字识别,logger的名字是大小写敏感的,且名字之间具有继承的关系,子名有父名作为前缀,用点号.分隔。如:x.y是x.y.z的父亲。
根logger (root logger)是所有logger的祖先,它具有如下属性:1) 它总是存在的;2) 它不可以通过名字获得。
通过调用public static Logger Logger.getRootLogger()获得root logger;通过调用public static Logger Logger.getLogger(String name)或者public static Logger Logger.getLogger(Class clazz)获得(或者创建)一个named logger。后者相当于调用Logger.getLogger(clazz.getName())。
在某对象中,用该对象所属的类为参数,调用Logger.getLogger(Class clazz)以获得logger被认为是目前所知的最理智的命名logger的方法。
每个logger都被分配了一个日志级别 (log level),用来控制日志信息的输出。未被分配level的logger将继承它最近的父logger的level。
每条输出到logger的日志请求(logging request)也都有一个level,如果该request的level大于等于该logger的level,则该request将被处理(称为enabled);否则该request将被忽略。故可得知:
Level类中预定义了五个level,它们的大小关系如下:
Level.ALL < Level.DEBUG < Level.INFO < Level.WARN < Level.ERROR < Level.FATAL < Level.OFF
以下代码将用自己所属的类为参数,创建一个logger,启用默认配置,设置其level并向其输出若干logging request。
import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; public class Log4jTest { public static void main(String argv[]) { // Create a logger by the name of class Log4jTest. Logger logger = Logger.getLogger(Log4jTest.class); // Use the default configuration. BasicConfigurator.configure(); // Set the logger level to Level.INFO logger.setLevel(Level.INFO); // This request will be disabled since Level.DEBUG < Level.INFO. logger.debug("This is debug."); // These requests will be enabled. logger.info("This is an info."); logger.warn("This is a warning."); logger.error("This is an error."); logger.fatal("This is a fatal error."); return; } }
每个logger都可以拥有一个或者多个appender,每个appender表示一个日志的输出目的地,比如console或者某个文件。可以使用Logger.addAppender(Appender app)为logger增加一个appender;可以使用Logger.removeAppender(Appender app)为logger移除一个appender。
默认情况下,logger的additive标志被设置为true,表示子logger将继承父logger的所有appenders。该选项可以被重新设置,表示子logger将不再继承父logger的appenders。
root logger拥有目标为system.out的consoleAppender,故默认情况下,所有的logger都将继承该appender。
// Log4j APIs : class Logger // 为logger对象增加或者移除一个Appender对象 public void appAppender(Appender app); public void removeAppender(Appender app); // 获得和设置additive标志:是否继承父logger的appenders // 注意:在设置additive标志为false时,必须保证已经为该logger设置了新的appender, // 否则log4j将报错:log4j:WARN No appenders could be found for logger (x.y.z). public boolean getAdditivity(); public void setAdditivity(boolean additive);
可以使用ConsoleAppender对象把日志输出到控制台。每个ConsoleAppender都有一个target,表示它的输出目的地。它可以是System.out,标准输出设备(缓冲显示屏);或者是System.err,标准错误设备(不缓冲显示屏)。ConsoleAppender的使用方法参考如下API:
// Log4j APIs : class ConsoleAppender extends WriterAppender // 构造方法,使用一个Layout对象构造一个ConsoleAppender对象 // 默认情况下,ConsoleAppender的target是System.out public ConsoleAppender(Layout layout); // 构造方法,使用一个Layout对象和一个target字符串构造ConsoleAppender对象 // target的可能取值为ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR public ConsoleAppender(Layout layout, String target);
可以使用FileAppender对象把日志输出到一个指定的日志文件中去。使用方法可以参考如下的API:
// Log4j APIs : class FileAppender extends WriterAppender // 构造方法,使用一个Layout对象和日志文件名构造一个FileAppender对象 public FileAppender(Layout layout, String filename) throws IOException; public FileAppender(Layout layout, String filename, boolean append) throws IOException;
可以使用FileAppender的子类RollingFileAppender对象,把日志输出到一个指定的日志文件中。不同的是该日志文件的大小受到限制,当日志内容超出最大的尺寸时,该文件将向上滚动(最老的日志被擦除)。还可以在该类对象中指定为日志文件做多少个备份。具体使用方法参考如下API:
// Log4j APIs : class RollingFileAppender extends FileAppender // 构造方法,使用一个Layout对象和日志文件名构造一个RollingFileAppender对象 public RollingFileAppender(Layout layout, String filename) throws IOException; public RollingFileAppender(Layout layout, String filename, boolean append) throws IOException; // 获得和设置日志备份文件的个数 public int getMaxBackupIndex(); public void setMaxBackupIndex(int index); // 获得和设置滚动日志文件的最大尺寸 public long getMaximumFileSize(); public void setMaximumFileSize(long size);
每个appender都和一个layout相联系;layout的任务是格式化用户的logging request,appender的任务是把layout格式化好的输出内容送往指定的目的地。
PatternLayout是Layout的一个子类,用来使用类似C语言的printf函数中使用的格式控制字符串来控制日志的输出格式。使用方法参考如下API:
// Log4j APIs : class PatternLayout extends Layout // 无参数构造方法,使用DEFAULT_CONVERSION_PATTERN构造一个PatternLayout // 注意:DEFAULT_CONVERSION_PATTERN为"%m%n",只打印消息信息 public PatternLayout(); // 构造方法,使用自定义的pattern构造一个PatternLayout public PatternLayout(String pattern); // 获得和设置PatternLayout对象的日志pattern public String getConversionPattern(); public void setConversionPattern(String pattern);
对log4j环境的配置就是对root logger的配置,包括把root logger设置为哪个级别(level);为它增加哪些appender,等等。这些可以通过设置系统属性的方法来隐式地完成,也可以在程序里调用XXXConfigurator.configure()方法来显式地完成。
Logger类的静态初始化块(static initialization block)中对log4j的环境做默认的初始化。注意:如果程序员已经通过设置系统属性的方法来配置了log4j环境,则不需要再显式地调用XXXConfigurator.configure()方法来配置log4j环境了。
Logger的静态初始化块在完成初始化过程时将检查一系列log4j定义的系统属性。它所做的事情如下:
BasicConfigurator.configure()方法使用最简的方法配置log4j环境。注:所谓配置log4j环境,就是指配置root logger,因为所有其它的logger都是root logger的后代,所以它们(默认情况下)都将继承root logger的性质。
BasicConfigurator.configure()完成的任务是:
xml格式的log4j配置文件需要使用org.apache.log4j.xml.DOMConfigurator.configure()方法来读入。对xml文件的语法定义可以在log4j的发布包中找到:org/apache/log4j/xml/log4j.dtd。
log4j的xml配置文件的树状结构如下所示,注意下图只显示了常用的部分。
xml declaration and DTD | log4j:configuration | +-- appender (name, class) | | | +-- param (name, value) | +-- layout (class) | | | +-- param (name, value) +-- logger (name, additivity) | | | +-- level (class, value) | | | | | +-- param (name, value) | +-- appender-ref (ref) +-- root | +-- param (name, class) +-- level | | | +-- param (name, value) +-- appender-ref (ref)
xml配置文件的头部包括两个部分:xml声明和DTD声明。头部的格式如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
appender元素定义一个日志输出目的地。
layout元素定义与某一个appender相联系的日志格式化器。
logger元素定义一个日志输出器。
root元素定义根日志输出器root logger。
level元素定义logger对象的日志级别。
appender-ref元素引用一个appender元素的名字,为logger对象增加一个appender。
param元素在创建对象时为类的构造方法提供参数。它可以成为appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。
创建不同的Appender对象或者不同的Layout对象要调用不同的构造方法。可以使用param子元素来设定不同的参数值。
ConsoleAppender的构造方法不接受其它的参数。
... ... ... ... <appender name="console.log" class="org.apache.log4j.ConsoleAppender"> <layout ... > ... ... </layout> </appender> ... ... ... ...
可以为FileAppender类的构造方法传递两个参数:File表示日志文件名;Append表示如文件已存在,是否把日志追加到文件尾部,可能取值为"true"和"false"(默认)。
... ... ... ... <appender name="file.log" class="org.apache.log4j.FileAppender"> <param name="File" value="/tmp/log.txt" /> <param name="Append" value="false" /> <layout ... > ... ... </layout> </appender> ... ... ... ...
除了File和Append以外,还可以为RollingFileAppender类的构造方法传递两个参数:MaxBackupIndex备份日志文件的个数(默认是1个);MaxFileSize表示日志文件允许的最大字节数(默认是10M)。
... ... ... ... <appender name="rollingFile.log" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="/tmp/rollingLog.txt" /> <param name="Append" value="false" /> <param name="MaxBackupIndex" value="2" /> <param name="MaxFileSize" value="1024" /> <layout ... > ... ... </layout> </appender> ... ... ... ...
可以为PatternLayout类的构造方法传递参数ConversionPattern。
... ... ... ... <layout class="org.apache.log4j.PatternLayout> <param name="Conversion" value="%d [%t] %p - %m%n" /> </layout> ... ... ... ...
为WSOTA(Web Services Over The Air)项目开发java web start的胖客户端时,使用了如下的xml文件配置log4j环境(文件名为wsota-rc.log4j.xml):
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- ================================================================= --> <!-- a rolling file appender --> <!-- ================================================================= --> <appender name="wsota-rc.file.log" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="/tmp/wsota-rc.log" /> <param name="Append" value="false" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %p - %m%n" /> </layout> </appender> <!-- ================================================================= --> <!-- a console appender --> <!-- debug can be turned off by setting level of root to "off" --> <!-- ================================================================= --> <appender name="wsota-rc.console.log" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %p - %m%n" /> </layout> </appender> <!-- use this to turn on debug to a rolling file. --> <root> <level value="debug" /> <appender-ref ref="wsota-rc.file.log" /> </root> <!-- use this to turn on debug to console. --> <!-- <root> <level value="off" /> <appender-ref ref="wsota-rc.console.log" /> </root> --> <!-- use this to turn off debug. --> <!-- <root> <level value="off" /> <appender-ref ref="wsota-rc.console.log" /> </root> --> </log4j:configuration>
在胖客户程序中使用了如下代码来使用外部xml文件配置log4j环境,注意该代码段位于程序的main class的静态初始化块中,含有以下代码的类和xml配置文件在同一个目录下:
import org.apache.log4j.xml.DOMConfigurator; public class SapFrame extends JFrame { static { DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log4j.xml")); } ... ... ... ... }