1. 配置文件
Log4J配置文件的基本格式如下:
#配置根Logger
log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …
#配置日志信息輸出目的地Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
#配置日志信息的格式(布局)
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
其中 [level] 是日志輸出級(jí)別,共有5級(jí):
FATAL 0
ERROR 3
WARN 4
INFO 6
DEBUG 7
Appender 為日志輸出目的地,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制臺(tái)),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件),
org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
Layout:日志輸出格式,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
打印參數(shù): Log4J采用類似C語言中的printf函數(shù)的打印格式格式化日志信息,如下:
%m 輸出代碼中指定的消息
%p 輸出優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
%r 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產(chǎn)生該日志事件的線程名
%n 輸出一個(gè)回車換行符,Windows平臺(tái)為“\r\n”,Unix平臺(tái)為“\n”
%d 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},輸出類似:2002年10月18日 22 : 10 : 28 , 921
%l 輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java: 10 )
2. 在代碼中初始化Logger:
1)在程序中調(diào)用BasicConfigurator.configure()方法:給根記錄器增加一個(gè)ConsoleAppender,輸出格式通過PatternLayout設(shè)為"%-4r [%t] %-5p %c %x - %m%n",還有根記錄器的默認(rèn)級(jí)別是Level.DEBUG.
2)配置放在文件里,通過命令行參數(shù)傳遞文件名字,通過PropertyConfigurator.configure(args[x])解析并配置;
3)配置放在文件里,通過環(huán)境變量傳遞文件名等信息,利用log4j默認(rèn)的初始化過程解析并配置;
4)配置放在文件里,通過應(yīng)用服務(wù)器配置傳遞文件名等信息,利用一個(gè)特殊的servlet來完成配置。
3. 為不同的 Appender 設(shè)置日志輸出級(jí)別:
當(dāng)調(diào)試系統(tǒng)時(shí),我們往往注意的只是異常級(jí)別的日志輸出,但是通常所有級(jí)別的輸出都是放在一個(gè)文件里的,如果日志輸出的級(jí)別是BUG!?那就慢慢去找吧。
這時(shí)我們也許會(huì)想要是能把異常信息單獨(dú)輸出到一個(gè)文件里該多好啊。當(dāng)然可以,Log4j已經(jīng)提供了這樣的功能,我們只需要在配置中修改Appender的Threshold 就能實(shí)現(xiàn),比如下面的例子:
[配置文件]
### set log levels ###
log4j.rootLogger = debug , stdout , D , E
### 輸出到控制臺(tái) ###
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
### 輸出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 輸出DEBUG級(jí)別以上的日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 保存異常信息到單獨(dú)文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/error.log ## 異常日志文件名
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR ## 只輸出ERROR級(jí)別以上的日志!!!
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
[代碼中使用]
public class TestLog4j {
public static void main(String[] args) {
PropertyConfigurator.configure( " D:/Code/conf/log4j.properties " );
Logger logger = Logger.getLogger(TestLog4j. class );
logger.debug( " debug " );
logger.error( " error " );
}
}
運(yùn)行一下,看看異常信息是不是保存在了一個(gè)單獨(dú)的文件error.log中
log4j.properties 使用
一.參數(shù)意義說明
輸出級(jí)別的種類
ERROR、WARN、INFO、DEBUG
ERROR 為嚴(yán)重錯(cuò)誤 主要是程序的錯(cuò)誤
WARN 為一般警告,比如session丟失
INFO 為一般要顯示的信息,比如登錄登出
DEBUG 為程序的調(diào)試信息
配置日志信息輸出目的地
log4j.appender.appenderName = fully.qualified.name.of.appender.class
1.org.apache.log4j.ConsoleAppender(控制臺(tái))
2.org.apache.log4j.FileAppender(文件)
3.org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件)
4.org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件)
5.org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
配置日志信息的格式
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
2.org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
3.org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
控制臺(tái)選項(xiàng)
Threshold=DEBUG:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
Target=System.err:默認(rèn)情況下是:System.out,指定輸出控制臺(tái)
FileAppender 選項(xiàng)
Threshold=DEBUF:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
RollingFileAppender 選項(xiàng)
Threshold=DEBUG:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
MaxFileSize=100KB: 后綴可以是KB, MB 或者是 GB. 在日志文件到達(dá)該大小時(shí),將會(huì)自動(dòng)滾動(dòng),即將原來的內(nèi)容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以產(chǎn)生的滾動(dòng)文件的最大數(shù)。
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
日志信息格式中幾個(gè)符號(hào)所代表的含義:
-X號(hào): X信息輸出時(shí)左對(duì)齊;
%p: 輸出日志信息優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL,
%d: 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%r: 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
%c: 輸出日志信息所屬的類目,通常就是所在類的全名
%t: 輸出產(chǎn)生該日志事件的線程名
%l: 輸出日志事件的發(fā)生位置,相當(dāng)于%C.%M(%F:%L)的組合,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main (TestLog4.java:10)
%x: 輸出和當(dāng)前線程相關(guān)聯(lián)的NDC(嵌套診斷環(huán)境),尤其用到像java servlets這樣的多客戶多線程的應(yīng)用中。
%%: 輸出一個(gè)"%"字符
%F: 輸出日志消息產(chǎn)生時(shí)所在的文件名稱
%L: 輸出代碼中的行號(hào)
%m: 輸出代碼中指定的消息,產(chǎn)生的日志具體信息
%n: 輸出一個(gè)回車換行符,Windows平臺(tái)為"\r\n",Unix平臺(tái)為"\n"輸出日志信息換行
可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對(duì)齊方式。如:
1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,默認(rèn)的情況下右對(duì)齊。
2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,"-"號(hào)指定左對(duì)齊。
3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會(huì)將左邊多出的字符截掉,但小于30的話也不會(huì)有空格。
4)%20.30c:如果category的名稱小于20就補(bǔ)空格,并且右對(duì)齊,如果其名稱長(zhǎng)于30字符,就從左邊較遠(yuǎn)輸出的字符截掉。
二.文件配置Sample1
log4j.rootLogger=DEBUG,A1,R
#log4j.rootLogger=INFO,A1,R
# ConsoleAppender 輸出
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
# File 輸出 一天一個(gè)文件,輸出路徑可以定制,一般在根路徑下
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
文件配置Sample2
下面給出的Log4J配置文件實(shí)現(xiàn)了輸出到控制臺(tái),文件,回滾文件,發(fā)送日志郵件,輸出到數(shù)據(jù)庫(kù)日志表,自定義標(biāo)簽等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,A1,im
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true
###################
# Console Appender
###################
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}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#####################
# File Appender
#####################
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
# Use this layout for LogFactor 5 analysis
########################
# Rolling File
########################
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
####################
# Socket Appender
####################
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
########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@yeqiangwei.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# JDBC Appender
#######################
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=
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
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
###################
#自定義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 = corlin@yeqiangwei.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
三.高級(jí)使用
實(shí)驗(yàn)?zāi)康模?br />
1.把FATAL級(jí)錯(cuò)誤寫入2000NT日志
2. WARN,ERROR,F(xiàn)ATAL級(jí)錯(cuò)誤發(fā)送email通知管理員
3.其他級(jí)別的錯(cuò)誤直接在后臺(tái)輸出
實(shí)驗(yàn)步驟:
輸出到2000NT日志
1.把Log4j壓縮包里的NTEventLogAppender.dll拷到WINNT\SYSTEM32目錄下
2.寫配置文件log4j.properties
# 在2000系統(tǒng)日志輸出
log4j.logger.NTlog=FATAL, A8
# APPENDER A8
log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.A8.Source=JavaTest
log4j.appender.A8.layout=org.apache.log4j.PatternLayout
log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
3.調(diào)用代碼:
Logger logger2 = Logger.getLogger("NTlog"); //要和配置文件中設(shè)置的名字相同
logger2.debug("debug!!!");
logger2.info("info!!!");
logger2.warn("warn!!!");
logger2.error("error!!!");
//只有這個(gè)錯(cuò)誤才會(huì)寫入2000日志
logger2.fatal("fatal!!!");
發(fā)送email通知管理員:
1. 首先下載JavaMail和JAF,
http://java.sun.com/j2ee/ja/javamail/index.html
http://java.sun.com/beans/glasgow/jaf.html
在項(xiàng)目中引用mail.jar和activation.jar。
2. 寫配置文件
# 將日志發(fā)送到email
log4j.logger.MailLog=WARN,A5
# APPENDER A5
log4j.appender.A5=org.apache.log4j.net.SMTPAppender
log4j.appender.A5.BufferSize=5
log4j.appender.A5.To=chunjie@yeqiangwei.com
log4j.appender.A5.From=error@yeqiangwei.com
log4j.appender.A5.Subject=ErrorLog
log4j.appender.A5.SMTPHost=smtp.263.net
log4j.appender.A5.layout=org.apache.log4j.PatternLayout
log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
3.調(diào)用代碼:
//把日志發(fā)送到mail
Logger logger3 = Logger.getLogger("MailLog");
logger3.warn("warn!!!");
logger3.error("error!!!");
logger3.fatal("fatal!!!");
在后臺(tái)輸出所有類別的錯(cuò)誤:
1. 寫配置文件
# 在后臺(tái)輸出
log4j.logger.console=DEBUG, A1
# APPENDER A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
2.調(diào)用代碼
Logger logger1 = Logger.getLogger("console");
logger1.debug("debug!!!");
logger1.info("info!!!");
logger1.warn("warn!!!");
logger1.error("error!!!");
logger1.fatal("fatal!!!");
--------------------------------------------------------------------
全部配置文件:log4j.properties
# 在后臺(tái)輸出
log4j.logger.console=DEBUG, A1
# APPENDER A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
# 在2000系統(tǒng)日志輸出
log4j.logger.NTlog=FATAL, A8
# APPENDER A8
log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.A8.Source=JavaTest
log4j.appender.A8.layout=org.apache.log4j.PatternLayout
log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
# 將日志發(fā)送到email
log4j.logger.MailLog=WARN,A5
# APPENDER A5
log4j.appender.A5=org.apache.log4j.net.SMTPAppender
log4j.appender.A5.BufferSize=5
log4j.appender.A5.To=chunjie@yeqiangwei.com
log4j.appender.A5.From=error@yeqiangwei.com
log4j.appender.A5.Subject=ErrorLog
log4j.appender.A5.SMTPHost=smtp.263.net
log4j.appender.A5.layout=org.apache.log4j.PatternLayout
log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
全部代碼:Log4jTest.java
/*
* 創(chuàng)建日期 2003-11-13
*/
package edu.bcu.Bean;
import org.apache.log4j.*;
//import org.apache.log4j.nt.*;
//import org.apache.log4j.net.*;
/**
* @author yanxu
*/
public class Log4jTest
{
public static void main(String args[])
{
PropertyConfigurator.configure("log4j.properties");
//在后臺(tái)輸出
Logger logger1 = Logger.getLogger("console");
logger1.debug("debug!!!");
logger1.info("info!!!");
logger1.warn("warn!!!");
logger1.error("error!!!");
logger1.fatal("fatal!!!");
//在NT系統(tǒng)日志輸出
Logger logger2 = Logger.getLogger("NTlog");
//NTEventLogAppender nla = new NTEventLogAppender();
logger2.debug("debug!!!");
logger2.info("info!!!");
logger2.warn("warn!!!");
logger2.error("error!!!");
//只有這個(gè)錯(cuò)誤才會(huì)寫入2000日志
logger2.fatal("fatal!!!");
//把日志發(fā)送到mail
Logger logger3 = Logger.getLogger("MailLog");
//SMTPAppender sa = new SMTPAppender();
logger3.warn("warn!!!");
logger3.error("error!!!");
logger3.fatal("fatal!!!");
}
}
本文出處:http://blog.csdn.net/azheng270/archive/2008/03/12/2173430.aspx
EXCEL模板加載出錯(cuò)的問題:
可能是因?yàn)槟0逯心承└袷酱嬖趩栴},或者模板中存在EXCEL的某些高級(jí)功能,【POI】無法加載導(dǎo)致出錯(cuò)。
解決辦法:自己一步步從最簡(jiǎn)單的excel文件開始,繪制模板。
$CATALINA_HOME指的是Tomcat根目錄。
$CATALINA_HOME\webapps下,然后啟動(dòng)服務(wù)器就可以了。這種方式比較簡(jiǎn)單,訪問地址如下:http://localhost:8080/PetWeb/
2、這種方式可以不必將PetWeb目錄拷貝到webapps下,直接在F:\部署。方法如下,更改$CATALINA_HOME\conf\server.xml文件,在<host>標(biāo)簽內(nèi)添加<Context>標(biāo)簽,內(nèi)容如下:
<Context docBase="F:/PetWeb" reloadable="false" path="/Pet"/>
其
中reloadable="false"表示當(dāng)應(yīng)用程序中的內(nèi)容發(fā)生更改之后服務(wù)器不會(huì)自動(dòng)加載,這個(gè)屬性在開發(fā)階段通常都設(shè)為true,方便開發(fā),在發(fā)
布階段應(yīng)該設(shè)置為false,提高應(yīng)用程序的訪問速度。docBase為路徑,可以使用絕對(duì)路徑,也可以使用相對(duì)路徑,相對(duì)路徑相對(duì)于webapps。
path屬性的值是訪問時(shí)的根地址。訪問地址如下:http://localhost:8080/Pet/
3、這種方式和第二種方式差不多,但是不是在Server.xml文件中添加Context標(biāo)簽,而是在$CATALINA_HOME
\conf\Catalina\localhost中添加一個(gè)xml文件,如Pet.xml,內(nèi)容如下:
<Context docBase="F:/PetWeb" reloadable="false" />大家可能發(fā)現(xiàn)和第二種方式差不多,但是缺少了path屬性,這種方式服務(wù)器會(huì)使用.xml的名字作為path屬性的值。訪問地址如下:http://localhost:8080/Pet/unpackWAR
="false"/> 讓大家久等了。今天給大家介紹怎樣在Tomcat5.5.9中部署Java Web應(yīng)用程序。本文的重點(diǎn)是如何部署,所以暫且先不介紹怎樣開發(fā)Web應(yīng)用程序和怎樣啟動(dòng)Tomcat服務(wù)器。我們現(xiàn)在不考慮使用的什么開發(fā)工具,總之在練習(xí)本文所說的例子之前,你應(yīng)該有一個(gè)Java Web應(yīng)用程序。本文假定Web應(yīng)用程序的根目錄為PetWeb。$CATALINA_HOME指的是Tomcat根目錄。
$CATALINA_HOME\webapps下,然后啟動(dòng)服務(wù)器就可以了。這種方式比較簡(jiǎn)單,但是web應(yīng)用程序必須在webapps目錄下。訪問地址如下:
http://localhost:8080/PetWeb/
2、這種方式可以不必將PetWeb目錄拷貝到webapps下,直接在F:\部署。方法如下,更改$CATALINA_HOME\conf\server.xml文件,在<host>標(biāo)簽內(nèi)添加<Context>標(biāo)簽,內(nèi)容如下:
<Context docBase="F:/PetWeb" reloadable="false" path="/Pet"/>
其
中reloadable="false"表示當(dāng)應(yīng)用程序中的內(nèi)容發(fā)生更改之后服務(wù)器不會(huì)自動(dòng)加載,這個(gè)屬性在開發(fā)階段通常都設(shè)為true,方便開發(fā),在發(fā)
布階段應(yīng)該設(shè)置為false,提高應(yīng)用程序的訪問速度。docBase為路徑,可以使用絕對(duì)路徑,也可以使用相對(duì)路徑,相對(duì)路徑相對(duì)于webapps。
path屬性的值是訪問時(shí)的根地址。訪問地址如下:http://localhost:8080/Pet/
3、這種方式和第二種方式差不多,但是不是在Server.xml文件中添加Context標(biāo)簽,而是在$CATALINA_HOME
\conf\Catalina\localhost中添加一個(gè)xml文件,如Pet.xml,內(nèi)容如下:
<Context docBase="F:/PetWeb" reloadable="false" />大家可能發(fā)現(xiàn)和第二種方式差不多,但是缺少了path屬性,這種方式服務(wù)器會(huì)使用.xml的名字作為path屬性的值。訪問地址如下:http://localhost:8080/Pet/unpackWAR
="false"/>$CATALINA_HOME\webapps\下沒有該文件,你必須去重新下載tomcat,否則不能完成以下的功能。要想使用該管理程序必須首先編輯$CATALINA_HOME\conf\tomcat-users.xml文件,內(nèi)容如下:關(guān)于這個(gè)文件的更多內(nèi)容,請(qǐng)參考Java Web應(yīng)用程序的安全模型二
<tomcat-users>JProbe
Version: 8.1.0
軟件簡(jiǎn)介:一款Java代碼、內(nèi)存和覆蓋率分析工具。
主要特性:覆蓋瀏覽器和源代碼視圖-快速分離未檢測(cè)代碼和死代碼;
批處理模式-能以批處理模式運(yùn)行,方便的集成建立/測(cè)試系統(tǒng);
報(bào)表-以XML、純文本、CSV或者HTML格式輸出覆蓋范圍報(bào)告,用以定制分析;
快照合并-合并多個(gè)平臺(tái)運(yùn)行的整個(gè)覆蓋數(shù)據(jù);
Eclipse IDE集成,提供了Eclipse插件,可在Eclipse中直接進(jìn)行內(nèi)存分析和代碼覆蓋率測(cè)試。
下載:
JProbe for Linux for x86 and x64 - BIN Format
JProbe for Solaris - BIN Format
JProbe for Solaris x86 - BIN Format
JProbe for Windows - EXE Format
JProbe Plugins for Eclipse Guide
破解方法(請(qǐng)使用正版軟件):
安裝Jprobe后,
方法1:替換client-support.jar目錄中的\com\sitraka\licensing\ValidateSignature.class文件。
方法2:替換client-support.jar目錄中的\com\sitraka\licensing\
LicenseProperties.class文件。
破解文件:
JProbe.Suite.v8.1.0.Cracked-FALLEN
其實(shí)在 JDK 5 中已經(jīng)新加入了這個(gè)功能了. 現(xiàn)在的 JDK 已經(jīng)內(nèi)置了對(duì) VM 的監(jiān)控功能. JDK 6 中這個(gè)工具變的更加好用了. 關(guān)于 JDK 5 中如何使用這個(gè)工具可以參考這里: http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html
http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html
jconsole 可以很方便的監(jiān)控本機(jī)的所有 Java 應(yīng)用和遠(yuǎn)程的應(yīng)用.
監(jiān)控本地應(yīng)用
首先就是啟動(dòng)您要監(jiān)控的應(yīng)用, 例如我用 JDK 1.6 來啟動(dòng)了 Tomcat, 或者 Eclipse 也可以, 可以在任務(wù)管理器(Ctrl+Alt+Del可以調(diào)出來, 或者在任務(wù)欄點(diǎn)擊右鍵)里看到進(jìn)程ID, 例如我這里是 6132.
接著在 JDK 安裝目錄中(<JDK_HOME>/bin/jconsole.exe)啟動(dòng) jconsole.exe (雙擊或者在 cmd 里面敲入 jconsole), 主界面會(huì)提示您建立一個(gè)新連接:
可以看到進(jìn)程ID, 選擇它, 然后點(diǎn)擊"連接". 這些 ID 必須都是用 JDK 1.6 的 java.exe 啟動(dòng)的, 否則在列表里看不到.
JConsle 能監(jiān)控內(nèi)存,線程,類的數(shù)目和CPU然后點(diǎn)擊各個(gè) Tab 可以看到詳細(xì)的輸出, 詳細(xì)的輸出包括:
內(nèi)存: 堆/非堆, 峰值, 內(nèi)存的各個(gè)部分, 例如 Perm, Eden 等的大小曲線圖.
線程: 峰值, 所有線程的列表, 堆棧跟蹤(哪個(gè)對(duì)象中的線程)等. 還可以強(qiáng)制執(zhí)行GC.
類: 峰值, 類總數(shù)曲線圖.
MBean: 一些 JVM 參數(shù)的詳細(xì) MBean 信息.
監(jiān)控遠(yuǎn)程進(jìn)程
首先需要在運(yùn)行的應(yīng)用上啟用遠(yuǎn)程管理, 參數(shù)如下(簡(jiǎn)單期間就不加用戶驗(yàn)證了):
java
-Dcom.sun.management.jmxremote.port=1090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false -jar
../demo/jfc/Java2D/Java2Demo.jar
然后連接的時(shí)候選擇遠(yuǎn)程進(jìn)程, 地址輸入:
localhost:1090
即可.當(dāng)然在別的電腦上(一般是局域網(wǎng))可以輸入那個(gè)電腦的IP.
綜 述: 使用 JConsole 可以簡(jiǎn)單的監(jiān)控 Server 狀態(tài), 但是本身要占一定的資源, 不過 JVM 自帶的監(jiān)控, 理論上講應(yīng)該是占資源很小很小的, 可以用它來方便的了解 Web 服務(wù)器應(yīng)用進(jìn)程的狀態(tài). 如果要調(diào)優(yōu)應(yīng)用, 還是使用 JProfiler 等工具更好一些, 當(dāng)然它們占的資源也更大.
后記:
jdk1.6.0\demo\management\MemoryMonitor
這里帶了個(gè)很好的畫內(nèi)存曲線圖的例子... 大家改改就可以實(shí)現(xiàn)同時(shí)監(jiān)控多臺(tái) Server 的內(nèi)存曲線了....
首先,安裝的時(shí)候要勾選ftp服務(wù),centos會(huì)幫你裝上vsftpd這個(gè)ftp服務(wù)器并把它標(biāo)為系統(tǒng)服務(wù)。
啟動(dòng)命令:/etc/rc.d/init.d/vsftpd start
這時(shí)候可以使用ftp客戶端連接。
vsftpd的權(quán)限貌似和系統(tǒng)權(quán)限有掛鉤。
下面是抄來的配置解釋vsftpd的配置
vsftpd.ftpusers:位于/etc目錄下。它指定了哪些用戶賬戶不能訪問FTP服務(wù)器,例如root等。
vsftpd.user_list:位于/etc目錄下。該文件里的用戶賬戶在默認(rèn)情況下也不能訪問FTP服務(wù)器,僅當(dāng)vsftpd .conf配置文件里啟用userlist_enable=NO選項(xiàng)時(shí)才允許訪問。
vsftpd.conf:位于/etc/vsftpd目錄下。來自定義用戶登錄控制、用戶權(quán)限控制、超時(shí)設(shè)置、服務(wù)器功能選項(xiàng)、服務(wù)器性能選項(xiàng)、服務(wù)器響應(yīng)消息等FTP服務(wù)器的配置。
(1)用戶登錄控制
anonymous_enable=YES,允許匿名用戶登錄。
no_anon_password=YES,匿名用戶登錄時(shí)不需要輸入密碼。
local_enable=YES,允許本地用戶登錄。
deny_email_enable=YES,可以創(chuàng)建一個(gè)文件保存某些匿名電子郵件的黑名單,以防止這些人使用Dos攻擊。
banned_email_file=/etc/vsftpd.banned_emails,當(dāng)啟用deny_email_enable功能時(shí),所需的電子郵件黑名單保存路徑(默認(rèn)為/etc/vsftpd.banned_emails)。
(2)用戶權(quán)限控制
write_enable=YES,開啟全局上傳權(quán)限。
local_umask=022,本地用戶的上傳文件的umask設(shè)為022(系統(tǒng)默認(rèn)是077,一般都可以改為022)。
anon_upload_enable=YES,允許匿名用戶具有上傳權(quán)限,很明顯,必須啟用write_enable=YES,才可以使用此項(xiàng)。同時(shí)我們還必須建立一個(gè)允許ftp用戶可以讀寫的目錄(前面說過,ftp是匿名用戶的映射用戶賬號(hào))。
anon_mkdir_write_enable=YES,允許匿名用戶有創(chuàng)建目錄的權(quán)利。
chown_uploads=YES,啟用此項(xiàng),匿名上傳文件的屬主用戶將改為別的用戶賬戶,注意,這里建議不要指定root賬號(hào)為匿名上傳文件的屬主用戶!
chown_username=whoever,當(dāng)啟用chown_uploads=YES時(shí),所指定的屬主用戶賬號(hào),此處的whoever自然要用合適的用戶賬號(hào)來代替。
chroot_list_enable=YES,可以用一個(gè)列表限定哪些本地用戶只能在自己目錄下活動(dòng),如果chroot_local_user=YES,那么這個(gè)列表里指定的用戶是不受限制的。
chroot_list_file=/etc/vsftpd.chroot_list,如果chroot_local_user=YES,則指定該列表(chroot_local_user)的保存路徑(默認(rèn)是/etc/vsftpd.chroot_list)。
nopriv_user=ftpsecure,指定一個(gè)安全用戶賬號(hào),讓FTP服務(wù)器用作完全隔離和沒有特權(quán)的獨(dú)立用戶。這是vsftpd系統(tǒng)推薦選項(xiàng)。
async_abor_enable=YES,強(qiáng)烈建議不要啟用該選項(xiàng),否則將可能導(dǎo)致出錯(cuò)!
ascii_upload_enable=YES;ascii_download_enable=YES,默認(rèn)情況下服務(wù)器會(huì)假裝接受ASCⅡ模式請(qǐng)求但實(shí)際上是忽略這樣的請(qǐng)求,啟用上述的兩個(gè)選項(xiàng)可以讓服務(wù)器真正實(shí)現(xiàn)ASCⅡ模式的傳輸。
注意:?jiǎn)⒂胊scii_download_enable選項(xiàng)會(huì)讓惡意遠(yuǎn)程用戶們?cè)贏SCⅡ模式下用“SIZE/big/file”這樣的指令大量消耗FTP服務(wù)器的I/O資源。
這些ASCⅡ模式的設(shè)置選項(xiàng)分成上傳和下載兩個(gè),這樣我們就可以允許ASCⅡ模式的上傳(可以防止上傳腳本等惡意文件而導(dǎo)致崩潰),而不會(huì)遭受拒絕服務(wù)攻擊的危險(xiǎn)。
(3)用戶連接和超時(shí)選項(xiàng)
idle_session_timeout=600,可以設(shè)定默認(rèn)的空閑超時(shí)時(shí)間,用戶超過這段時(shí)間不動(dòng)作將被服務(wù)器踢出。
data_connection_timeout=120,設(shè)定默認(rèn)的數(shù)據(jù)連接超時(shí)時(shí)間。
(4)服務(wù)器日志和歡迎信息
dirmessage_enable=YES,允許為目錄配置顯示信息,顯示每個(gè)目錄下面的message_file文件的內(nèi)容。
ftpd_banner=Welcome to blah FTP service,可以自定義FTP用戶登錄到服務(wù)器所看到的歡迎信息。
xferlog_enable=YES,啟用記錄上傳/下載活動(dòng)日志功能。
xferlog_file=/var/log/vsftpd.log,可以自定義日志文件的保存路徑和文件名,默認(rèn)是/var/log/vsftpd.log。
一、安裝(以root身份進(jìn)行)
1、檢出最新的postgresql的yum配置從http://yum.pgsqlrpms.org/reporpms/repoview/pgdg-centos.html
然后根據(jù)版本選擇需要的rpm后執(zhí)行下列命令
rpm -Uvh http://yum.pgsqlrpms.org/reporpms/8.3/pgdg-centos-8.3-6.noarch.rpm
2、安裝或者升級(jí)postgresql-libs
yum upgrade postgresql-libs
3、安裝postgresql
yum install postgresql postgresql-server
4、初始化數(shù)據(jù)庫(kù)以及啟動(dòng)服務(wù)
service postgresql initdb
service postgresql start
二、配置
在配置之前需將postgresql的端口號(hào)5432在iptables下開放。
yum安裝postgresql后的安裝路徑為:/var/lib/pgsql下,主要配置文件在其data文件夾下,進(jìn)入data文件夾
1、修改postgresql.conf文件
如果想讓PostgreSQL監(jiān)聽整個(gè)網(wǎng)絡(luò)的話,將listen_addresses前的#去掉,并將listen_addresses = 'localhost'改成listen_addresses = '*'
2、修改pg_hba.conf
這個(gè)文件最后有一個(gè)列表,它決定了分派了每一個(gè)用戶的權(quán)限,以及認(rèn)證方式。格式是“Type Database User Address Method”,要注意的是method最好寫md5。
在列表后追加一行:host all all 192.168.1.0/24 password
3、修改postgres用戶密碼:passwd postgres
4、暫時(shí)將pg_hba.conf中,本機(jī)的認(rèn)證方式改為trust,切換當(dāng)前用戶為postgres:su postgres
5、用psql登錄PostgreSQL系統(tǒng),“SELECT * FROM pg_shadow;”,發(fā)現(xiàn)這個(gè)表里的postgres這個(gè)用戶根本還沒有存儲(chǔ)密碼;于是,再“ALTER USER postgres PASSWORD '它的密碼';
6、重啟服務(wù)/etc/init.d/postgresql restart,連接成功。
前 言 |
|
[root@sample ~]# yum -y install samba ← 安裝 Samba Setting up Install Process Setting up repositories update 100% |=========================| 951 B 00:00 base 100% |=========================| 1.1 kB 00:00 addons 100% |=========================| 951 B 00:00 extras 100% |=========================| 1.1 kB 00:00 Reading repository metadata in from local files primary.xml.gz 100% |=========================| 73 kB 00:00 update : ################################################## 212/212 Added 212 new packages, deleted 0 old in 4.94 seconds primary.xml.gz 100% |=========================| 569 kB 00:00 base : ################################################## 1500/1500 Added 1500 new packages, deleted 0 old in 28.97 seconds primary.xml.gz 100% |=========================| 157 B 00:00 Added 0 new packages, deleted 0 old in 0.03 seconds primary.xml.gz 100% |=========================| 32 kB 00:00 extras : ################################################## 124/124 Added 124 new packages, deleted 0 old in 1.93 seconds Parsing package install arguments Resolving Dependencies --> Populating transaction set with selected packages. Please wait. ---> Downloading header for samba to pack into transaction set. samba-3.0.10-1.4E.9.i386. 100% |=========================| 101 kB 00:00 ---> Package samba.i386 0:3.0.10-1.4E.9 set to be updated --> Running transaction check --> Processing Dependency: samba-common = 0:3.0.10 for package: samba --> Restarting Dependency Resolution with new changes. --> Populating transaction set with selected packages. Please wait. ---> Downloading header for samba-common to pack into transaction set. samba-common-3.0.10-1.4E. 100% |=========================| 37 kB 00:00 ---> Package samba-common.i386 0:3.0.10-1.4E.9 set to be updated --> Running transaction check Dependencies Resolved ============================================================================= Package Arch Version Repository Size ============================================================================= Installing: samba i386 3.0.10-1.4E.9 base 13 M Installing for dependencies: samba-common i386 3.0.10-1.4E.9 base 5.0 M Transaction Summary ============================================================================= Install 2 Package(s) Update 0 Package(s) Remove 0 Package(s) Total download size: 18 M Downloading Packages: (1/2): samba-common-3.0.1 100% |=========================| 5.0 MB 00:04 (2/2): samba-3.0.10-1.4E. 100% |=========================| 13 MB 00:11 warning: rpmts_HdrFromFdno: V3 DSA signature: NOKEY, key ID 443e1821 Public key for samba-common-3.0.10-1.4E.9.i386.rpm is not installed Retrieving GPG key from http://mirror.centos.org/centos/RPM-GPG-KEY-centos4 Importing GPG key 0x443E1821 "CentOS-4 key <centos-4key@centos.org>" Key imported successfully Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing: samba-common ######################### [1/2] Installing: samba ######################### [2/2] Installed: samba.i386 0:3.0.10-1.4E.9 Dependency Installed: samba-common.i386 0:3.0.10-1.4E.9 Complete! |
|
[root@sample ~]# vi /etc/samba/smb.conf ← 編輯 Samba 的配置文件 #======================= Global Settings ===================================== [global] ← 找到這一行(全局設(shè)置標(biāo)簽),在此行下面添加如下行: dos charset = GB2312 ← 將 Windows 客戶端的文字編碼設(shè)置為簡(jiǎn)體中文 GB2312 unix charset = GB2312 ← 指定 Samba 所在的 CentOS 服務(wù)端新建文件或目錄時(shí)的編碼為 GB2312 display charset = GB2312 ← 指定使用 SWAT(一種通過瀏覽器控制Samba的工具)時(shí)頁面的默認(rèn)文字編碼 directory mask = 0777 ← 指定新建目錄的屬性(以下4行) force directory mode = 0777 directory security mask = 0777 force directory security mode = 0777 create mask = 0777 ← 指定新建文件的屬性(以下4行) force create mode = 0777 security mask = 0777 force security mode = 0777 workgroup = MYGROUP ← 找到此行,將工作組名稱改為 Windows 網(wǎng)絡(luò)所定義的工作組名 ↓ workgroup = WORKGROUP ← 變?yōu)榇藸顟B(tài),這里以 Windows XP 默認(rèn)的“WORKGROUP”為例 ; hosts allow = 192.168.1. 192.168.2. 127. ← 找到此行,去掉行首的“;”,并制定訪問限制 ↓ hosts allow = 192.168.0. 127. ← 變?yōu)榇藸顟B(tài),指定內(nèi)網(wǎng)IP地址及本地,只允許這兩種情況的訪問 然后在配置文件的末尾填如下幾行,定義公眾共享目錄: [public] comment = Public Stuff path = /home/samba ← 指定共享目錄位置 public = yes writable = yes ← 賦予共享目錄寫入權(quán)限的屬性 |
[root@sample ~]# mkdir /home/samba ← 建立共享文件專用目錄 [root@sample ~]# chown -R nobody. /home/samba ← 設(shè)置專用目錄歸屬為 nobody [root@sample ~]# chmod 777 /home/samba ← 將專用目錄屬性設(shè)置為 777 |
[root@sample ~]# smbpasswd -a centospub ← 將系統(tǒng)用戶 centospub(例)加入到 Samba 用戶數(shù)據(jù)庫(kù) New SMB password: ← 輸入該用戶用于登錄 Samba 的密碼 Retype new SMB password: ← 再次確認(rèn)輸入該密碼 Added user centospub. |
|
[root@sample ~]# vi /etc/sysconfig/iptables ← 編輯 iptables 配置文件 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT ← 找到此行,在下面添加如下行: -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 137 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 138 -j ACCEPT [root@sample ~]# /etc/rc.d/init.d/iptables restart ← 重新啟動(dòng) iptables ,使新的規(guī)則生效 Flushing firewall rules: [ OK ] Setting chains to policy ACCEPT: filter [ OK ] Unloading iptables modules: [ OK ] Applying iptables firewall rules: [ OK ] |
[root@sample ~]# chkconfig smb on ← 設(shè)置 Samba 自啟動(dòng) [root@sample ~]# chkconfig --list smb ← 確認(rèn) Samba 啟動(dòng)標(biāo)簽,確認(rèn) 2-5 為 on 的狀態(tài) smb 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@sample ~]# /etc/rc.d/init.d/smb start ← 啟動(dòng) Samba 服務(wù) Starting SMB services: [ OK ] Starting NMB services: [ OK ] |
|
在本地計(jì)算機(jī)上調(diào)試 Java™ 應(yīng)用程序并不是惟一的選擇。學(xué)習(xí)如何使用構(gòu)成遠(yuǎn)程調(diào)試的不同連接類型進(jìn)行遠(yuǎn)程調(diào)試。本文概述了設(shè)置遠(yuǎn)程應(yīng)用程序調(diào)試的特性和示例。
遠(yuǎn)程調(diào)試對(duì)應(yīng)用程序開發(fā)十分有用。例如,為不能托管開發(fā)平臺(tái)的低端機(jī)器開發(fā)程序,或在專用的機(jī)器上(比如服務(wù)不能中斷的 Web 服務(wù)器)調(diào)試程序。其他情況包括:運(yùn)行在內(nèi)存小或 CUP 性能低的設(shè)備上的 Java 應(yīng)用程序(比如移動(dòng)設(shè)備),或者開發(fā)人員想要將應(yīng)用程序和開發(fā)環(huán)境分開,等等。
先決條件
![]() |
|
如果您還沒安裝該程序,請(qǐng)下載 Eclipse V3.4(Ganymede)。在 Ganymede 中,套接字(socket)監(jiān)聽連接器被添加到 Remote Java Application 啟動(dòng)配置類型。Eclipse 最新的套接字監(jiān)聽連接器允許您打開 Java 調(diào)試器,它能夠監(jiān)聽特定套接字上的連接。可以從命令行選項(xiàng)打開被調(diào)試的程序,并將其連接到調(diào)試器。在 Ganymede 發(fā)布之前,僅有一個(gè)連接套接字的連接器,被調(diào)試的程序所在的機(jī)器必須是一個(gè)與調(diào)試器相連的調(diào)試主機(jī)。由于受到內(nèi)存和 CPU 不足的限制,要想讓移動(dòng)設(shè)備充當(dāng)主機(jī)是不現(xiàn)實(shí)的。
為了進(jìn)行遠(yuǎn)程調(diào)試,必須使用 Java Virtual Machine (JVM) V5.0 或更新版本,比如 IBM® J9 或 Sun Microsystem 的 Java SE Development Kit(JDK)。本文主要討論遠(yuǎn)程調(diào)試,而不是每個(gè) Eclipse 調(diào)試特性的細(xì)節(jié)。查看 參考資料 獲得更多關(guān)于使用 Eclipse 進(jìn)行調(diào)試的信息,并且可以找到上面提到的軟件。
JPDA 簡(jiǎn)介
![]() |
|
Sun Microsystem 的 Java Platform Debugger Architecture (JPDA) 技術(shù)是一個(gè)多層架構(gòu),使您能夠在各種環(huán)境中輕松調(diào)試 Java 應(yīng)用程序。JPDA 由兩個(gè)接口(分別是 JVM Tool Interface 和 JDI)、一個(gè)協(xié)議(Java Debug Wire Protocol)和兩個(gè)用于合并它們的軟件組件(后端和前端)組成。它的設(shè)計(jì)目的是讓調(diào)試人員在任何環(huán)境中都可以進(jìn)行調(diào)試。JPDA 不僅能夠用于桌面系統(tǒng),而且能夠在嵌入式系統(tǒng)上很好地工作。
JVM Tool Interface (JVMTI) 規(guī)定必須為調(diào)試提供 VM(編輯注:從 Java V5 開始,將用 JVMTI 代替 Java V1.4 中的 JVMDI)。Java Debug Wire Protocol (JDWP) 描述調(diào)試信息的格式,以及在被調(diào)試的進(jìn)程和調(diào)試器前端之間傳輸?shù)恼?qǐng)求,調(diào)試器前端實(shí)現(xiàn) JDI,比如 Eclipse、Borland JBuilder 等。根據(jù) Sun 的 JPDA 規(guī)范,被調(diào)試的程序常常稱為 debuggee。JDI 是一個(gè)高級(jí)的接口,它定義用于遠(yuǎn)程調(diào)試的信息和請(qǐng)求。下面給出了調(diào)試器的架構(gòu)。
Components Debugger Interfaces / |--------------| / | VM | debuggee -----( |--------------| <---- JVMTI - Java VM Tool Interface \ | back-end | \ |--------------| / | comm channel --( | <------------ JDWP - Java Debug Wire Protocol \ | / |--------------| / | front-end | debugger -----( |--------------| <---- JDI - Java Debug Interface \ | UI | \ |--------------| |
因此,任何第三方工具和基于 JPDA 的 VM 應(yīng)該都能協(xié)調(diào)工作。通過這個(gè)客戶機(jī)-服務(wù)器架構(gòu),您可以從運(yùn)行該平臺(tái)的本地工作站調(diào)試 Java 程序,甚至還可以通過網(wǎng)絡(luò)進(jìn)行遠(yuǎn)程調(diào)試。
在討論調(diào)試場(chǎng)景之前,我們先了解 JPDA 規(guī)范中的兩個(gè)術(shù)語:連接器和傳輸。連接器是一個(gè) JDI 抽象,用來在調(diào)試器應(yīng)用程序和目標(biāo) VM 之間建立連接。傳輸定義應(yīng)用程序如何進(jìn)行訪問,以及數(shù)據(jù)如何在前端和后端之間傳輸。連接器 “映射” 到可用的傳輸類型和連接模式。在 Sun 的 JPDA 參考實(shí)現(xiàn)中,為 Microsoft® Windows® 提供了兩個(gè)傳輸機(jī)制:套接字傳輸和共享內(nèi)存?zhèn)鬏敗?捎玫倪B接器:
在調(diào)試器應(yīng)用程序和目標(biāo) VM 之間建立連接時(shí),有一端將用作服務(wù)器并監(jiān)聽連接。隨后,另一端將連接到監(jiān)聽器并建立一個(gè)連接。通過連接,調(diào)試器應(yīng)用程序或目標(biāo) VM 都可以充當(dāng)服務(wù)器。進(jìn)程之間的通信可以在同一個(gè)機(jī)器或不同的機(jī)器上運(yùn)行。
要遠(yuǎn)程調(diào)試 Java 程序,難點(diǎn)不是在調(diào)試器的前端,而是遠(yuǎn)程 Java 后端。不幸的是,Eclipse 幫助系統(tǒng)中為這方面提供的信息并不多。事實(shí)上,JDI 和 JVMTI 是分別由 Eclipse 和 Java 運(yùn)行時(shí)環(huán)境實(shí)現(xiàn)的。我們僅需要考慮 JDMP,因?yàn)樗c JVMTI 和 JDI 進(jìn)行通信所需的信息。JDWP 包含許多參數(shù),用于為遠(yuǎn)程 Java 應(yīng)用程序調(diào)用所需的程序。以下是本文用到的一些參數(shù)。
從 Java V5 開始,您可以使用 -agentlib:jdwp 選項(xiàng),而不是 -Xdebug 和 -Xrunjdwp。但如果連接到 V5 以前的 VM,只能選擇 -Xdebug 和 -Xrunjdwp。下面簡(jiǎn)單描述 -Xrunjdwp 子選項(xiàng)。
要獲得每個(gè)調(diào)試設(shè)置的詳細(xì)解釋,請(qǐng)參考 JPDA 文檔(參見 參考資料)。
清單 2 是一個(gè)示例,顯示如何在調(diào)試模式下啟動(dòng) VM 并監(jiān)聽端口 8765 的套接字連接。
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765 |
清單 3 顯示如何使用位于 8000 端口的主機(jī) 127.0.0.1 上的套接字連接運(yùn)行中的調(diào)試器應(yīng)用程序。
-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000 |
![]() ![]() |
Eclipse 中的遠(yuǎn)程調(diào)試特性
Eclipse 是一個(gè)圖形化 Java 調(diào)試器前端。JDI 在 org.eclipse.jdt.debug 包中實(shí)現(xiàn)。本文不詳細(xì)討論 JDI 實(shí)現(xiàn)。參見 參考資料 獲得關(guān)于 Eclipse JDT 和 Java JDI 技術(shù)的信息。
我們首先應(yīng)該知道要使用哪個(gè) Eclipse 連接器。要了解 Eclipse 提供的遠(yuǎn)程連接類型,您可以轉(zhuǎn)到 Eclipse 菜單并選擇 Run > Debug Configurations...,在 Remote Java Application 中添加一個(gè)啟動(dòng)配置,然后從下拉列表中選擇連接器。在 Ganymede 中共有兩個(gè)連接器:
對(duì)于監(jiān)聽套接字的連接器,Eclipse VM 將是與遠(yuǎn)程 Java 應(yīng)用程序連接的主機(jī)。對(duì)于連接套接字的連接器,目標(biāo) VM 將作為主機(jī)。這兩種連接器對(duì)應(yīng)用程序調(diào)試沒有影響,用戶可以任意選擇。但根據(jù)經(jīng)驗(yàn),需要使用速度更快、更強(qiáng)大的計(jì)算機(jī)作為 VM 調(diào)試主機(jī),因?yàn)樾枰?jì)算的資源很多。
在調(diào)試 Java 應(yīng)用程序之前,需要確保已經(jīng)為遠(yuǎn)程應(yīng)用程序啟用所有調(diào)試選項(xiàng)。如果選項(xiàng)信息不可用,您將收到一個(gè)錯(cuò)誤信息,比如 “Debug information is not available” 或 “Unable to install breakpoint due to missing line number”。您可以通過更改 Eclipse 菜單上的 Window > Preferences > Java > Compiler 來修改設(shè)置。
![]() ![]() |
遠(yuǎn)程調(diào)試應(yīng)用程序
現(xiàn)在,我們已經(jīng)準(zhǔn)備好遠(yuǎn)程調(diào)試應(yīng)用程序。我們分步執(zhí)行:
package com.ibm.developerWorks.debugtest; public class test { public static void main(String[] args) { System.out.println("This is a test."); } } |
java -jar test.jar |
作為調(diào)試服務(wù)器的目標(biāo) VM
下面這個(gè)示例遠(yuǎn)程調(diào)用 Java 應(yīng)用程序作為調(diào)試服務(wù)器,并在端口 8000 監(jiān)聽套接字連接。目標(biāo) VM 將暫停,直到調(diào)試器連接。
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar test.jar |
使用遠(yuǎn)程啟動(dòng)配置啟動(dòng) Eclipse,并指定遠(yuǎn)程應(yīng)用程序的目標(biāo) VM 地址。為此,單擊 Run > Debug Configurations,然后在 Eclipse 菜單中雙擊 Remote Java Application。從最新創(chuàng)建的啟動(dòng)配置中為目標(biāo)應(yīng)用程序指定 IP 和端口。為了在同一臺(tái)機(jī)器上運(yùn)行遠(yuǎn)程應(yīng)用程序,僅需將主機(jī) IP 指定為 localhost 或 127.0.0.1。
選擇 Allow termination of remote VM 選項(xiàng)終止在應(yīng)用程序調(diào)試期間連接的 VM。
作為調(diào)試客戶機(jī)的目標(biāo) VM
第二個(gè)示例使用一個(gè)簡(jiǎn)單的 Java 應(yīng)用程序作為調(diào)試客戶機(jī),并且調(diào)試器前端作為調(diào)試服務(wù)器。Eclipse 使用套接字監(jiān)聽模式連接類型進(jìn)行監(jiān)聽。必須先啟動(dòng)調(diào)試前端來監(jiān)聽特定的端口。圖 6 給出一個(gè)用于設(shè)置監(jiān)聽的示例配置。
單擊 Eclipse Debug 按鈕,狀態(tài)欄將顯示消息 “waiting for vm to connect at port 8000...”。看到這個(gè)消息后,啟動(dòng)遠(yuǎn)程應(yīng)用程序。清單 7 顯示了如何將 Java 應(yīng)用程序作為調(diào)試客戶機(jī)并調(diào)用它,然后使用端口 8000 上的主機(jī) 127.0.0.1 的套接字將其連接到一個(gè)正在運(yùn)行的調(diào)試器應(yīng)用程序。
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y -jar test.jar |
如果一切進(jìn)行順利,將會(huì)顯示一個(gè)調(diào)試透視圖幫助調(diào)試應(yīng)用程序,并且遠(yuǎn)程 Java 應(yīng)用程序?qū)⒄MV埂_@類似于步驟 3 中的本地調(diào)試(參見圖 3)。在這里,您可以使用標(biāo)準(zhǔn)的調(diào)試特性,比如設(shè)置斷點(diǎn)和值、單步執(zhí)行等。
![]() ![]() |
結(jié)束語
本文演示如何使用 Eclipse 內(nèi)置的遠(yuǎn)程 Java 應(yīng)用程序配置類型對(duì)應(yīng)用程序執(zhí)行遠(yuǎn)程調(diào)試。介紹了如何設(shè)置 Java 應(yīng)用程序以調(diào)用遠(yuǎn)程調(diào)試,并幫助您理解 Eclipse 提供的連接器。最后,您還學(xué)習(xí)了如何將這些技術(shù)應(yīng)用到項(xiàng)目中。
ALTER PROCEDURE sp****(
@a AS VARCHAR(3),
@b AS VARCHAR(7),
@c AS CHAR(2),
@d AS VARCHAR(7)
) AS
BEGIN
DECLARE @NDTime varchar(50)
DECLARE @aOD VARCHAR(8)
DECLARE @dateDif INT
DECLARE @JRC VARCHAR(1)
/* 現(xiàn)在日時(shí)取得SP(sp****NowDate)を使用して、日時(shí)を取得する。 */
EXEC sp****NowDate @NDTime OUTPUT
SELECT @aOD = 字段
FROM ****
WHERE 字段 = @a
AND 字段 = @b
AND 字段 = @c
AND 字段 = d
SET @JRC= '1'
if datediff(d,Convert(datetime,@aOD),Convert(datetime,@NDT)) >= 180 begin
SET @JRC = '0'
end
SELECT @JRC ****
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
找到eclipse下的插件,叫jadclipse,安裝好之后,只要雙擊.class文件,就能直接看源文件,包括jar
包中的class文件,也可以直接反編譯。
1.下載jad1.5.8
http://www.kpdus.com/jad.html#download
下載后解壓。解壓縮后將jad.exe拷貝到JRE的bin目錄下,如\Java\jre1.5.0_06\bin
2.下載 jadclipse_3.1.0.jar
http://jaist.dl.sourceforge.net/sourceforge/jadclipse/jadclipse_3.1.0.jar
將jadclipse_3.1.0.jar復(fù)制到D:\Program Files\eclipse\myplugin\eclipse\plugins目錄下(用的是
link方式安裝插件的)。
這需要看你的Eclipse版本了
最新版3.2.2(適用于Eclipse 3.2M5以上,包括3.4.x)在 http://prdownloads.sourceforge.net/jadclipse/jadclipse_3.2.2.jar?download
3.啟動(dòng)Eclipse后,在Windows-->Perference-->Java下面應(yīng)該會(huì)多出一個(gè)JadClipse目錄,相關(guān)的設(shè)置可
以在此修改
配置jadclipse:設(shè)置path to decompiler為jad.exe的全路徑,如:F:\Java\jre1.5.0_06\bin\jad.exe
,在Directory for temporary files中指定臨時(shí)文件的路徑,如:G:\Java\eclipse-SDK-3.0-win32\temp
4、在Eclipse的Windows-->Perference-->General->Editors->File Associations中修改“*.class”默
認(rèn)關(guān)聯(lián)的編輯器為“JadClipse Class File Viewer”
5、安裝完成,雙擊class文件,Eclipse將自動(dòng)反編譯了。
自從eclipse升級(jí)到3.3以后jad插件就一直沒有成功的安裝上去,網(wǎng)上看了好多文章也是以前版本的安裝方法,3.3目前通過eclipse的software update的插件安裝方式已經(jīng)不行了。
目前安裝方式如下:
1.從http://www.kpdus.com/jad.html#download地址下載最新的jad,我目前下載的是jadnt158.zip
2.從http://nchc.dl.sourceforge.net/sourceforge/jadclipse/net.sf.jadclipse_3.3.0.jar地址下載jadclipse_3.3.0.jar,拷貝到eclipse的plugins目錄下。
3.啟動(dòng)或重起eclipse,修改window -> Preferences -> Java -> JadClipse 下的
Path to decompiler 如:D:\eric\jadnt158\jad.exe(jadnt158.zip解壓后的目錄)
4.Windows -> Perference -> General -> Editors -> File Associations中修改“*.class”默認(rèn)關(guān)聯(lián)的編輯器為“JadClipse Class File Viewer”
軟件環(huán)境描述
Windows XP Professional SP4
Apache 2.0.47
WebLogic Server 9.0 SP1
安裝Apache2.x
從Apache站點(diǎn)下載2.0.47版本的Apache HTTP Server,參考下載地址為:
http://apache.linuxforum.net/dist/httpd/binaries/win32/apache_2.0.47-win32-x86-no_ssl.msi
下載完畢后,開始安裝apache。雙擊apache_2.0.47-win32-x86-no_ssl.msi,安裝Apache,出現(xiàn)歡迎畫面,點(diǎn)擊"Next",然后出現(xiàn)協(xié)議頁面,選擇同意協(xié)議選擇,點(diǎn)擊"Next",出現(xiàn)說明頁面,點(diǎn)擊"Next",然后出現(xiàn)下面所示畫面:
圖1 配置Apache
填寫完畢后,點(diǎn)擊"Next",選擇典型安裝,點(diǎn)擊"Next",然后出現(xiàn)選擇安裝路徑,這里取默認(rèn)值,點(diǎn)擊"Next",然后點(diǎn)擊"Install"按鈕。安裝完畢后,點(diǎn)擊"Finish"按鈕,退出安裝程序。這時(shí)候,你會(huì)發(fā)現(xiàn)在桌面的右下角出現(xiàn)apache的運(yùn)行監(jiān)視圖標(biāo)。
安裝WLS9.0,配置WLS Domain
安裝WLS9.0,WLS7.0安裝參數(shù)概要如下:
名稱 | 值 |
BEA Home | C:\bea |
Domain Name | base_domain |
Domain類型 | WLS Domain |
Domain Location | C:\bea\user_projects\ |
Server類型 | Single Server(Standalone Server) |
Server Name | myserver |
myserver的用戶名 | weblogic |
myserver的口令 | weblogic |
圖2 配置WebLogic
Apache2.x與WLS集成
1、 修改C:\WINDOWS\system32\drivers\etc目錄下面的hosts文件。在用記事本把文件打開,在文件的最后加上:127.0.0.1 www.synnex-china.com ,如下圖所示:
圖3 配置 DNS文件
2、登陸weblogic的控制臺(tái),發(fā)布。然后啟動(dòng)剛剛創(chuàng)建好的WebLogic Server,如果出現(xiàn)下圖所示的畫面,說明WebLogic Server啟動(dòng)正常:
圖4 WebLogic啟動(dòng)歡迎畫面
3、進(jìn)入DOS界面,首先到C:\Program Files\Apache Group\Apache2\bin目錄下面,然后執(zhí)行Apache -l命令,出現(xiàn)如下畫面:
圖5 Apache -l命令
mod_so.c表明當(dāng)前的Apache HTTP Server是動(dòng)態(tài)加載的模式,可以和WebLogic進(jìn)行整合(因?yàn)閃indows平臺(tái)下面的WebLogic Server7.0只支持Apache 2.x)。
然后將附件中的mod_wl_20.so拷貝到C:\Program Files\Apache Group\Apache2\modules目錄下面。然后執(zhí)行 Apache -t命令,出現(xiàn)如下畫面:
圖6 Apache -t命令
這表明Apache 的WebLogic Server plug-in安裝成功。
4、修改C:\Program Files\Apache Group\Apache2\conf目錄下面的httpd.conf文件。
首先添加新的和WebLogic相關(guān)的應(yīng)用模塊,在httpd.conf文件的174行加入如下語句:
#WebLogic Server Proxy Settings
LoadModule weblogic_module modules/mod_wl_20.so
<IfModule mod_weblogic.c>
WebLogicHost www.synnex-china.com
WebLogicPort 7001
MatchExpression *.jsp
MatchExpression *.js
MatchExpression *.css
MatchExpression *.do
MatchExpression *.gif
MatchExpression *.html
</IfModule>
圖7 為Apache 添加WebLogic相關(guān)的應(yīng)用模塊
然后把httpd.conf文件中的
DocumentRoot "C:/Program Files/Apache Group/Apache2/htdocs"
改為
DocumentRoot "D:/desk/desk_project/src/jsp/desk" (web項(xiàng)目所在的webapp目錄)
,把
<Directory "C:/Program Files/Apache Group/Apache2/htdocs">
改為
<Directory "D:/desk/desk_project/src/jsp/desk">(web項(xiàng)目所在的webapp目錄)
修改完畢后,重新啟動(dòng)apache服務(wù),如下圖所示:
原來訪問地址:http://localhost:7001/desk/Menu.html
這個(gè)時(shí)候,你就可以用http://localhost/desk/Menu.html來訪問頁面了 :-)
1. 下載log4j解壓后在目錄jakarta-log4j-
<Catalina-home>/webapps/test/WEB-INF/lib目錄下
2.?????? 創(chuàng)建log4j的配置文件log4j.properties,存于目錄:
<Catalina-home>/webapps/test/WEB-INF
?????? 文件內(nèi)容:
?????? log4j.rootLogger=DEBUG, consoleLogger, fileLogger
log4j.appender.consoleLogger=org.apache.log4j.ConsoleAppender
log4j.appender.consoleLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleLogger.Threshold=DEBUG
log4j.appender.consoleLogger.layout.ConversionPattern=%c{2} - %m%n
log4j.appender.fileLogger=org.apache.log4j.RollingFileAppender
log4j.appender.fileLogger.File=c:/tomcat/webapps/test/WEB-INF/blog.txt
log4j.appender.fileLogger.MaxFileSize=1000KB
# 保留5個(gè)舊的日志文件
log4j.appender.fileLogger.MaxBackupIndex=5
log4j.appender.fileLogger.layout=org.apache.log4j.PatternLayout
# 日志格式:按照WebSphere通用日志格式相似的方式記錄
log4j.appender.fileLogger.layout.ConversionPattern=[%d] %t %c %-5p - %m%n
3.?????? 創(chuàng)建Blog4jServlet.java:
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class BLog4jServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {???????
??????? try{
??????????? String path = config.getServletContext().getRealPath("/");
??????? ??? String propfile = path + config.getInitParameter("propfile");
??????????? PropertyConfigurator.configure(propfile);
??????? }catch(Exception e){
??????????? System.out.println(e.getMessage());
??????? }
??????? }
}
4.???? 修改web.xml,加入如下代碼:
<servlet>
? ?? <servlet-name>log4j</servlet-name>
<servlet-class>binclude.BLog4jServlet</servlet-class>
<init-param>
<param-name>propfile</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
5.???? 在需要調(diào)用log的時(shí)候:
import org.apache.log4j.*;
static Logger logger = Logger.getLogger(DispatchServlet.class.getName());
logger.debug("this is a log message from" + logger.getName());
logger.info("info from" + logger.getName());
logger.warn("warn " + logger.getName());
logger.error("error" + logger.getName());