| 小洛 的个人资料Paul's照片日志列表 | 帮助 |
|
|
2005/12/25 在hibernatet3.0中使用tomcat的连接池现在tomcat中配置好连接池,jndi的名字例如为jdbc/mysql
更改hibernate.cfg.xml文件
<session-factory>
<property name="show_sql">true</property> <property name="connection.datasource">java:comp/env/jdbc/mysql</property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <mapping resource="net/cboy/orm/Menu.hbm.xml"></mapping> ....
</session-factory> MyEclipse的图形配置工具好像有点点问题,会把url那些不需要的tag都加上 2005/12/24 总算解决了TOMCAT配置DBCP连接池出错的该死问题了打算看看tomcat的connection pool的,查了一下how to,发现怎么配置都是出现org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'的错误提示,郁闷死~
上网找一下,各种解决方法都有,千奇百怪,连bug论都有,搞了好几个小时,也没有找到答案,实在让人很郁闷,找来找去,发现总是有问题,于是把how to继续拿过来看,突然发现漏掉一行没看
Add this in between the </Context> tag of the examples context and the </Host> tag closing the localhost definition.
靠~差点去跳楼~原来是XML写错了位置了,该死的server.xml也不报错~昏倒~
于是调整了一下xml,把Context放在了Service下面的Engine下面的Host下……顺利完成。
唉,这事……怨谁呢~~~ 2005/1/27 花了整整一个晚上安装调试hibernate前两天就开始测试了,在自己的C600的笔记本上安装了Eclipse3.0和MyEclipse的插件,竟然也可以勉强跑起来,真神奇~ 数据库和TOMCAT就没敢安装了,否则恐怕系统马上就在崩溃边缘了吧。 于是很努力的在室友的机器上安装了Mysql和TOMCAT,东西不大,可惜我本本太小了,勉强远程调试开发吧。 晚上洗澡后已经8点多了,开始写Hibernate的配置档,写junit的测试,写servlet下的测试~ OK,虽然遇到一些问题,但是都可以最后通过。 不知不觉已经1点多了,已经连续一个星期这么晚才睡觉了。已经变熊猫了。 Hibernate还是有一些不懂的地方,当然~是目前用到的地方,否则不懂得多着呢~ 不知道session关闭后使用Iterator怎么会报lazy的错误,自己分析应该是VO和PO的问题。可是没有时间仔细再去看了。明天晚上再研究了。 这两天找hibernate的资料,有个牛人说已经把hibernate source code看完了,我考~那不是等于看了一部寻秦记的小说,只是把里面的文字都替换成了代码?嗯,算算~~没日没夜看,也要看3天吧~加上理解~乘上10倍,作每天12小时计算,再乘2倍……这个人应该不是头脑有病就是吹牛~ 2004/12/30 Log4j基本使用方法(这个其实是Apache的开源项目)Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。 3.1.定义配置文件 其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。 Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面我们介绍使用Java特性文件做为配置文件的方法: 配置根Logger,其语法为: log4j.rootLogger = [ level ] , appenderName, appenderName, … 配置日志信息输出目的地Appender,其语法为 log4j.appender.appenderName = fully.qualified.name.of.appender.class 配置日志信息的格式(布局),其语法为: log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 2.在代码中使用Log4j 下面将讲述在程序代码中怎样使用Log4j。 3.2.1.得到记录器 使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ; 当获得了日志记录器之后,第二步将配置Log4j环境,其语法为: 3.2.3.插入记录信息(格式化日志信息) 当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下: Logger.debug ( Object message ) ; 2004/12/15 Log4j 日志管理http://www.csdn.net futurelight(原作) 关键字 Log4j 日志管理 Log4j有三个主要的组件:Loggers,Appenders和Layouts,这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明: 1、 Loggers Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发生了一个级别Q比P高,则可以启动,否则屏蔽掉。 Java程序举例来说: //建立Logger的一个实例,命名为“com.foo” Logger logger = Logger.getLogger("com.foo"); //设置logger的级别。通常不在程序中设置logger的级别。一般在配置文件中设置。 logger.setLevel(Level.INFO); Logger barlogger = Logger.getLogger("com.foo.Bar"); //下面这个请求可用,因为WARN >= INFO logger.warn("Low fuel level."); //下面这个请求不可用,因为DEBUG < INFO logger.debug("Starting search for nearest gas station."); //命名为“com.foo.bar”的实例barlogger会继承实例“com.foo”的级别。因此,下面这个请求可用,因为INFO >= INFO barlogger.info("Located nearest gas station."); //下面这个请求不可用,因为DEBUG < INFO barlogger.debug("Exiting gas station search"); 这里“是否可用”的意思是能否输出Logger信息。 在对Logger实例进行命名时,没有限制,可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例,这是目前来讲比较有效的Logger命名方式。这样可以使得每个类建立自己的日志信息,便于管理。比如: static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName()); 2、 Appenders 禁用与使用日志请求只是Log4j其中的一个小小的地方,Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。 其语法表示为: org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 配置时使用方式为: log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.option = valueN 这样就为日志的输出提供了相当大的便利。 3、 Layouts 有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。 其语法表示为: org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 配置时使用方式为: log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.option = valueN 以上是从原理方面说明Log4j的使用方法,在具体Java编程使用Log4j可以参照以下示例: 1、 建立Logger实例: 语法表示:public static Logger getLogger( String name) 实际使用:static Logger logger = Logger.getLogger (ServerWithLog4j.class.getName ()) ; 2、 读取配置文件: 获得了Logger的实例之后,接下来将配置Log4j使用环境: 语法表示: BasicConfigurator.configure():自动快速地使用缺省Log4j环境。 PropertyConfigurator.configure(String configFilename):读取使用Java的特性文件编写的配置文件。 DOMConfigurator.configure(String filename):读取XML形式的配置文件。 实际使用:PropertyConfigurator.configure("ServerWithLog4j.properties"); 3、 插入日志信息 完成了以上连个步骤以后,下面就可以按日志的不同级别插入到你要记录日志的任何地方了。 语法表示: Logger.debug(Object message); Logger.info(Object message); Logger.warn(Object message); Logger.error(Object message); 实际使用:logger.info("ServerSocket before accept: " + server); 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用,具体如下: 1、 配置根Logger,其语法为: log4j.rootLogger = [ level ] , appenderName, appenderName, … 这里level指Logger的优先级,appenderName是日志信息的输出地,可以同时指定多个输出地。如:log4j.rootLogger= INFO,A1,A2 2、 配置日志信息输出目的地,其语法为: log4j.appender.appenderName = fully.qualified.name.of.appender.class 可以指定上面所述五个目的地中的一个。 3、 配置日志信息的格式,其语法为: log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 这里上面三个步骤是对前面Log4j组件说明的一个简化;下面给出一个具体配置例子,在程序中可以参照执行: log4j.rootLogger=INFO,A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern= %-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n 这里需要说明的就是日志信息格式中几个符号所代表的含义: -X号: X信息输出时左对齐; %p: 日志信息级别 %d{}: 日志信息产生时间 %c: 日志信息所在地(类名) %m: 产生的日志具体信息 %n: 输出日志信息换行 根据上面的日志格式,某一个程序的输出结果如下: 0 INFO 2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014] 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: ’Java server with log4j, Fri Jun 13 13:23:46 CST 2003’ 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: ’Command ’HELLO’ not understood.’ 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: ’Vocabulary: HELP QUIT’ 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT Log4J使用常识Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数见表1如下: %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) 基本应用 Log4J的配置 现在来看log4j.properties配置文件的意义。第一行指定了根Logger的级别是DEBUG,并将此指定输出到A1。A1就是第 二行定义的org.apache.log4j.ConsoleAppender,此行表示将A1输出到控制台。第三行规定了输出到A1的格式为 org.apache.log4j.PatternLayout。第四行规定了输出到A1格式的转换模式为 org.javaresearch.log4j.TestLog4J。 很多成熟的服务器类的软件日志信息会输出到控制台,同时输出到日志文件备查。使用Log4J可以在不改变任何代码的情况下,仅通过修改配置文件就可以轻松地完成这项功能。相关配置文件如下: #### Use two appenders, one to log to console, another to log to a file log4j.rootCategory=debug, stdout, R # Print only messages of priority WARN or higher for your category log4j.category.your.category.name=WARN #### First appender writes to console log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n #### Second appender writes to a file log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log # Control the maximum log file size log4j.appender.R.MaxFileSize=100KB # Archive log files (one backup file here) log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n 这个配置文件指定了两个输出源stdout和R。前者把日志信息输出到控制台,后者是一个轮转日志文件。最大的文件是100KB,当一个日志文 件达到最大尺寸时,Log4J会自动把example.log重命名为example.log.1,然后重建一个新的example.log文件,依次轮 转。 在Web应用中使用 在Web应用中,应该在哪儿对Log4J进行配置呢?首先要明确,Log4J必须在应用的其它代码执行前完成初始化。因为Servlet是在 Web服务器启动时立即装入的,所以,在Web应用中一般使用一个专门的Servlet来完成Log4J的配置,并保证在web.xml的配置中,这个 Servlet位于其它Servlet之前。下面是一个例子,代码如下: package org.javaresearch.log4j; import java.io.*; import javax.servlet.*; import org.apache.log4j.*; public class Log4JInit extends HttpServlet { public void init() throws ServletException { String prefix = getServletContext().getRealPath("/"); String file = getServletConfig().getInitParameter("log4j-config-file"); // 从Servlet参数读取log4j的配置文件 if (file != null) { PropertyConfigurator.configure(prefix + file); } } public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {} public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {} } <servlet> <servlet-name>log4jinit</servlet-name> <servlet-class>org.javaresearch. log4j.Log4JInit</servlet-class> <init-param> <param-name> log4j-config-file </param-name> <param-value>/properties/log4j.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> 注意:上面的load-on-startup应设为1,以便在Web容器启动时即装入该Servlet。log4j.properties文件放在根的properties子目录中,也可以把它放在其它目录中。应该把.properties文件集中存放,这样方便管理。 Log4j 学习笔记Log4j的类图 |
|
|