一.System.out.println的局限性
1.不能在运行时打开或者关闭 2.不能选择包或者类,在运行的时候打开或者关闭 3.输出的信息没有分级 4.只能输出文本信息 5.不能改变输出的位置,只能输出在控制台上. 二.log4j 基础1.官方网址:
2.log4j的两种配置文件由下面的两个类解析 解析log4j.properties : PropertyConfigurator.configure( filePath ); 解析log4j.xml : DOMConfigurator.configure( filePath );3.如何得到logger
(1). Logger.getLogger( Test.class ); (2). Logger.getLogger("sql"); -- 得到配置文件中设置的sql logger 三.例子1.一个简单的使用log4j的例子
import org.apache.log4j.*; public class HelloLog4j{ private static Logger logger = Logger.getLogger(HelloLog4j.class); public static void main(String[] args){ StringBuffer sb = new StringBuffer(); // 记录debug级别的信息 logger.debug(sb); // 记录info级别的信息 logger.info(sb); // 记录warn级别的信息 logger.warn(sb); // 记录error级别的信息 logger.error(sb); // 记录fatal级别的信息 logger.fatal(sb); } } 注: 运行这个例子时,需要log4j.properties 或 log4j.xml -- 放在src目录下.2.log4j.properties配置文件
log4j.rootLogger=DEBUG,CONSOLE #rootLogger: 定义的是默认的logger,如果想自己定义到哪个包下的类的日志,可用log4j.logger.com.gdin... #DEBUG: 定义的日志级别是DEBUG,小于DEBUG级别的日志则不会输出 #CONSOLE: 定义一个Appender, 该appender的具体信息如下# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=INFO log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.Encoding=GBK #log4j.appender.CONSOLE.layout=org.apache.log4j.TTCCLayout log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #layout: 定义一个输出样式,有些不用定义它的样式,如TTCCLayout; 有些则需要,如PatternLayout
四.log4j核心
1.Logger -- Logger完成日志信息的处理
注: Logger可以定义输出的层次和决定信息是否输出 Logger输出的信息有优先级别的: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 注: 定义了哪一个层次,则小于该层次的日志不会输出. 2.Appender -- Appender设置日志信息的去向 Appender就是设置日志信息输出到中地方,可以同是指定多个输出目的地. 常用的有以下几个: org.apache.log4j.ConsoleAppender (控制台) org.apache.log4j.FileAppender (文件) org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件) org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件) org.apache.log4j.WriterAppender (将日志信息以串流格式发送到任意指定的地方) org.apache.log4j.JdbcAppender (将日志信息保存到数据库中) 3.Layout -- Layout设置日志信息的输出样式 org.apache.log4j.HTMLLayout (以HTML表格形式布局) org.apache.log4j.SimpleLayout (包含日志信息的级别和讯息字符串) org.apache.log4j..TTCCLayout (包含日志产生的时间,执行者,类别等信息) org.apache.log4j.PatternLayout (可以灵活地指定布局模式) 样式: %p : 输出优先级, 即 DEBUB, INFO, WARN 等 priority %r : 输出自应用启动到输出该日志信息所耗费的毫秒数 runtime %t : 输出产生该日志事件的线程名 thread %f : 输出日志信息所属的类别的类别名 %c : 输出日志信息所属的类的全名 classname %d : 输出日志时间点的日期或时间,指定格式的方式: %d{yyyy-MM-dd HH:mm:ss} datetime %l : 输出日志事件的发生位置,即输出日志信息的语句排在它所在的类的第几行 line %m : 输出代码中指定的信息,如log(message)中的message message %n : 输出一个换行符号 (这个一般都要使用,使每个日志信息为一行) newline 4.配置文件 log4j.properties log4j.xml (1)log4j.properties配置 log4j.rootLogger = DEBUG, appender1 log4j.appender.appender1 = org.apache.log4j.ConsoleAppender log4j.appender.appender1.layout = org.apache.log4j.SimpleLayout (2)RootLogger log4j.rootLogger = [lever], appenderName1, appenderName2, ... 如果上面的设定将输出等级设为INFO,就表示INFO~FATAL等级的信息将会输出,DEBUG等级的信息就会被忽略 (3)为某个包设定 日志配置 log4j.logger.com.gdin = info, appender1 log4j.logger.com.v512 = debug, appender1, appender2 (4)设置一个名称的logger log4j.logger.myname = debug, appender3 (5)如果只定义了log4j.logger.com.gdin = info,即定义了它的级别,没有定义它的appender.那么它会使用rootLogger中定义的appender. (6).log4j的命名机制 log4j中定义的命名机制是一棵树的形式,根就是rootLogger名称节点. 如:Logger.getLogger("com.gdin.uc.TestA"),它会先到配置文档中找名称是com.gdin.uc.TestA的, 即定义为log4j.logger.com.gdin.uc.TestA的.如果找不到,则找com.gdin.uc的.再找不到就找com.gdin的.再找不到就找com的.再找不到就找rootLogger. 即是说,这棵树就像是java中的包定义一样,所以可以为不再包下的java源文件定义不同的日志机制. 五.关于性能影响 1. log4j对程序的运行的性能影响非常小 2. 还可以通过下面的方式,降低性能影响: if(logger.isDebugEnabled()){ logger.debug( "x=" + longTimeRunning() ); } 六.培训 或 视频 1.java软件工程师培训 2.免费视频下载 3.论坛答疑******************************log4j.properties 完整版***********************************
一.log4j.properties 完整版
转载自: log4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILE log4j.addivity.org.apache=true# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=INFO log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.Encoding=GBK log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n# 用于数据库
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:oracle:thin:@192.168.0.103:1521:ORCL log4j.appender.DATABASE.driver=oracle.jdbc.driver.OracleDriver log4j.appender.DATABASE.user=Nation log4j.appender.DATABASE.password=1 log4j.appender.CONSOLE.Threshold=WARN log4j.appender.DATABASE.sql=INSERT INTO LOG4J(stamp,thread, infolevel,class,messages) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m') # INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') # 写入数据库中的表LOG4J的Message字段中,内容%d(日期)%c: 日志信息所在地(类名)%p: 日志信息级别%m: 产生的日志具体信息 %n: 输出日志信息换行 log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n# 每天新建日志
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=C:/log4j/log log4j.appender.A1.Encoding=GBK log4j.appender.A1.Threshold=DEBUG log4j.appender.A1.DatePattern='.'yyyy-MM-dd log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n#应用于文件
log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=C:/log4j/file.log log4j.appender.FILE.Append=false log4j.appender.FILE.Encoding=GBK log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n# 应用于文件回滚
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.CONSOLE_FILE.Encoding=GBK log4j.appender.ROLLING_FILE.MaxFileSize=10KB log4j.appender.ROLLING_FILE.MaxBackupIndex=1 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n#自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender log4j.appender.im.host = mail.cybercorlin.net log4j.appender.im.username = username log4j.appender.im.password = password log4j.appender.im.recipient = yyflyons@163.com log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n#应用于socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t [THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n # Log Factor 5 Appender log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000# 发送日志给邮件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From=yyflyons@163.com log4j.appender.MAIL.SMTPHost=www.wusetu.com log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=yyflyons@126.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
******************************log4j.xml配置**********************************
一.log4j.xml
转载自:
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="> <!--输出方式是:每天一个日志文件--> <!--设置通道名称是:file,输出方式DailyRollingFileAppender--> <appender name="myFile" class="org.apache.log4j.DailyRollingFileAppender"><!--日志文件路径和文件名称 -->
<!--加../在logs,加/在C盘,不加在bin目录 --> <!--如果在加载时设置了变量System.setProperty("WebApp", appRoot),可在此取出来${WebApp} --> <param name="File" value="../logs/mylog.log"/> <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 --> <param name="Append" value="true"/> <!-- Rollover at midnight each day --> <!-- e.g. mylog.log.2009-11-25.log --> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/><!-- Rollover at the top of each hour
<param name="DatePattern" value="'.'yyyy-MM-dd-HH'.log'"/> --><layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n --> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n --> <!-- <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/> --> </layout> </appender> <appender name="ERROR_LOG" class="org.apache.log4j.DailyRollingFileAppender"> <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/> <param name="File" value="error.log"/> <param name="Append" value="true"/> <!-- 指定日志输出级别 --> <param name="Threshold" value="INFO"/> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> </layout> </appender> <!-- level:是日记记录的优先级,优先级由高到低分为 OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。 Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这四个级别。--><!-- 指定logger的设置,additivity指示是否叠加输出log,如果是false,
在DsErrorLog logger中日志不会被其它logger满足条件的logger(比如root)输出 --> <!-- 将名称为DSErrorLog的logger,输出到“EEROR_LOG”的appender 所谓logger的名字也就是,在定义Logger时,构造函数的参数 Logger log = Logger.getLogger("DSErrorLog"); --> <logger name="DSErrorLog" additivity="false"> <level class="org.apache.log4j.Level" value="DEBUG"/> <appender-ref ref="ERROR_LOG"/> </logger> <!--输出指定类包中的日志,比如想输出 Hibernate运行中生成的SQL语句,可作如下设置 --> <category name="org.hibernate.SQL"> <priority value="DEBUG"/> <!-- 如果指定一个appender,这些log将被输出到指定的appender 如:<appender-ref ref="myFile"/>否则将作用于所有的appender --> </category> <!--根默认会自动构建一个 root,输出INFO级别的日志到控制台,供logger继承 --> <root> <priority value ="DEBUG"/> <appender-ref ref="myConsole"/> <appender-ref ref="myFile"/> </root> </log4j:configuration>****************************************一个比较有用的log4j应用 ***************************************8
一.log4j.xml配置实现
转载自:
1.先写一个Servlet的listener,用来监听服务启动,并自动解析log4j.xml文件
代码如下:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;import org.apache.log4j.LogManager;
import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.xml.DOMConfigurator;public class Log4jConfigListener implements ServletContextListener{
public static final String CONFIG_LOCATION_PARAM = "log4jConfigLocation"; public static final String XML_FILE_EXTENSION = ".xml";public void contextDestroyed(ServletContextEvent event) {
LogManager.shutdown(); }public void contextInitialized(ServletContextEvent event) {
String location = event.getServletContext().getInitParameter(CONFIG_LOCATION_PARAM); if (location != null) { if (!location.startsWith("/")) { location = "/" + location; } location = event.getServletContext().getRealPath(location);//如果是xml结尾就用DOM解析,否则就用properties解析
if (location.toLowerCase().endsWith(XML_FILE_EXTENSION)) { DOMConfigurator.configure(location); }else { PropertyConfigurator.configure(location); } } } }2.再写个util类,用来生成所要的不同类型的日志
代码如下:
package com.zhaopin.util;
import org.apache.log4j.Logger;
public class Log4jUtil {
public static Logger getSQLLogger(){ return Logger.getLogger("sql"); } public static Logger getBusinessLogger(){ return Logger.getLogger("business"); } public static Logger getSimpleErrorLogger(){ return Logger.getLogger("simpleError"); } public static Logger getNormalErrorLogger(){ return Logger.getLogger("normalError"); }}
3.下面开始写配置文件,先要在web.xml下添加信息:
<context-param>
<param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/Log4j.xml</param-value> </context-param> <!-- 加载log4j配置文件 --> <listener> <listener-class>Log4jConfigListener</listener-class> </listener>
4.最重要的log4j.xml的配置信息如下:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="> <!-- 控制台输出 --> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] (%C:%L) - %m%n"/> </layout> </appender><!-- SQL类日志 -->
<appender name="sql" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="/usr/local/tomcat/logs/testlog4j.sql.log"/> <param name="Append" value="true"/> <!-- name="DatePattern", 配置这条信息是让日志每天自动生成,名字尾部追加日期格式, 第一天生成的日志需第二天才能看到log可以通过更改系统时间来看日志的输出 --> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] (%C:%L) - %m%n"/> </layout> </appender> <!-- 业务类日志 --> <appender name="business" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="/usr/local/tomcat/logs/testlog4j.business.log"/> <param name="Append" value="true"/> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] (%C:%L) - %m%n"/> </layout> </appender> <!-- 不带执行轨迹错误日志 --> <appender name="simpleError" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="/usr/local/tomcat/logs/testlog4j.error.simple.log"/> <param name="Append" value="true"/> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] (%C:%L) - %m%n"/> </layout> </appender> <!-- 带执行轨迹错误日志 --> <appender name="normalError" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="/usr/local/tomcat/logs/testlog4j.error.normal.log"/> <param name="Append" value="true"/> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] (%C:%L) - %m%n"/> </layout> </appender> <!-- 下面定义logger --> <logger name="sql" additivity="true"> <priority value="info"/> <appender-ref ref="sql"/> </logger> <logger name="business" additivity="true"> <priority value="info"/> <appender-ref ref="simpleError"/> </logger> <logger name="simpleError" additivity="true"> <priority value="info"/> <appender-ref ref="simpleError"/> </logger> <logger name="normalError" additivity="true"> <priority value="info"/> <appender-ref ref="normalError"/> </logger> <root> <appender-ref ref="STDOUT"/> <priority value="info"/> </root> </log4j:configuration>5.在程序中应用时需要编写如下代码:
Log4jUtil.getBusinessLogger().info("message!");