log4j(一) 生成日誌檔案
用log4j將日誌寫入資料庫主要用到是log4j包下的JDBCAppender類,它提供了將日誌資訊非同步寫入資料的功能,我們可以直接使用這個類將我們的日誌資訊寫入資料庫;也可以擴充套件JDBCAppender類,就是將JDBCAppender類作為基類。下面將通過一個例項來講解log4j是如何獲取日誌資訊的。
我們的目標是獲取日誌資訊,並將其中不同的內容列印到兩個日誌檔案中。
首先,我們先在配置檔案中配置一下,只需要配置log4j.properties即可。
log4j.rootLogger=info,A0,A1 #info,A0 #log4j.logger.stdout=info,A0 log4j.logger.mylogger=info,A0 //將日誌級別為Info的資訊寫入日誌檔案 log4j.additivity.mylogger=false log4j.additivity.A1=false //不允許將此資訊寫入A1檔案 log4j.appender.A0=org.apache.log4j.DailyRollingFileAppender log4j.appender.A0.File=logs/datuu-search-info.log <span style="font-family: Arial;">//日誌檔案1的路徑</span> log4j.appender.A0.DatePattern='_'yyyy-MM-dd log4j.appender.A0.layout=org.apache.log4j.PatternLayout log4j.appender.A0.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c - %m%n log4j.logger.mylogger1=info,A1 //同上 log4j.additivity.mylogger1=false log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=logs/ring-not-search.log //日誌檔案2的路徑 log4j.appender.A1.DatePattern='_'yyyy-MM-dd log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c - %m%n
上面的配置除了路徑和需要列印的日誌級別外,別的都不必改,直接用就可以。
下面我們我們在程式碼中定義並列印日誌:
/** * @author Y * */ public class ModiautoParserImpl implements _Parser { private static Logger logger = Logger.getLogger("mylogger"); private static Logger logger1 = Logger.getLogger("mylogger1"); private static final Pattern RECORDS_NO = Pattern.compile("[0-9,]+", Pattern.CASE_INSENSITIVE); private static final Pattern PAGE_NO = Pattern.compile("[0-9]+[^\\]0-9]{1}", Pattern.CASE_INSENSITIVE); LoadHttpResource loadHttpResource = new LoadHttpResource();//http資源載入元件 private static final String charSet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public SimplePage parse(String htmlContent, String[] str) throws IOException, ConfigurationException, URISyntaxException { logger.info("****** ModiautoParserImpl start ****** "); htmlContent = htmlContent.replaceAll(" ", ""); Source htmlSource = new Source(htmlContent.subSequence(0, htmlContent.length())); List divList = htmlSource.findAllElements(HTMLElementName.DIV); //找到所有DIV節點下的項 //遍歷DIV集合,取出其下的所有項的資訊 for (Object pE : divList) { Element province = (Element) pE; //找出省資訊 if (province.getAttributeValue("class") != null && province.getAttributeValue("class").equalsIgnoreCase("province") ) { //找出各省地址和每省數量 List ulList = province.findAllElements(HTMLElementName.A); for (Object uO : ulList) { Element u = (Element) uO; String url = "http://shop.modiauto.com.cn" + u.getAttributeValue("href");//每個省汽車資訊頁對應的網路地址 String provinceNameStr = u.extractText(); //文字提取器 String provinceName = provinceNameStr.substring(0, provinceNameStr.indexOf("(")); String number = provinceNameStr.substring(provinceNameStr.indexOf("(") + 1, provinceNameStr.indexOf(")")); //解析當前頁的汽車改裝資訊 parserProvinceAutoInfo(url, provinceName, Integer.parseInt(number)); } break; } } System.out.println("資訊提取完成"); return null; } /** 解析當前省對應的各頁汽車改裝資訊 * @param url * @param provinceName * @param total */ private void parserProvinceAutoInfo(String url, String provinceName, int total) { // logger.info("---parser autoinfo start----" + provinceName + " --" + total); double pageNo = total/8 + 1; //每頁8條,共pageNo頁 int times = (int) Math.ceil(pageNo); //頁數取整 for (int i = 1; i <= times; i++) { if (i<=10) { url = url.substring(0,url.indexOf(".html")-1); //形如:http://shop.modiauto.com.cn/list_p_20_ }else{ url = url.substring(0,url.indexOf(".html")-2); } String changedUrl =url+i+".html"; //形如:http://shop.modiauto.com.cn/list_p_20_1.html parserProvincePage(changedUrl, provinceName); url=changedUrl; } } //具體解析 private int parserProvincePage(String url, String provinceName) { List<SearchResultVO> resultList = new ArrayList<SearchResultVO>(); String htmlContent = null; try { htmlContent = loadHttpResource.loadTextResource(url); Source htmlSource = new Source(htmlContent.subSequence(0, htmlContent.length())); List ulList = htmlSource.findAllElements(HTMLElementName.UL); for (Object uO : ulList) { Element u = (Element) uO; //找到一條記錄,每個class-“part"包含該頁面下所有的li標籤,即,該頁所有的商家 if (u.getAttributeValue("class") != null && u.getAttributeValue("class").equalsIgnoreCase("parts")) { SearchResultVO searchResultVO = new SearchResultVO(); List divList = u.findAllElements(HTMLElementName.DIV); for (Object div1 : divList) { Element dStoreInfo = (Element) div1; //店圖片地址,獲取所有class="left"的img if (dStoreInfo.getAttributeValue("class") != null && dStoreInfo.getAttributeValue("class").equalsIgnoreCase("left")) { List imageList = dStoreInfo.findAllElements(HTMLElementName.IMG); if(imageList!=null&&imageList.size()>0) { Element element = (Element)imageList.get(0); String imageUrl = element.getAttributeValue("src"); if (imageUrl=="" && imageUrl.length()==0 ) { imageUrl="null"; } searchResultVO.setUrl(imageUrl); logger.info("店圖片地址-------------------"+imageUrl); } } if(dStoreInfo.getAttributeValue("class")!=null && dStoreInfo.getAttributeValue("class").equalsIgnoreCase("right")){ //店地址 List addrAndTypeList = dStoreInfo.findAllElements(HTMLElementName.P); if (addrAndTypeList != null && addrAndTypeList.size()>0) { Element element = (Element) addrAndTypeList.get(2); String addrStr = element.extractText(); String address = addrStr.substring(4); if (address=="" && address.length()==0 ) { address="null"; } searchResultVO.setAddress(address); logger.info("商家地址-------------------"+address); } //維修型別 if (addrAndTypeList != null && addrAndTypeList.size()>0) { Element element = (Element) addrAndTypeList.get(3); List imgList = element.findAllElements(HTMLElementName.IMG); String repairType=""; for (int i = 0; i < imgList.size(); i++) { Element elementImg = (Element)imgList.get(i); String imageUrl = elementImg.getAttributeValue("src"); if (imageUrl.equals("http://static.modiauto.com.cn/png/201307/a0374156-1619-43ee-9f7c-56bef46f0f46.png")) { repairType+="電腦設定、"; }else if (imageUrl.equals("http://static.modiauto.com.cn/png/201307/c1f8374e-4be1-45e0-b2a2-9d45b9a93fe2.png")) { repairType+="電器電裝、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/2897a918-7b8f-4481-893e-70d29968ad3f.png")){ repairType+="剎車升級、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/b42c8822-1249-49c6-8333-8cf91e916619.png")){ repairType+="動力重改、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/f7532b8e-3196-4549-a174-32a84bd8f28a.png")){ repairType+="增壓系統、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/eafbaf13-7ce3-4896-9bba-719ba3b4c357.png")){ repairType+="外觀升級、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/48d986bb-529d-4234-9907-ac4a45e75614.png")){ repairType+="日常保養、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/e75c243e-a98f-4d0a-a9a2-78444d0eb0df.png")){ repairType+="賽車改裝、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/6f471b17-c95c-4256-9fbd-d11eb9956843.png")){ repairType+="避震設定、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/445409bd-8950-4cca-b918-3103ea492eca.png")){ repairType+="內外飾品、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/108b69fe-c46c-497d-9f0e-1d77c747bd29.png")){ repairType+="胎鈴升級、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/35ac81bd-0e36-430e-8abe-1f842aa418de.png")){ repairType+="車身強化、"; }else if(imageUrl.equals("http://static.modiauto.com.cn/png/201307/4118dee4-aba7-40b6-b023-3f0541b8cb5b.png")){ repairType+="進氣排氣、"; }else{ repairType+="音響升級"; } } if (repairType=="" && repairType.length()==0 ) { repairType="null"; } searchResultVO.setRepairType(repairType); logger.info("維修型別:" + repairType); } } //class="left_a"下,所有企業名稱的標籤 if (dStoreInfo.getAttributeValue("class") != null && dStoreInfo.getAttributeValue("class").equalsIgnoreCase("left_a")){ //店名稱 List nameList = dStoreInfo.findAllElements(HTMLElementName.FONT); String nameStr=""; if (nameList != null && nameList.size()>0) { Element element = (Element) nameList.get(0); nameStr = element.getTextExtractor().toString().trim(); if (nameStr=="" && nameStr.length()==0 ) { nameStr="null"; } } searchResultVO.setName(nameStr); logger.info("商家名字-------------------"+nameStr); //店電話 List pTelList = dStoreInfo.findAllElements(HTMLElementName.P); String telNumber = ""; if (pTelList != null && pTelList.size()>0) { Element element = (Element) pTelList.get(1); String telStr = element.extractText(); telNumber = telStr.substring(5); if (telNumber=="" && telNumber.length()==0 ) { telNumber="null"; } } searchResultVO.setTelephone(telNumber); logger.info("商家電話-------------------"+telNumber); //String result = "@@"+"province:"+provinceName+"@@"+"name:"+searchResultVO.getName()+"@@"+"logoUrl:"+searchResultVO.getUrl()+"@@"+"address:"+searchResultVO.getAddress()+"@@"+"telephone:"+searchResultVO.getTelephone()+"@@"+"repairType:"+searchResultVO.getRepairType(); String result = "@@"+provinceName+"@@"+searchResultVO.getName()+"@@"+searchResultVO.getUrl()+"@@"+searchResultVO.getAddress()+"@@"+searchResultVO.getTelephone()+"@@"+searchResultVO.getRepairType()+"@@"; logger1.info(result); String urlString =searchResultVO.getUrl(); if (urlString.substring(0,4).equals("http")) { urlString=searchResultVO.getUrl(); }else{ urlString="http://shop.modiauto.com.cn" + searchResultVO.getUrl(); } String fileName=provinceName + " " + searchResultVO.getName()+".jpg"; // download(urlString, fileName,"e:\\image\\"); } } } } } catch (Exception e) { logger.info("Exception is loading url " + url, e); } return 0; }
這裡我們就把logger的資訊和logger1的資訊分別列印在不同的日誌檔案中了,這樣對我們日後系統出現問題的記錄是至關重要的。
下面是一部分日誌內容:
2015-12-17 15:14:15,149 INFO com.datuu.common.http.InternetBridge - ********http.useragent**Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
2015-12-17 15:14:15,178 INFO com.datuu.common.http.HttpClientTimerTask - HttpClientTimerTask strat up ok!!!!
2015-12-17 15:14:15,223 INFO com.datuu.common.http.InternetBridge - url_matcher end used:6 ms,handler=null
2015-12-17 15:14:15,763 WARN org.apache.commons.httpclient.HttpMethodBase - Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.
2015-12-17 15:14:16,424 INFO com.datuu.search.proxy.parser.Parser - --=====parserName========-com.datuu.search.proxy.parser.impl.ModiautoParserImpl
2015-12-17 15:14:16,424 INFO com.datuu.search.proxy.parser.Parser - bbbbbbbbb parsers.get(parserName) == null
2015-12-17 15:14:16,426 INFO com.datuu.search.proxy.parser.Parser - ccccccccccc parserClass = class com.datuu.search.proxy.parser.impl.ModiautoParserImpl
2015-12-17 15:14:16,426 INFO com.datuu.search.proxy.parser.Parser - ccccccccccc parsers.put(parserName, parserClass); end
2015-12-17 15:14:16,427 INFO com.datuu.search.proxy.parser.Parser - false
2015-12-17 15:14:16,427 INFO com.datuu.search.proxy.parser.Parser - 1111111before search : keyword=; pageSize =
2015-12-17 15:14:16,428 INFO com.datuu.search.proxy.parser.Parser - 2222222String[] str = [Ljava.lang.String;@3fee9989
2015-12-17 15:14:16,575 INFO com.datuu.common.http.InternetBridge - url_matcher end used:3 ms,handler=null
2015-12-17 15:14:16,734 WARN org.apache.commons.httpclient.HttpMethodBase - Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.
2015-12-17 15:14:16,961 INFO mylogger1 - @@安徽@@無敵車改@@http://static.modiauto.com.cn/jpg/201509/[email protected]@合肥市瑤海區北二環與銅林北路交叉口中信銀行向西50米無敵汽車改裝俱樂部@@[email protected]@電腦設定、電器電裝、剎車升級、動力重改、增壓系統、外觀升級、日常保養、賽車改裝、避震設定、內外飾品、胎鈴升級、車身強化、進氣排氣、音響升級@@
2015-12-17 15:14:16,963 INFO mylogger1 - @@安徽@@普弗曼斯[email protected]@http://static.modiauto.com.cn/jpg/201410/[email protected]@包河區北京路與花園大道交口包河汽車用品基地8棟01-02號@@[email protected]@電腦設定、電器電裝、剎車升級、動力重改、增壓系統、外觀升級、日常保養、賽車改裝、避震設定、胎鈴升級、車身強化、進氣排氣、@@
2015-12-17 15:14:16,965 INFO mylogger1 - @@安徽@@合肥巔峰競技汽車改裝@@http://static.modiauto.com.cn/jpg/201309/[email protected]@合肥市瑤海區鳳台路利港銀河新城27棟商業110號@@0551-65673128,[email protected]@電腦設定、電器電裝、剎車升級、動力重改、增壓系統、外觀升級、日常保養、賽車改裝、避震設定、胎鈴升級、車身強化、進氣排氣、@@
2015-12-17 15:14:16,967 INFO mylogger1 - @@安徽@@FZ汽車機車俱樂部@@http://static.modiauto.com.cn/jpg/201406/[email protected]@新站區龍門嶺路與物流大道交叉口@@[email protected]@電腦設定、電器電裝、剎車升級、動力重改、增壓系統、外觀升級、日常保養、賽車改裝、避震設定、內外飾品、胎鈴升級、車身強化、進氣排氣、音響升級@@
2015-12-17 15:14:16,969 INFO mylogger1 - @@安徽@@彭彭車改@@http://static.modiauto.com.cn/jpg/201407/[email protected]@合肥市廬陽區阜陽北路與汲橋路交叉口,汲橋路57號@@[email protected]@電器電裝、剎車升級、動力重改、增壓系統、外觀升級、日常保養、賽車改裝、避震設定、內外飾品、胎鈴升級、車身強化、進氣排氣、音響升級@@
2015-12-17 15:14:16,971 INFO mylogger1 - @@安徽@@合肥MCC潮車@@http://static.modiauto.com.cn/jpg/201501/[email protected]@北二環與蘆嶺路交口巴黎春天門面@@0551-65558881,,[email protected]@電腦設定、電器電裝、剎車升級、動力重改、增壓系統、外觀升級、日常保養、賽車改裝、避震設定、內外飾品、胎鈴升級、車身強化、進氣排氣、音響升級@@
具體的日誌例子意義並不大,大家可以嘗試一下,很簡單,但非常實用。
下一篇我們講一下如何將日誌寫入資料庫。
相關推薦
log4j(一) 生成日誌檔案
log4j是開源的日誌記錄專案,我們不僅可以對輸出的日誌的格式自定義,還可以自己定義日誌輸出的目的地,比如:螢幕,文字檔案,資料庫等。本節主要講述如何將日誌資訊列印到檔案,並將不同的資訊列印到不同的檔案中。 用log4j將日誌寫入資料庫主要用
(轉)log4j(一)——為什麽要用log4j?
控制 clas 姓名 private 開發環境 負責人 getname 麻煩 方法名 1 試驗環境 OS:win7 JDK:jdk7 Log4j:1.2.17(好尷尬,原本是想試驗下log4j2的,結果陰差陽錯用了這個版本,不過幸好,試驗也不白試驗,試驗的作用是一樣的
IO流的應用(一):實現檔案的複製
package com.bjpowernode.demo03; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** 使用FileReader/FileW
Vue原始碼分析(一):入口檔案
Vue原始碼分析(一):入口檔案 首先開啟命令列,從github下載原始碼,下載到自己的工作目錄。 git clone https://github.com/vuejs/vue.git 這裡我下載的是2.5.17版本的,vue 原始碼是由各種模組用 rollup 工具
跨平臺方法(一):獲取檔案大小(引數為檔案url)
在一些實際的專案中,我們需要去計算某目錄下的某個檔案的大小,從而繼續後續的業務; 如下的方法是各個平臺通用的方法,簡潔實用,已經驗證和測試過: #include <stdint.h> #include <stdio.h> #include <stdlib.h
常用工具類(一):FileUtile 檔案相關操作
常用工具類(一):FileUtile 檔案相關操作 public class FileUtil { private static final Logger logger = LoggerFactory.getLogger(FileUtils.class); //讀取檔案
JPEG影象密寫研究(一) JPEG影象檔案結構
【轉載】轉載自http://www.cnblogs.com/leaven/archive/2010/04/06/1705846.html JPEG壓縮編碼演算法的主要計算步驟如下: (0) 8*8分塊。 (1) 正向離散餘弦變換(FDCT)。 (2) 量化(q
【Qt】通過QtCreator原始碼學習Qt(一):pro檔案
1、學習目的 學習pro檔案的語法規則,這在跨平臺專案中會經常用到。和條件編譯相似,在pro中可以根據平臺選擇不同的編譯模組、檔案,還可以向原始碼中傳遞變數等。 2、學習方法 通過學習QtCreator原始碼中的pro檔案,來掌握pro檔案語法規則,下面以qtcreator.
PowerDesigner使用(一):PDM檔案匯入Oracle資料庫
PDM檔案匯入不同資料庫的過程基本相同,這裡以Oracle資料庫為例,詳解匯入的具體步驟。所使用的匯入軟體PowerDesigner版本為16.5。 配置儲存連線 載入PDM檔案 點選工具欄"Database",選擇"Configure Connections"。
工廠三兄弟之工廠方法模式(一):日誌記錄器的設計
簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影響已有程式碼?工廠方法模式應運而生,本文將介紹第二種工廠模式——
工廠方法模式-Factory Method Pattern 工廠三兄弟之工廠方法模式(一):日誌記錄器的設計
簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影
Spring Boot 基礎( 一 ) YAML配置檔案詳解
Spring Boot 使用一個全域性的配置檔案,配置檔名是固定的 application.properties / application.yml 配置檔案的作用:修改Spr
Retrofit2+RxJava學習小計(一):單檔案、多檔案上傳之填平的坑
從Eclipse轉戰AndroidStudio已經有兩個月了。先誇誇Google親兒子的強大吧,各種方便就不一一道來了。主要是現在的Android陣營已經不想前兩年了。各種開源框架開源庫。也正是如此,AndroidStudio匯入開源的專案非常方便。自從Goog
15 | 答疑文章(一):日誌和索引相關問題
來吧 增加 class 唯一性 在操作 簡單的 我希望 系統 數字 在今天這篇答疑文章更新前,MySQL實戰這個專欄已經更新了14篇。在這些文章中,大家在評論區留下了很多高質量的留言。現在,每篇文章的評論區都有熱心的同學幫忙總結文章知識點,也有不少同學提出了很多高質量的問題
根檔案製作(一):根檔案系統樹 和 Initramfs檔案系統的製作
根檔案系統樹製作 首先要明白的是“什麼是檔案系統”,檔案系統是對一個儲存裝置上的資料和元資料進行組織的機制。 這種機制有利於使用者和作業系統的互動。 根檔案系統之所以在前面加一個”根“,說明它是載入其它檔案系統的”根“,既然是根的話,那麼如果沒有這個根,其它的檔案
【Tomcat】Tomcat原始碼解讀系列(一)——server.xml檔案的配置
Tomcat是JEE開發人員最常用到的開發工具,在Java Web應用的除錯開發和實際部署中,我們都可以看到Tomcat的影子。大多數時候,我們可以將Tomcat當做一個黑盒來看待,只需要將編寫的Java Web工程進行部署即可,但是,在遇到一些比較複雜難解決的問題時
複習之MyBatis基礎用法(一)——XML對映檔案
簡介 什麼是 MyBatis ? MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 程式碼和手工設定引數以及抽取結果集。MyBatis 使用簡單的 XML 或註解來配置和對映基本體,將介面和
PostgreSQL9.6+PostGIS2.3學習筆記(一)匯入shp檔案
一. 建庫以及準備工作:(使用pgAdmin4直接建庫) 開啟pgAdmin4,如下圖所示create–>Database 輸入database的名字,如下圖,輸入完成即可選擇save進行
MATLAB學習筆記(一)開啟csv檔案並使用列資料繪圖
1、將.csv檔案直接拖到MatLab的控制檯區域,MatLab會直接開啟.csv檔案,就像EXCEL開啟.csv一樣MatLab會對每一列資料賦給一個列名稱,預設值為:VarName1、VarName2、VarName3......2、雙擊列標題,將列名稱修改為資料的標題,