是开源的日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库等。本节主要讲述如何将日志信息打印到文件,并将不同的信息打印到不同的文件中。

        用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/f6f9928c-1ace-41fb-a256-b667cf2ff0b7_180x120.jpg@@合肥市瑶海区北二环与铜林北路交叉口中信银行向西50米无敌汽车改装俱乐部@@18655112911@@电脑设定、电器电装、刹车升级、动力重改、增压系统、外观升级、日常保养、赛车改装、避震设定、内外饰品、胎铃升级、车身强化、进气排气、音响升级@@
  2015-12-17 15:14:16,963  INFO mylogger1 - @@安徽@@普弗曼斯-PC@@http://static.modiauto.com.cn/jpg/201410/d98780ad-9762-4022-90cb-0e180a80ba99_180x120.jpg@@包河区北京路与花园大道交口包河汽车用品基地8栋01-02号@@13866118820@@电脑设定、电器电装、刹车升级、动力重改、增压系统、外观升级、日常保养、赛车改装、避震设定、胎铃升级、车身强化、进气排气、@@
  2015-12-17 15:14:16,965  INFO mylogger1 - @@安徽@@合肥巅峰竞技汽车改装@@http://static.modiauto.com.cn/jpg/201309/8b12dbb4-d047-4575-b0f9-7fe598cf220a_180x120.jpg@@合肥市瑶海区凤台路利港银河新城27栋商业110号@@0551-65673128,13349116771@@电脑设定、电器电装、刹车升级、动力重改、增压系统、外观升级、日常保养、赛车改装、避震设定、胎铃升级、车身强化、进气排气、@@
  2015-12-17 15:14:16,967  INFO mylogger1 - @@安徽@@FZ汽车机车俱乐部@@http://static.modiauto.com.cn/jpg/201406/34cd8f71-8b6a-4d2f-a9a1-1e79456459ec_180x120.jpg@@新站区龙门岭路与物流大道交叉口@@13956989123@@电脑设定、电器电装、刹车升级、动力重改、增压系统、外观升级、日常保养、赛车改装、避震设定、内外饰品、胎铃升级、车身强化、进气排气、音响升级@@
  2015-12-17 15:14:16,969  INFO mylogger1 - @@安徽@@彭彭车改@@http://static.modiauto.com.cn/jpg/201407/9b01885d-fb33-4c82-b31c-1d86ca083871_180x120.jpg@@合肥市庐阳区阜阳北路与汲桥路交叉口,汲桥路57号@@13966783333@@电器电装、刹车升级、动力重改、增压系统、外观升级、日常保养、赛车改装、避震设定、内外饰品、胎铃升级、车身强化、进气排气、音响升级@@
  2015-12-17 15:14:16,971  INFO mylogger1 - @@安徽@@合肥MCC潮车@@http://static.modiauto.com.cn/jpg/201501/6a262f16-7953-4988-a665-86738abe7e63_180x120.jpg@@北二环与芦岭路交口巴黎春天门面@@0551-65558881,,18656980808@@电脑设定、电器电装、刹车升级、动力重改、增压系统、外观升级、日常保养、赛车改装、避震设定、内外饰品、胎铃升级、车身强化、进气排气、音响升级@@

        具体的日志例子意义并不大,大家可以尝试一下,很简单,但非常实用。

        下一篇我们讲一下如何将日志写入数据库。