摘要:
閱讀全文
posted @
2009-03-18 14:06 xnabx 閱讀(149) |
評論 (0) |
編輯 收藏
摘要:
閱讀全文
posted @
2008-10-29 16:34 xnabx 閱讀(112) |
評論 (0) |
編輯 收藏
摘要:
閱讀全文
posted @
2008-07-30 15:18 xnabx 閱讀(238) |
評論 (0) |
編輯 收藏
摘要:
閱讀全文
posted @
2008-07-23 11:20 xnabx 閱讀(387) |
評論 (0) |
編輯 收藏
出處:http://m.tkk7.com/xmatthew/archive/2008/04/14/192450.html
(轉)設計一個Tomcat訪問日志分析工具
常使用web服務器的朋友大都了解,一般的web server有兩部分日志:
一是運行中的日志,它主要記錄運行的一些信息,尤其是一些異常錯誤日志信息
二是訪問日志信息,它記錄的訪問的時間,IP,訪問的資料等相關信息。
現在我來和大家介紹一下利用tomcat產生的訪問日志數據,我們能做哪些有效的分析數據?
首先是配置tomcat訪問日志數據,默認情況下訪問日志沒有打開,配置的方式如下:
編輯 ${catalina}/conf/server.xml文件.注:${catalina}是tomcat的安裝目錄
把以下的注釋(<!-- -->)去掉即可。
<!--
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
-->
其中 directory是產生的目錄 tomcat安裝${catalina}作為當前目錄
pattern表示日志生產的格式,common是tomcat提供的一個標準設置格式。其具體的表達式為 %h %l %u %t "%r" %s %b
但本人建議采用以下具體的配置,因為標準配置有一些重要的日志數據無法生。
%h %l %u %t "%r" %s %b %T
具體的日志產生樣式說明如下(從官方文檔中摘錄):
* %a - Remote IP address
* %A - Local IP address
* %b - Bytes sent, excluding HTTP headers, or '-' if zero
* %B - Bytes sent, excluding HTTP headers
* %h - Remote host name (or IP address if resolveHosts is false)
* %H - Request protocol
* %l - Remote logical username from identd (always returns '-')
* %m - Request method (GET, POST, etc.)
* %p - Local port on which this request was received
* %q - Query string (prepended with a '?' if it exists)
* %r - First line of the request (method and request URI)
* %s - HTTP status code of the response
* %S - User session ID
* %t - Date and time, in Common Log Format
* %u - Remote user that was authenticated (if any), else '-'
* %U - Requested URL path
* %v - Local server name
* %D - Time taken to process the request, in millis
* %T - Time taken to process the request, in seconds
There is also support to write information from the cookie, incoming header, the Session or something else in the ServletRequest. It is modeled after the apache syntax:
* %{xxx}i for incoming headers
* %{xxx}c for a specific cookie
* %{xxx}r xxx is an attribute in the ServletRequest
* %{xxx}s xxx is an attribute in the HttpSession
現在我們回頭再來看一下下面這個配置 %h %l %u %t "%r" %s %b %T 生產的訪問日志數據,我們可以做哪些事?
先看一下,我們能得到的數據有:
* %h 訪問的用戶IP地址
* %l 訪問邏輯用戶名,通常返回'-'
* %u 訪問驗證用戶名,通常返回'-'
* %t 訪問日時
* %r 訪問的方式(post或者是get),訪問的資源和使用的http協議版本
* %s 訪問返回的http狀態
* %b 訪問資源返回的流量
* %T 訪問所使用的時間
有了這些數據,我們可以根據時間段做以下的分析處理(圖片使用jfreechart工具動態生成):
* 獨立IP數統計
* 訪問請求數統計
* 訪問資料文件數統計
* 訪問流量統計
* 訪問處理響應時間統計
* 統計所有404錯誤頁面
* 統計所有500錯誤的頁面
* 統計訪問最頻繁頁面
* 統計訪問處理時間最久頁面
* 統計并發訪問頻率最高的頁面
分析工具包括兩大部分,一個是后臺解釋程序,每天執行一次對后臺日志數據進行解析后保存到數據庫中。
第二個是顯示程序,從數據庫中查詢數據并生成相應的圖表信息。
posted @
2008-04-15 12:06 xnabx 閱讀(559) |
評論 (0) |
編輯 收藏
摘要:
閱讀全文
posted @
2008-04-09 08:50 xnabx 閱讀(36) |
評論 (0) |
編輯 收藏
摘要:
閱讀全文
posted @
2008-03-19 13:00 xnabx 閱讀(187) |
評論 (0) |
編輯 收藏
如果你覺得你的Eclipse在啟動的時候很慢(比如說超過20秒鐘),也許你要調整一下你的Eclipse啟動參數了,以下是一些``小貼士'':
1. 檢查啟動Eclipse的JVM設置。 在Help\About Eclipse SDK\Configuration Detail里面,你可以看到啟動Eclipse的JVM。 這個JVM和你在Eclipse中設置的Installed JDK是兩回事情。 如果啟動Eclipse的JVM還是JDK 1.4的話,那最好改為JDK 5,因為JDK 5的性能比1.4更好。
C:\eclipse\eclipse.exe -vm "C:\Program Files\Java\jdk1.5.0_08\ bin\javaw.exe"
2. 檢查Eclipse所使用的heap的大小。 在C:\eclipse目錄下有一個配置文件eclipse.ini,其中配置了Eclipse啟動的默認heap大小
-vmargs
-Xms40M
-Xmx256M
所以你可以把默認值改為:
-vmargs
-Xms256M
-Xmx512M
當然,也可以這樣做,把堆的大小改為256 - 512。
C:\eclipse\eclipse.exe -vm "C:\Program Files\Java\jdk1.5.0_08\ bin\javaw.exe" -vmargs -Xms256M -Xmx512M
3. 其他的啟動參數。 如果你有一個雙核的CPU,也許可以嘗試這個參數:
-XX:+UseParallelGC
讓GC可以更快的執行。(只是JDK 5里對GC新增加的參數)
posted @
2007-12-25 10:55 xnabx 閱讀(486) |
評論 (0) |
編輯 收藏
Java對多線程的支持與同步機制深受大家的喜愛,似乎看起來使用了synchronized關鍵字就可以輕松地解決多線程共享數據同步問題。到底如何?――還得對synchronized關鍵字的作用進行深入了解才可定論。
總的說來,synchronized關鍵字可以作為函數的修飾符,也可作為函數內的語句,也就是平時說的同步方法和同步語句塊。如果再細的分類,synchronized可作用于instance變量、object reference(對象引用)、static函數和class literals(類名稱字面常量)身上。
在進一步闡述之前,我們需要明確幾點:
A.無論synchronized關鍵字加在方法上還是對象上,它取得的鎖都是對象,而不是把一段代碼或函數當作鎖――而且同步方法很可能還會被其他線程的對象訪問。
B.每個對象只有一個鎖(lock)與之相關聯。
C.實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。
接著來討論synchronized用到不同地方對代碼產生的影響:
假設P1、P2是同一個類的不同對象,這個類中定義了以下幾種情況的同步塊或同步方法,P1、P2就都可以調用它們。
1. 把synchronized當作函數修飾符時,示例代碼如下:
Public synchronized void methodAAA()
{
//….
}
這也就是同步方法,那這時synchronized鎖定的是哪個對象呢?它鎖定的是調用這個同步方法對象。也就是說,當一個對象P1在不同的線程中執行這個同步方法時,它們之間會形成互斥,達到同步的效果。但是這個對象所屬的Class所產生的另一對象P2卻可以任意調用這個被加了synchronized關鍵字的方法。
上邊的示例代碼等同于如下代碼:
public void methodAAA()
{
synchronized (this) // (1)
{
//…..
}
}
(1)處的this指的是什么呢?它指的就是調用這個方法的對象,如P1??梢娡椒椒▽嵸|是將synchronized作用于object reference。――那個拿到了P1對象鎖的線程,才可以調用P1的同步方法,而對P2而言,P1這個鎖與它毫不相干,程序也可能在這種情形下擺脫同步機制的控制,造成數據混亂:(
2.同步塊,示例代碼如下:
public void method3(SomeObject so)
{
synchronized(so)
{
//…..
}
}
這時,鎖就是so這個對象,誰拿到這個鎖誰就可以運行它所控制的那段代碼。當有一個明確的對象作為鎖時,就可以這樣寫程序,但當沒有明確的對象作為鎖,只是想讓一段代碼同步時,可以創建一個特殊的instance變量(它得是一個對象)來充當鎖:
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // 特殊的instance變量
Public void methodA()
{
synchronized(lock) { //… }
}
//…..
}
注:零長度的byte數組對象創建起來將比任何對象都經濟――查看編譯后的字節碼:生成零長度的byte[]對象只需3條操作碼,而Object lock = new Object()則需要7行操作碼。
3.將synchronized作用于static 函數,示例代碼如下:
Class Foo
{
public synchronized static void methodAAA() // 同步的static 函數
{
//….
}
public void methodBBB()
{
synchronized(Foo.class) // class literal(類名稱字面常量)
}
}
代碼中的methodBBB()方法是把class literal作為鎖的情況,它和同步的static函數產生的效果是一樣的,取得的鎖很特別,是當前調用這個方法的對象所屬的類(Class,而不再是由這個Class產生的某個具體對象了)。
記得在《Effective Java》一書中看到過將 Foo.class和 P1.getClass()用于作同步鎖還不一樣,不能用P1.getClass()來達到鎖這個Class的目的。P1指的是由Foo類產生的對象。
可以推斷:如果一個類中定義了一個synchronized的static函數A,也定義了一個synchronized 的instance函數B,那么這個類的同一對象Obj在多線程中分別訪問A和B兩個方法時,不會構成同步,因為它們的鎖都不一樣。A方法的鎖是Obj這個對象,而B的鎖是Obj所屬的那個Class。
小結如下:
搞清楚synchronized鎖定的是哪個對象,就能幫助我們設計更安全的多線程程序。
還有一些技巧可以讓我們對共享資源的同步訪問更加安全:
1. 定義private 的instance變量+它的 get方法,而不要定義public/protected的instance變量。如果將變量定義為public,對象在外界可以繞過同步方法的控制而直接取得它,并改動它。這也是JavaBean的標準實現方式之一。
2. 如果instance變量是一個對象,如數組或ArrayList什么的,那上述方法仍然不安全,因為當外界對象通過get方法拿到這個instance對象的引用后,又將其指向另一個對象,那么這個private變量也就變了,豈不是很危險。這個時候就需要將get方法也加上synchronized同步,并且,只返回這個private對象的clone()――這樣,調用端得到的就是對象副本的引用了。
posted @
2007-10-11 14:19 xnabx 閱讀(264) |
評論 (0) |
編輯 收藏
摘要:
閱讀全文
posted @
2007-07-29 09:17 xnabx 閱讀(387) |
評論 (0) |
編輯 收藏