在實(shí)際部署的生產(chǎn)環(huán)境能夠以較低的風(fēng)險(xiǎn)及成本實(shí)現(xiàn)對(duì)業(yè)務(wù)邏輯級(jí)別性能問題的追蹤。本文將介紹如何集成 Perf4j 到 Java 應(yīng)用程序中并生成性能數(shù)據(jù)。
創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、麥蓋提網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為麥蓋提等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
系統(tǒng)日志是應(yīng)用程序問題診斷及運(yùn)行維護(hù)的重要工具。Logback、Log4j 是常用于 Java 平臺(tái)的日志記錄 API. 目前大部分產(chǎn)品只是將系統(tǒng)重要參數(shù)、狀態(tài)的變化及異常信息通過日志輸出。本文將要介紹的 Perf4j 是一款專
門用于 Java 服務(wù)器端代碼計(jì)時(shí)、記錄日志和監(jiān)控結(jié)果的開源工具包。Perf4j
對(duì)常用日志工具包進(jìn)行了擴(kuò)展,能夠?qū)⒌玫降脑夹阅軘?shù)據(jù)進(jìn)行統(tǒng)計(jì)并發(fā)布到可定制的輸出源,如控制臺(tái)、日志文件、JMX 等。Perf4j
提供了多種方式與 Java 代碼集成,開發(fā)和系統(tǒng)維人員能夠靈活地將 Perf4j 的 API 嵌入到各種不同架構(gòu)的應(yīng)用程序中。
Perf4j 目前依托于開源項(xiàng)目協(xié)作平臺(tái) Codehaus 進(jìn)行文檔及代碼管理,下一步該項(xiàng)目計(jì)劃遷移到 Github
平臺(tái),以便更多的社區(qū)及開發(fā)人員可以參與到開發(fā)及維護(hù)中來。Perf4j 歡迎使用者提出新的功能需求并且鼓勵(lì)將定制或擴(kuò)展的代碼貢獻(xiàn)到 Perf4j
源碼中。本文中示例代碼使用的 Perf4j 版本是 0.9.16,讀者需在下載類包或配置 Maven 時(shí)留意。
閱讀文章之前,您要對(duì) Java 注解、JMX、面向方面編程有一些了解。特別是 JConsole 的使用及 Spring AOP 的配置方式要較為熟悉。
文章首先闡明在何種應(yīng)用場(chǎng)景下應(yīng)優(yōu)先考慮使用 Perf4j。然后是具體講解 Pef4j 與應(yīng)用程序的集成方式。最后會(huì)介紹如何將收集的數(shù)據(jù)生成便于分析的可視化圖表。
應(yīng)用場(chǎng)景
在 Java 平臺(tái)上遇到性能問題時(shí),如 CPU 占用過高、系統(tǒng)響應(yīng)緩慢,通常的分析方法是使用 JVM
剖析工具在系統(tǒng)瓶頸臨界點(diǎn)前一段時(shí)間抓取 CPU 占用分布,再對(duì) CPU 占用率最高的幾個(gè)方法排查。Perf4j
的優(yōu)勢(shì)在于能夠持續(xù)跟蹤統(tǒng)計(jì)所關(guān)注功能代碼的執(zhí)行效率,對(duì)于前后兩個(gè)版本出現(xiàn)較大差異的方法進(jìn)行深入分析,可以在開發(fā)周期中盡早發(fā)現(xiàn)問題。Perf4j 還可以用在產(chǎn)品環(huán)境中,從運(yùn)營(yíng)的早期開始,將其統(tǒng)計(jì)的數(shù)據(jù)做為系統(tǒng)的性能和健康指標(biāo)長(zhǎng)期監(jiān)測(cè)。
首選 Perf4j 的應(yīng)用場(chǎng)景:
Java 本地代碼調(diào)用(JNI) 分布式系統(tǒng)、集群部署 面向服務(wù)體系結(jié)構(gòu)(SOA) 遠(yuǎn)程方法調(diào)用(RMI)
開發(fā)人員必須將本地方法、遠(yuǎn)程方法及 Web services 的性能問題隔離出來,以防干擾對(duì) Java 應(yīng)用程序本身的分析。通過日志記錄則是最簡(jiǎn)單的方式;采用分布式架構(gòu)或集群部署的系統(tǒng)相對(duì)復(fù)雜,不同的網(wǎng)絡(luò)環(huán)境、基礎(chǔ)硬件和操作系統(tǒng)的差異、虛擬主機(jī)中資源與配置的差異等造成很難采用統(tǒng)一的工具來監(jiān)測(cè)代碼級(jí)別的性能指標(biāo)。而日志記錄則可以輕松加入到各種程序中,且是資源與時(shí)間成本最低的方式。Perf4j 提供了 CSV 格式的轉(zhuǎn)換工具,開發(fā)人員可以借助第三方工具方便地將統(tǒng)計(jì)結(jié)果匯總分析。
集成到應(yīng)用程序
下面將分兩種方式具體講述如何利用 Per4j 提供的 API。在實(shí)際的項(xiàng)目中,應(yīng)根據(jù)現(xiàn)有的程序框架及監(jiān)測(cè)目的靈活選擇。另外,針對(duì) WebSphere 應(yīng)用服務(wù)器的自有日志系統(tǒng),還必須采取額外的措施來確保 Perf4j 的正常工作。
對(duì)代碼段計(jì)時(shí)
Perf4j 中 org.perf4j.StopWatch 是整個(gè) API 中的基礎(chǔ)工具。這是一個(gè)封裝良好的計(jì)時(shí)器。可以把
StopWatch 嵌入到代碼中任何地方。這種方式往往使得復(fù)雜的方法得到分解,從而有利于精確定位問題的根源。以下通過清單 1 和清單 2
來介紹其具體用法。
清單 1.StopWacth 基本用法
public static void basicStopWatch() throws
InterruptedException{ // 創(chuàng)建 StopWacth 時(shí)開始計(jì)時(shí),之后也可以用 stopWatch.start()
重新設(shè)定計(jì)時(shí)開始時(shí)間點(diǎn) StopWatch stopWatch = new StopWatch("TransactionA"); //
執(zhí)行需要計(jì)時(shí)的代碼 Thread.sleep(2 * 1000L); String result = stopWatch.stop();
System.out.print(result); }
清單 1 中最后輸出的結(jié)果示例:start[1340442785756] time[1995]
tag[TransactionA]。在構(gòu)造函數(shù)中設(shè)定 tag[TransactionA]
用來區(qū)分不同的業(yè)務(wù)邏輯,可以把它看成是性能分析中的事務(wù)(Transaction)。
如果需要將多段代碼分開統(tǒng)計(jì),可采用 LoggingStopWatch 類的 lap() 方法定義多個(gè)事務(wù)。
清單 2.LoggingStopWatch 用法
public static void loggingStopWacth()
throws InterruptedException{ LoggingStopWatch stopWatch = new
LoggingStopWatch(); // 設(shè)定閾值,小于此閾值的結(jié)果將不會(huì)被記錄下來
stopWatch.setTimeThreshold(1*1000L); Thread.sleep(2 * 1000L); //
停止當(dāng)前計(jì)時(shí),開始新的起始時(shí)間點(diǎn) stopWatch.lap("TransactionB"); Thread.sleep(500L);
stopWatch.stop("TransactionC"); }
清單 2 中使用了 LoggingStopWatch 類,其 stop() 方法只是將執(zhí)行時(shí)間數(shù)據(jù)通過
System.err.println() 輸出。若與 Log4j 框架集成,則需要使用 LoggingStopWatch 的子類
Log4JStopWatch, 目前 Perf4j 還支持 Apache Commons
Logging、java.util.logginLogback,對(duì)應(yīng)使用 CommonsLogStopWatch、
JavaLogStopWatch、Slf4JStopWatch。
一句兩句說不清楚,給你個(gè)鏈接,介紹的比較詳細(xì)
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=%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=%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@hollycrm.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@hollycrm.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@cybercorlin.net
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)康模?/p>
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,
在項(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@263.net
log4j.appender.A5.From=error@error.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@263.net
log4j.appender.A5.From=error@error.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!!!");
}
}
Arthas 是Alibaba開源的Java診斷工具。當(dāng)你遇到以下類似問題而束手無策時(shí),Arthas可以幫助你解決:
這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception?
我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯(cuò)了?
遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
線上遇到某個(gè)用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!
是否有一個(gè)全局視角來查看系統(tǒng)的運(yùn)行狀況?
有什么辦法可以監(jiān)控到JVM的實(shí)時(shí)運(yùn)行狀態(tài)?
怎么快速定位應(yīng)用的熱點(diǎn),生成火焰圖?
Arthas支持jdk6+,多種系統(tǒng)版本,采用命令行交互模式,同時(shí)提供豐富的tab自動(dòng)補(bǔ)全功能,進(jìn)一步方便我們進(jìn)行問題的定位和診斷
1.2、快速安裝
1.2.1、Linux下按
下載arthas-boot.jar,在使用java -jar方式啟動(dòng)即可。
命令
**注意:**在進(jìn)行第二條命令之前,先運(yùn)行一個(gè)Java程序在內(nèi)存之中,否則會(huì)報(bào)錯(cuò)
2、快速入門
2.1、attach一個(gè)進(jìn)程
目標(biāo):
1、執(zhí)行一個(gè)jar包
2、通過arthas來attach來追蹤
3、進(jìn)行常用的命令操作
如果端口號(hào)被占用,也可以通過命令換成另一個(gè)端口號(hào)執(zhí)行。
總結(jié):
1、啟動(dòng)進(jìn)程
2、啟動(dòng)arthas-boot.jar,進(jìn)入啟動(dòng)的進(jìn)程
3、不但可以通過命令行的方式來操作arthas也可以通過瀏覽器來訪問arthas
2.2、常用命令接觸
1、dashboard儀表板
2、通過thread命令來獲取到arthas-demo進(jìn)程的Main Class
3、通過jad來反編譯Main Clas
4、wathch具體方法
2.2.1.、dashboard儀表板
在這里插入圖片描述
2.2.2、通過thread命令來獲取到arthas-demo進(jìn)程的Main Class
在這里插入圖片描述
2.2.3、通過jad反編譯Main Class
在這里插入圖片描述
2.2.4、watch監(jiān)視
demo.MathGame primeFactors:
demo.MathGame:包名+類名
primeFactors:方法名
returnObj:返回參數(shù)的表達(dá)式
2.2.5、退出arthas
如果只是退出當(dāng)前的連接,可以用quit或者exit命令。Attach到目標(biāo)進(jìn)程上的arthas還會(huì)繼續(xù)運(yùn)行,端口會(huì)保持開放,下次連接時(shí)可以直接連接上。
如果想完全退出arthas,可以執(zhí)行stop命令
在這里插入圖片描述
2.3、基礎(chǔ)命令1
1、help:查看所有幫助信息
2、cat:顯示文本文件內(nèi)容
3、grep:匹配查找,和linux中的grep類似,但只能用于管道命令
在這里插入圖片描述
4、pwd:顯示當(dāng)先目錄的目錄地址
5、cls:清屏
2.4、基礎(chǔ)命令2
1、session:查看當(dāng)前會(huì)話信息
在這里插入圖片描述
2、reset:重置增強(qiáng)類,將被arthas增強(qiáng)過的類全部還原,arthas服務(wù)端關(guān)閉時(shí)會(huì)重置所有增強(qiáng)過的類
在這里插入圖片描述
在這里插入圖片描述
3、version:輸出當(dāng)前目標(biāo)Java進(jìn)程所加載 的Arthas版本號(hào)
4、quit:退出當(dāng)前Arthas客戶端,其他Arthas客戶端不受影響。
5、stop:關(guān)閉Arthas服務(wù)端,所有Arthas客戶端全部退出。
6、keymap:Arthas快捷鍵列表及自定義快捷鍵
7、history:和linux系統(tǒng)作用一樣 打印命令歷史
3、JVM相關(guān)命令
1、dashboard
在這里插入圖片描述
2、thread 線程相關(guān):查看當(dāng)前jvm的線程堆棧的信息
在這里插入圖片描述
3、jvm 虛擬機(jī)相關(guān)
4、sysprop 系統(tǒng)屬性相關(guān)
5、sysenv:查看當(dāng)前jvm的環(huán)境屬性
在這里插入圖片描述
6、vmoption:查看、更新vm診斷相關(guān)的參數(shù)
7、getstatic:方便的查看類的靜態(tài)屬性
語法:getstatic 類名 屬性名
8、ognl
在這里插入圖片描述
3.1、反編譯 jad
比如編譯string類
–source-only : 只顯示源碼
只反編譯指定的方法
xx 就是方法名
3.2、內(nèi)存編譯mc
內(nèi)存編譯器,編譯.java文件生成.class
在這里插入圖片描述
在這里插入圖片描述
4、Arthas進(jìn)階
4.1、目標(biāo)
類與類加載器
monitor、watch、trace、stack等核心命令的使用
火焰圖的生存
arthas實(shí)戰(zhàn)案例
4.2、dump
將已加載的字節(jié)碼文件保存到特定的目錄下,logs/arthas/classdump/
在這里插入圖片描述
舉例:
在這里插入圖片描述
4.3、classloader
獲取類加載器的信息
作用:
將jvm中所有的classloader的信息統(tǒng)計(jì)出來,并可以展示繼承樹,urls等。
讓指定的classloader去getResources,打印出所有查找到的resources的url。
在這里插入圖片描述
4.4、monitor
監(jiān)控指定類中方法的執(zhí)行情況
作用:
在這里插入圖片描述
在這里插入圖片描述
4.5、watch(重要)
觀察到指定方法的調(diào)用情況
作用:
方法執(zhí)行數(shù)據(jù)觀測(cè),方便觀測(cè)到指定方法的調(diào)用情況
能觀察到的范圍:返回值、拋出異常、入?yún)ⅰMㄟ^編寫OGNL表達(dá)式進(jìn)行對(duì)應(yīng)變量的查看
在這里插入圖片描述
在這里插入圖片描述
只查看第一個(gè)參數(shù)小于0的情況
在這里插入圖片描述
文章知識(shí)點(diǎn)與官方知識(shí)檔案匹配
Java技能樹首頁(yè)概覽
89145 人正在系統(tǒng)學(xué)習(xí)中
打開CSDN,閱讀體驗(yàn)更佳
java應(yīng)用線上診斷神器--Arthas_linyb極客之路的博客
c、保存好/tmp/UserServiceImpl.java之后,使用mc(Memory Compiler)命令來編譯,并且通過–classLoaderClass參數(shù)指定ClassLoader mc--classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader/tmp/UserServiceImpl.java-d/tmp ...
繼續(xù)訪問
java線上診斷工具,Java線上診斷神器Arthas-1_Skogkatt的博客-CSDN...
Arthas 是Alibaba 開源的一款線上診斷工具,相比Java 自帶的jinfo, jmap,jstat 等工具更方便(起碼不用記那么多參數(shù)),而且利用字節(jié)碼增強(qiáng)技術(shù),可以很好的對(duì)線上的問題進(jìn)行定位以及解決,不用再為生產(chǎn)或者測(cè)試環(huán)境無法debug而感到無能為力。...
繼續(xù)訪問
最新發(fā)布 Arthas常用命令
arthas指令大全
繼續(xù)訪問
Arthas在線java進(jìn)程診斷工具 在線調(diào)試神器
Arthas在線java進(jìn)程診斷工具 在線調(diào)試神器 tag: java 診斷 堆棧 在線調(diào)試 耗時(shí) 死鎖 arthas 阿里巴巴 Arthas 是 Alibaba 開源的Java診斷工具,深受開發(fā)者喜愛。 官網(wǎng)文檔: 當(dāng)你遇到以下類似問題而束手無策時(shí),Arthas可以幫助你解決: 這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception? 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯(cuò)了? 遇到問題無法在.
繼續(xù)訪問
Java在線診斷利器之Arthas_Java老K的博客
Arthas是阿里在2019年9月份開源的一款java在線診斷工具,能夠分析、診斷、定位java應(yīng)用問題,例如:jvm信息、線程信息、搜索類中的方法、 跟蹤代碼執(zhí)行、觀測(cè)方法的入?yún)⒑头祷貐?shù)等等。 Arthas最大的特點(diǎn)是能在不修改代碼和不需要重新發(fā)布的...
繼續(xù)訪問
java線上診斷神器 --Arthas__小魚塘的博客_java網(wǎng)絡(luò)診斷
java線上診斷神器 --Arthas 最近在工作中用到的一個(gè)非常很好的線上診斷,分析問題的神器,再次記錄一下: 官方文檔:簡(jiǎn)介 | arthas GitHub 地址:GitHub - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java診斷利器Arthas...
繼續(xù)訪問
Arthas使用教程(8大分類)
1、基礎(chǔ)命令。2、JVM相關(guān)。3、類與類加載器。4、option全局選項(xiàng)。5、項(xiàng)目中使用案例。
繼續(xù)訪問
Arthas介紹
這篇文章為大家推薦一個(gè)為Java應(yīng)用程序排查問題的非常好用的工具:Arthas,首先聲明一下,這邊文章并不是教大家如何使用,它只是一個(gè)搬運(yùn)工,在Arthas的github上已經(jīng)有非常詳細(xì)的使用教程了。 Arthas(阿爾薩斯)是阿里巴巴開源的Java診斷工具,深受開發(fā)者喜愛 當(dāng)你遇到以下類似問題而束手無策時(shí),Arthas統(tǒng)統(tǒng)可以幫你解決 某個(gè)類是從哪個(gè)jar包加載的,為什么會(huì)報(bào)各種類相關(guān)的Exc...
繼續(xù)訪問
Arthas - Java線上診斷工具_(dá)是良辰的博客
java -jar arthas-boot.jar 啟動(dòng)之后就可以看到一個(gè)java程序列表,像我這就是只有一個(gè)java程序在跑,就是當(dāng)前根目錄下面的app.jar 選擇1,即可對(duì)app.jar進(jìn)行監(jiān)控診斷。 PS:如果是虛擬機(jī),直接在應(yīng)用服務(wù)器上面執(zhí)行上面的命令,如果是docke...
繼續(xù)訪問
java線上診斷工具Arthas-實(shí)戰(zhàn)案例_小姐姐修燈泡嗎的博客
首先我就來簡(jiǎn)單介紹下他的作用:(粘貼官網(wǎng))Arthas 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。在線排查問題,無需重啟;動(dòng)態(tài)跟蹤Java代碼;實(shí)時(shí)監(jiān)控JVM狀態(tài)。 Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同時(shí)提供豐富的...
繼續(xù)訪問
arthas 使用教程
arthas安裝使用 首先是安裝,說白了其實(shí)把他當(dāng)成一個(gè)工具來用就行了,你什么服務(wù)需要在線進(jìn)行性能情況的一個(gè)監(jiān)測(cè)和性能的瓶頸排查。第三步啟動(dòng)arthas-boot.jar,啟動(dòng)的時(shí)候要注意你需要監(jiān)測(cè)的java是啟動(dòng)的可以用jps-l命令查看你的java服務(wù)。第二步把jar包上傳到你需要進(jìn)行java性能監(jiān)測(cè)的服務(wù)器上。線上正式環(huán)境把他當(dāng)成一個(gè)排查慢問題的工具還是很好用的。以上就是啟動(dòng)服務(wù)了下面開始介紹常用的一些排查命令。...
繼續(xù)訪問
Arthas
Arthas.md 當(dāng)你遇到以下類似問題而束手無策時(shí),Arthas可以幫助你解決: 這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception? 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯(cuò)了? 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎? 線上遇到某個(gè)用戶的數(shù)據(jù)處理有問題,...
繼續(xù)訪問
Java線上問題診斷工具Arthas_星光Starsray的博客
java -jar arthas-boot.jar //啟動(dòng) 當(dāng)看到控制臺(tái)出現(xiàn)arthas的標(biāo)志,表明啟動(dòng)成功!注意此時(shí)已經(jīng)進(jìn)入控制臺(tái),主要是arthas的命令使用。 [root@xxptweb01 arthas]# java -jar arthas-boot.jar
繼續(xù)訪問
【Java】性能問題診斷利器Arthas --常用命令示例_嘆了口丶?xì)獾牟┛?C...
Arthas 是一款阿里開源的 Java 線上診斷工具,功能強(qiáng)大,可以在不修改代碼或者重啟服務(wù)的情況下快速定位線上問題。 官方文檔:Arthas官網(wǎng) 二、安裝 從官網(wǎng)下載 Arthas 全量包安裝(因?yàn)榭焖侔惭b可能因網(wǎng)絡(luò)原因下載失敗),然后用 java -jar 方...
繼續(xù)訪問
Java診斷工具Arthas使用說明
Arthas 是Alibaba開源的Java診斷工具,Arthas支持JDK 6+,支持Linux/Mac/Windows,支持命令行交互模式、 Tab 自動(dòng)補(bǔ)全功能,方便進(jìn)行問題的定位和診斷。
繼續(xù)訪問
JVM性能調(diào)優(yōu)篇07-阿里巴巴Arthas工具詳解
阿里巴巴Arthas工具詳解
繼續(xù)訪問
Arthas 是Alibaba開源的Java診斷工具
Arthas是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。 當(dāng)你遇到以下類似問題而束手無策時(shí),Arthas可以幫助你解決: 這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception? 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯(cuò)了? 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎? 線上遇到某個(gè)用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)! 是否有一個(gè)全局視角來查看系統(tǒng)的運(yùn)行...
繼續(xù)訪問
JVM之GC 調(diào)優(yōu)工具 Arthas 實(shí)戰(zhàn)使用(二)
Arthas 是 Alibaba 開源的 Java 診斷工具,深受開發(fā)者喜愛。Arthas 支持 JDK 6以上版本,支持 Linux/Mac/Windows,而且這些環(huán)境的命令都一樣,采用命令行交互模式,同時(shí)提供豐富的 Tab 自動(dòng)補(bǔ)全功能,進(jìn)行問題的定位和診斷 官方文檔參考 一、下載和安裝 不需要安裝,就是一個(gè) jar 包 curl -O
繼續(xù)訪問
Arthas詳解
文章目錄概述安裝快速安裝使用`arthas-boot`(官網(wǎng)推薦)使用`as.sh`全量安裝把Arthas安裝到基礎(chǔ)鏡像里卸載使用命令詳解基礎(chǔ)命令helpcatechogrepbase64teepwdclsversionhistorykeymap后臺(tái)異步命令相關(guān)快捷鍵會(huì)話相關(guān)quitstopsessionresetjvm相關(guān)dashboardthreadjvmsyspropsysenvvmoptionperfcounterloggergetstaticognlmbeanheapdumpvmtoolclass
繼續(xù)訪問
Arthas基礎(chǔ)
Arthas:快速入門
繼續(xù)訪問
Arthas入門到精通
Arthas是Alibaba開源的一款Java診斷工具,方便開發(fā)者在線排查問題,無需重啟,同時(shí)可以跟蹤Java代碼,實(shí)時(shí)監(jiān)控JVM狀態(tài),目前Arthas僅支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,具有 Tab 自動(dòng)補(bǔ)全功能,便于開發(fā)者進(jìn)行快速定位和診斷問題。 離線全量下載(如果服務(wù)器沒有外網(wǎng)可以采用這種情況)
繼續(xù)訪問
阿里Java診斷工具 arthas - 介紹及指令大全
一、arthas Arthas` 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。 當(dāng)你遇到以下類似問題而束手無策時(shí),Arthas可以幫助你解決: 這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception? 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯(cuò)了? 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎? 線上遇到某個(gè)用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)! 是否有一個(gè)全局視角來查看系統(tǒng)的運(yùn)行狀況? 有什么辦法可以監(jiān)控到
繼續(xù)訪問
java診斷神器 arthas(阿爾薩斯)
java診斷神器 arthas(阿爾薩斯) 官網(wǎng)地址: 1、快速開始 1.1、windows版本安裝 # 命令行輸入 curl -0 --output arthas-boot.jar # 啟動(dòng)arthas 注意:?jiǎn)?dòng)前已經(jīng)要有java進(jìn)程運(yùn)行,否則無法進(jìn)入 java -jar arthas-boot.jar --telnet-por
繼續(xù)訪問
幫助定位Java方法優(yōu)化之a(chǎn)rthas端口被占用解決的辦法
另起一個(gè)端口號(hào) 啟動(dòng)arthas命令的后面加上端口號(hào)的相關(guān)參數(shù) java -jar arthas-boot.jar --telnet-port 端口號(hào) --http-port -1 關(guān)閉占用端口的服務(wù) 先進(jìn)入占用端口的服務(wù),然后輸入stop將它停掉就可以了 注:請(qǐng)?jiān)倜恳淮问褂弥笫褂胹top命令退出,這樣也省掉一些不必要的麻煩?。。?...
繼續(xù)訪問
Java 診斷工具之 Arthas
Arthas 是 Alibaba 開源的 Java 診斷工具。Ta 可以動(dòng)態(tài)跟蹤 Java 代碼,實(shí)時(shí)監(jiān)控 JVM 狀態(tài),可以在不中斷程序執(zhí)行的情況下輕松完成 JVM 相關(guān)問題排查工作。支持 JDK 6+,支持 Linux/Mac/Windows。
繼續(xù)訪問
Arthas-java在線調(diào)試工具的使用
一、arthas能干什么? 這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception? 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯(cuò)了? 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎? 線上遇到某個(gè)用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)! 是否有一個(gè)全局視角來查看系統(tǒng)的運(yùn)行狀況? 有什么辦法可以監(jiān)控到JVM的實(shí)時(shí)運(yùn)行狀態(tài)? 怎么快速定位應(yīng)用的熱點(diǎn),生成火焰圖? 怎樣直接從JVM內(nèi)查找某個(gè)類的實(shí)例? Arthas支持JDK 6+
繼續(xù)訪問
Java線上診斷工具Arthas
概述 Arthas是一個(gè)開源的線上診斷工具,可以實(shí)時(shí)查看線上代碼運(yùn)行情況,詳情參考Arthas 命令列表 jad命令(獲取已加載類的源碼) //主要用來看已經(jīng)加載了類的源碼,一般用于動(dòng)態(tài)加載的class的源碼比較方便 [arthas@773]$ jad com/example/jvm/Hello ClassLoader: +-sun.misc.Launcher$AppClassLoader@18b4aac2 +-sun.misc.Launcher$ExtClassLoader@362d9..
繼續(xù)訪問
java 線上診斷命令
java
學(xué)習(xí)