是开源的日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库等。本节主要讲述如何将日志信息打印到文件,并将不同的信息打印到不同的文件中。
用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@@电脑设定、电器电装、刹车升级、动力重改、增压系统、外观升级、日常保养、赛车改装、避震设定、内外饰品、胎铃升级、车身强化、进气排气、音响升级@@
具体的日志例子意义并不大,大家可以尝试一下,很简单,但非常实用。
下一篇我们讲一下如何将日志写入数据库。