日志处理是每一个项目开发中必须的功能,日志是在程序运行时在其他文件中记录的运行信息。
在应用程序中输出日志有三个目的:
1 监视代码中变量的变化情况,把数据周期性地记录到文件中供其他应用进行统计分析工作。
2 跟踪代码运行时轨迹,作为日后审计的依据。
3 担当集成开发环境中的调试器,向文件或控制器打印代码的调试信息。
用户可以自由地选择实现日志接口的第三方软件,比如:Log4J、NoOpLog、SimpleLog等都是通用日志包的实现。
日志文件作用:是一个记录器,用于记录程序运行过程中的各种信息。
日志配置:主要设置记录的级别、存放位置和显示信息的布局。可以使用log4j.properties或log4j.xml格式进行配置。
log4j.properties:
加载log4j.properties步骤:
1:将log4j的jar包放到lib目录下
2:将log4j.properties文件放到src目录下
3:在类中导入类import org.apache.log4j.Logger;
4:在类中定义对象Logger logger = Logger.getLogger(this.getClass());
5:使用logger输出日志logger.info(string);
Apache通用日志包(Log4J,下载地址:http://logging.apache.org/log4j)是Apache的一个开源代码项目,它提供了一组通用的日志接口,通用日志包中的两个常用接口是LogFactory和Log。
通用日志包把日志消息分为六种级别:
FATAL(致命级别)、ERROR(错误级别)、WARN(警告级别)、INFO(一般信息)、DEBUG(调试信息)和TRACE(跟踪信息)。
其中FATAL级别最高,TRACE级别最低,通用日志包采用日志级别机制,可以灵活的控制输出的日志内容。
org.apache.commons.logging.Log接口提供如下方法输出不同级别的日志。
方法名称 |
说明 |
fatal(Object message) |
输出FATAL级别的日志消息 |
error(Object message) |
输出ERROR级别的日志消息 |
warn(Object message) |
输出WARN级别的日志消息 |
info(Object message) |
输出INFo级别的日志消息 |
debug(Object message) |
输出DEBUG级别的日志消息 |
trace(Object message) |
输出TRACE级别的日志消息 |
Log4j允许我们控制日志信息输送的目的地,可以是控制台、文件、GUI组件、UNIX Syslog守护进程等;也允许我们控制每一条日志的输出格式;通过定义每一条日志信息的级别(fatal,error,warn,info,debug),我们能够更加细致地控制日志的生成过程。同时,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
Log4J配置文件内容主要由三大组件构成:
① Logger:负责生成日志,并能根据配置的日志级别来决定什么日志消息应该被输出,比指定级别高的日志信息都能够输出,比如指定日子级别为INFO,那么INFO、WARN、ERROR、FATAL日志都能够输出。
② Appender:定义日志消息输出的目的地,指定日志消息应该被输出到什么地方,可以是控制台、文件或者网络设备。
③ Layout:指定日志消息的输出格式。
Log4J的配置文件有两种格式,一种是xml文件,一种是properties文件。下面采用properties文件的形式进行日志配置。定义配置文件名为log4j.properties,放置在classes目录下。
1 配置Logger组件
配置Logger组件的语法:
格式:
#log4j.rootLogger=日志级别,Appender名称1, Appender名称2,…
说明:
a、级别分别是:fatal > error > warn > info > debug > trace
b、存放位置列表使用逗号进行分隔,分别是存放变量的说明(在下面配置输出目的地时需要引用)
注意:
如果级别是info,则大于等于info的才记录,比info级别低的不记录(其他级别类似)。
#其中日志级别可以是前面定义的六种级别中的一种,Appender名称可以是任何合法的标示符。
#可以是一个,也可以是多个,下面配置的日志级别是INFO,Appender名称分别是A1和R:
代码:log4j.rootLogger=INFO, A1 ,R
2 针对Logger的Appender进行配置,配置日志消息输出目的地Appender,其语法是:
格式:
log4j.appender.存放位置变量 = 存放位置类的完全限定名(一般由log4j组件提供)①
log4j.appender.存放位置变量.属性 = 属性值
说明:
a、log4j提供了几种与存放位置对应的类
1、org.apache.log4j.ConsoleAppender(控制台)
2、org.apache.log4j.FileAppender(文件)
3、org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
4、org.apache.log4j.RollingFileAppender(文件到达一定尺寸时,则产生一个新的文件)
5、org.apache.log4j.WriterAppender(日志流,可以日志消息以流格式发送到任何指定的地方)
b、File属性
可以设置输出的具体文件名
c、Threshold属性
可以设置输出的级别
代码:
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.File=c:/log4j.htm ②
① Log4J提供的Appender类有以下几种:如:上a。
② 将日志输出到C:/log4j.htm文件中
3 配置Layout组件
配置Layout组件的语法:
格式:
log4j.appender.存放位置变量.layout = 布局类的完全限定名(一般由log4j组件提供)①
log4j.appender.存放位置变量.layout.属性 = 属性值
说明:
a、log4j提供了几种与布局对应的类
1、org.apache.log4j.HTMLLayout(以html表格形式布局)
2、org.apache.log4j.PatternLayout(按指定的模式进行布局,通过设置属性可以灵活的指定布局模式)
3、org.apache.log4j.SimpleLayout(简单的布局,包含了级别和信息字符串)
4、org.apache.log4j.TTCCLayout(包含时间、线程、类别等信息的布局)
b、布局中ConversionPattern属性的参数:
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
#例如:
log4j.appender.A1.layout=org.apache.log4j.HTMLLayout
log4j.appender.R.layout.ConversionPattern=%-d{HH:mm:ss} [%c]-[%p] %m%n ②
在Tomcat中,自带通用日志接口包(commons-logging.jar),并且只要在classes目录下存在log4J.properties文件就会自动的加载Log4J的配置信息。通过自带通用日志包引导Log4J进行日志输出。因此不需要配置通用日志接口,通用日志接口配置文件应该放在/WEB-INF/classes目录下,文件名为:commons-logging.properties,配置代码如下:
配置通用日志包的语法:#org.apache.commons.logging.Log=实现类全限定名
例如:
#比如,Log4J的实现类是:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
:在程序中使用Log4J可以通过自身的API,也可以使用通用日志包接口进行访问。
//通用日志包使用
//导入:org.apache.commons.logging.Log
//导入:org.apache.commons.logging.LogFactory
Log log=LogFactory.getLog(this.getClass());
log.debug("debug........");
log.info("info..........");
//Log4J自身API使用
//导入org.apache.log4j.Logger
Logger logger = Logger.getLogger (this.getClass());
logger.debug("debug........");
logger.info("info..........");常用的配置:
配置1:
#配置根:og4j.rootLogger=DEBUG,A1,R
#配置控制台输出:
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
#配置每天一个日志文件:
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=blog_log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
配置2:
log4j.rootLogger=DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true
###################
# 控制台配置
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
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.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[日期]%n%p[级别]%n%x[循环诊断环境]%n%t[线程] n%c[类]%n%m[消息]%n%n
#####################
# 文件配置
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
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.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
########################
# 邮件配置 (需要JavaMail和JAF的支持)
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=iambenbenchen@163.com
log4j.appender.MAIL.SMTPHost=mail.163.com
log4j.appender.MAIL.Subject=Log4J 消息
log4j.appender.MAIL.To=iambenbenchen@163.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# 数据库配置(mysql,注意:每行之后不能有空格,否则报错)
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password= root
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %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
示例代码:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
public class LoginAction{
Log log=LogFactory.getLog(this.getClass());
Logger logger = Logger.getLogger (this.getClass());
public void method(){
log.info(userInfo.getUserInfo().getUserName()+ " log_info开始登陆");
logger.info(userInfo.getUserInfo().getUserName()+ " logger_info开始登陆");
}
}
public class LoginServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
...
Logger logger=Logger.getLogger(this.getClass());
logger.info(name+"开始登录");
...
logger.info(name+"登录失败"+e.getMessage());
...
logger.info(name+"登录成功");
...
}
}
log4j.properties文件:
### direct log messages to stdout ###
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{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
#定义一个名字为file的Appender,它的类型是RollingFileAppender
log4j.appender.file=org.apache.log4j.RollingFileAppender
#设置最大文件尺寸为1MB,当日志文件大小达到1MB时,开始备份到备份文件中
log4j.appender.file.MaxFileSize=1MB
#设置备份文件的最大数目为1024个文件,超过1024将自动删除最旧的文件
log4j.appender.file.MaxBackupIndex=1024
#指定file Appender输出的日志文件的名字和存放路径。
log4j.appender.file.File=D\:/salog4j.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%-5p] %m%n%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=info, file
#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug
### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug
### log just the SQL
#log4j.logger.org.hibernate.SQL=debug
### log JDBC bind parameters ###
#log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=trace
### log schema export/update ###
#log4j.logger.org.hibernate.tool.hbm2ddl=debug
### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug
### log cache activity ###
#log4j.logger.org.hibernate.cache=debug
### log transaction activity
#log4j.logger.org.hibernate.transaction=debug
### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug
### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
log4j.xml配置文件设置
<?xml version='1.0'
encoding='UTF-8'?>
<!DOCTYPE
log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration
xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender
class="org.apache.log4j.DailyRollingFileAppender"
name="rollingFile">
<param name="DatePattern"
value=".yyyy-MM-dd"/>
<param name="File"
value="c:\log\log.log"/>
<param name="Encoding"
value="GBK"/>
<layout
class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d %-5p %-5c{3}:%L %X{client} -> %m%n"/>
</layout>
</appender>
<logger name="com.lovebay">
<level value="DEBUG"/>
</logger>
<logger name="org.hibernate.SQL">
<level value="DEBUG"/>
</logger>
<!--
<logger name="org.springframework">
<level value="DEBUG"/>
</logger>
-->
<root>
<level value="INFO"/>
<appender-ref ref="rollingFile"/>
</root>
</log4j:configuration>
————————————————————————————————————————————————
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE log4j:configuration SYSTEM
"log4j.dtd"> - <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <!-- 类似定义logger节点打印具体类,或某包中的指定级别以上日志 -->
- <logger name="common.TestLog4j">
- <level value="debug" />
- [color=red]<appender-ref ref="console" />[/color]
- </logger>
- <!-- 和logger节点功能差不多,打印具体类,或某包中的指定级别以上日志
- <category name="common.TestLog4j">
- <priority value="warn"/>
- </category>
- -->
- <appender name="console"
class="org.apache.log4j.ConsoleAppender"> - <!--param name="Threshold" value="INFO" 为打印logger 去掉Threshold参数配置 /-->
- <layout
class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern"
- value="【AppLog】 %d{ABSOLUTE} %-5p %m%n" />
- </layout>
- </appender>
- <appender name="file"
- class="org.apache.log4j.DailyRollingFileAppender">
- <param name="File" value="log.txt" />
- <!--日志过滤门槛,记录warn以上级别日志 -->
- <param name="Threshold" value="WARN" />
- <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
- <layout
class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p %m %n" />
- </layout>
- </appender>
- <root>
- <!-- root 整体设置过滤优先级,如果appender 没有设置filter或Threshold 默认采用该级别,定义的logger不在其中(即不会被过滤掉)。 -->
- <priority value="INFO" />
- <appender-ref ref="console" />
- <appender-ref ref="file" />
- </root>
- </log4j:configuration>
————————————————————————————————————————————————
在jboss中hibernate启动时总是会写入一堆日志信息到
D:\jboss-4.0.2\server\default\log\server.log中,导致启动的时候速度比较慢,修改应用程序的log4j.properties的配置也不起作用,后来发现修改log4j.xml的配置可以屏蔽这些输出信息,提高启动速度
2. Log4j.xml配置文件内容具体的配置:
·
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!-- ===================================================================== -->
<!--
-->
<!--
Log4j Configuration -->
<!--
-->
<!-- ===================================================================== -->
<!-- $Id: log4j.xml,v 1.26.2.2 2005/03/02 14:52:20 tdiesler Exp $ -->
<!--
| For more configuration infromation and examples see the Jakarta Log4j
| owebsite: http://jakarta.apache.org/log4j
-->
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
<!-- ================================= -->
<!-- Preserve messages in a local file -->
<!-- ================================= -->
<!-- A time/date based rolling appender -->
<appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="File" value="${jboss.server.home.dir}/log/server.log"/>
<param name="Append" value="false"/>
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<!-- Rollover at the top of each hour
<param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>
-->
<!—默认没有这两行,加上可以屏蔽输出调试信息到server.log中,提高启动速度-->
<param name="Target" value="/System.out"/>
<param name="Threshold" value="ERROR"/>
<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>
<!-- A size based file rolling appender
<appender name="FILE" class="org.jboss.logging.appender.RollingFileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="File" value="/${jboss.server.home.dir}/log/server.log"/>
<param name="Append" value="false"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="1"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
</layout>
</appender>
-->
<!-- ============================== -->
<!-- Append messages to the console -->
<!-- ============================== -->
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<!—配置是否输出各种级别的信息到控制台à
<param name="Target" value="/System.out"/>
<param name="Threshold" value="ERROR"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
……