分析ngnix日志文件的开发程序记录
package com.school.statistics;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.RandomAccessFile;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.school.dao.CourseContentMapper;
import com.school.dao.StatisticsDurationCuMapper;
import com.school.dao.StatisticsDurationMapper;
import com.school.domain.CourseContent;
import com.school.domain.CourseContentJson;
import com.school.domain.CourseContentJson.Lecture;
import com.school.domain.CourseContentJson.Section;
import com.school.domain.StatisticsDuration;
import com.school.domain.StatisticsDurationCu;
public class AnalysisDurationLogs implements Runnable {
private static ApplicationContext applicationContext = null;
public static StatisticsDurationMapper statisticsDurationMapper;// 明细统计
public static StatisticsDurationCuMapper statisticsDurationCuMapper;// 根据课程统计
public static CourseContentMapper courseContentMapper;// 课时内容
public static Integer sleepTime = 1 * 60 * 1000;// 时间(多少时间执行一次)
public static String logFilePath = "/data/nginx/logs/vlms_access.log";
public static String seekFilePath = "/data/nginx/logs/";
// 构造函数
public AnalysisDurationLogs() {
if (applicationContext == null) {
applicationContext = new ClassPathXmlApplicationContext(new String[] { "applicationContext-resources.xml",
"classpath:applicationContext-dao.xml" });
}
statisticsDurationMapper = (StatisticsDurationMapper) applicationContext.getBean("statisticsDurationMapper");
statisticsDurationCuMapper = (StatisticsDurationCuMapper) applicationContext
.getBean("statisticsDurationCuMapper");
courseContentMapper = (CourseContentMapper) applicationContext.getBean("courseContentMapper");
}
// 实现run方法
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
try {
startFunction(sleepTime);// 启动10秒执行一次
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
System.out.println("-------统计分析----------");
AnalysisDurationLogs a1 = new AnalysisDurationLogs();
Thread t1 = new Thread(a1);
t1.start();
// startFunction();
}
/**
* 取出读取标记,进行文件读取分析-记录读取标记
*/
private static void startFunction(int stopTime) throws IOException, FileNotFoundException {
while (true) {
try {
Thread.sleep(stopTime);
int row = 0;
System.out.println("--------------------------------kai----------------------------------");
System.out.println("---------------------------------------------------------------------");
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String datefile = sdf.format(new Date());
String lineMarkFilePath = seekFilePath + datefile + "seek.txt";
File file = new File(lineMarkFilePath);
if (!file.exists()) {
file.createNewFile();
}
BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream(lineMarkFilePath)));
String rowStr = null;
if ((rowStr = bufr.readLine()) != null) {
if (StringUtils.isNotBlank(rowStr) || "".equals(rowStr)) {
// row=Integer.valueOf(rowStr).intValue();
row = Integer.parseInt(rowStr.trim());
// row = bufr.read();
}
}
bufr.close();
System.out.println("--------r1--------" + row);
// 每隔10秒去分析一下日志文件
Integer markline = getLogs(row);
// FileOutputStream(lineMarkFilePath,false)//false为覆盖文本,true为追加文本
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(lineMarkFilePath,
false), "UTF-8"));
System.out.println("--------r2--------" + markline);
String lineStr = null;
lineStr = markline.toString();
if ((lineStr) != null) {
bufw.write(lineStr);
// bufw.newLine();///换行
bufw.flush();// 刷新
}
bufw.close();
// 筛选数据
System.out.println("--------综合表--------");
selectDurationData();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 打开分析nginx文件
*/
public static int getLogs(Integer row) throws FileNotFoundException, IOException {
RandomAccessFile raf = new RandomAccessFile(logFilePath, "rw");
raf.seek(row);// 移动文件指针位置
String line = null;
int i = row;
Map<String, StatisticsDuration> map = new HashMap<String, StatisticsDuration>();
while ((line = raf.readLine()) != null) {
// i++;
// System.out.println("----count------"+line);
Pattern p = Pattern.compile("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
Matcher m = p.matcher(line);
String ipv4 = "";
if (m.find()) {
// 找到ipv4//使用if而不使用while母的是只找第一个就结束寻找,因为ip放在前面,
ipv4 = m.group();
// System.out.println("get-----" +m.group());
}
String timeStr = "";
timeStr = line.substring(line.indexOf("[") + 1, line.lastIndexOf("]"));
String time = "";
Pattern pt = Pattern.compile("(\\d{2})/([^&]*)/\\d{4}:\\d{2}:\\d{2}:\\d{2}");
Matcher mt = pt.matcher(timeStr);
while (mt.find()) {
// 找到时间串
time = mt.group();
SimpleDateFormat sdf = new SimpleDateFormat("d/MMM/yyyy:K:m:s", Locale.ENGLISH);
SimpleDateFormat sdfnew = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d2 = null;
try {
d2 = sdf.parse(time.trim());
} catch (ParseException e) {
e.printStackTrace();
}
time = sdfnew.format(d2);
}
i = (int) raf.getFilePointer();// 记录当前读取位置
// 获取参数
String pid = getParameterRex(line, "pid");
String schoolID = getParameterRex(line, "schoolID");
String courseID = getParameterRex(line, "courseID");
String lectureID = getParameterRex(line, "lectureID");
// String sectionID=getParameterRex(line, "sectionID");//参数正则获取法
String sectionID = getSectionId(lectureID, 2);// 截取获取法(基于传过来的参数不正确)
String userID = getParameterRex(line, "userID");
String duration = getParameterRex(line, "duration");
String Browser = getParameterRex(line, "Browser");
String terminal = getParameterRex(line, "terminal");
System.out.println(i + "---t---" + time + "---ip---" + ipv4 + "---pid----" + pid + "----s---" + schoolID
+ "---c---" + courseID + "---s---" + sectionID + "---l---" + lectureID + "---u---" + userID
+ "---b---" + Browser + "---t---terminal+----d----" + duration);
StatisticsDuration statisticsDuration = new StatisticsDuration();
if (StringUtils.isNotBlank(pid.trim())) {
statisticsDuration.setPid(pid);
statisticsDuration.setSchoolId(schoolID);
statisticsDuration.setCourseId(courseID);
statisticsDuration.setSectionId(sectionID);
statisticsDuration.setLectureId(lectureID);
statisticsDuration.setUserId(userID);
statisticsDuration.setIpv4(ipv4);
if (StringUtils.isNotBlank(duration.trim())) {
statisticsDuration.setDuration(Integer.parseInt(duration.trim()));
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = sdf.parse(time);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
statisticsDuration.setDateEnd(date);
statisticsDuration.setBrowser(Browser);
statisticsDuration.setTerminal(terminal);
map.put(pid, statisticsDuration);// 存进map集合
}
}
raf.close();
// 调用存进数据库
System.out.println("-------insert明细表--------");
insertData(map);
map.clear();
return i;
}
/**
* 存进数据库 //入库操作
*/
private static void insertData(Map<String, StatisticsDuration> map) {
if (map.size() > 0) {
Set<String> keyi = map.keySet();
java.util.Iterator<String> it = keyi.iterator();
while (it.hasNext()) {
String key = it.next();
// System.out.println(dbv.getPid());
StatisticsDuration statisticsDuration = map.get(key);
StatisticsDuration selectSD = statisticsDurationMapper.selectByPrimaryKey(statisticsDuration.getPid());// /查询是否存在
if (selectSD != null) {
// 理论上不会执行
statisticsDurationMapper.updateByPrimaryKeySelective(statisticsDuration);// 更新操作
} else {
statisticsDurationMapper.insertSelective(statisticsDuration);// 入库操作
}
}
}
}
/**
* 提取请求里的参数
*/
public static String getParameterRex(String str, String name) {
String rex = "(?:^|\\?|&)" + name + "=([^&]*)(?:&|$)";
Pattern p = Pattern.compile(rex);
Matcher m = p.matcher(str);
String param = "";
while (m.find()) {
// 找到相应的参数
param = m.group();
// System.out.println("value-----" +m.group());
if (StringUtils.isNotBlank(param)) {
try {
param = param.substring(param.indexOf("=") + 1, param.lastIndexOf("&"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
param = "";
}
}
}
return param;
}
/**
* 从lectureId里截取sectionId
*/
private static String getSectionId(String lectureId, int index) {
try {
String[] ss = lectureId.split("\\.");
StringBuffer sb = new StringBuffer();
String result = "";
for (int i = 0; i < 2; i++) {
sb.append(ss[i]).append(".");
}
result = sb.toString();
result = result.substring(0, result.length() - 2);
return result;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
/**
* 筛选数据统计
*/
public static void selectDurationData() {
// 今天的日期
// SimpleDateFormat sdfOne = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdfTwo = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
String today = sdfTwo.format(new Date());
// System.out.println("--------------"+today);
// 明天的日期
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, 1);
Date date = calendar.getTime();
String tomorrow = sdfTwo.format(date);
// System.out.println("------m-------"+tomorrow);
// 筛选当天的数据(根据传过去的时间),筛选明细表的数据,去插入综合表
List<StatisticsDurationCu> list = statisticsDurationMapper.selectDurationCu(today, tomorrow);
// System.out.println("------zzzsi------"+list.size());
if (list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
String schoolId = list.get(i).getSchoolId();
String courseId = list.get(i).getCourseId();
String lectureId = list.get(i).getLectureId();
String userId = list.get(i).getUserId();
String sectionId = list.get(i).getSectionId();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
String onlyDate = sdf.format(list.get(i).getDate());
String sectionTitle = "";
String lectureTitle = "";
boolean insertMark = false;// 预防lecture_id不存在的情况,存在可以insert
// 获取章节标题、与课时标题
// CourseContentExample exampleC = new CourseContentExample();
// exampleC.createCriteria().andSchoolIdEqualTo(schoolId).andCourseIdEqualTo(courseId);
// List<CourseContent> courseContentList = courseContentMapper.selectByExample(exampleC);
CourseContent courseContent = courseContentMapper.selectByPrimaryKey(courseId);
if (courseContent != null) {
CourseContentJson ccj = courseContent.getCourseContentJson();
List<Section> sections = ccj.getSections();// 获取章节列表
if (sections.size() > 0) {
// 遍历章节
for (int j = 0; j < sections.size(); j++) {
if (insertMark) {
break;// 找到了课时title就没必要继续遍历其他的section
}
Section s = sections.get(j);
System.out.println("------secIdccc-------" + s.getSectionId());
// 因为拖动排序,没有章节概念,所以找课时标题,只能从所有的章节去找
List<Lecture> lecList = sections.get(j).getLectures();// 获取到课时列表
if (lecList.size() > 0) {
for (int k = 0; k < lecList.size(); k++) {
if (lectureId.equals(lecList.get(k).getLectureId())) {
sectionTitle = sections.get(j).getTitle();// 找到不一定是所需要的章节,并获取章节的标题
lectureTitle = lecList.get(k).getTitle();
insertMark = true;
System.out.print("-------找到le-------" + lectureTitle);
break;
}
}
System.out.println("--------lecList结束--------");
}
}
}
}
// /insertMark为true表示在课程内容表(course_content)存在相应的lecture_id,
if (insertMark) {
// 先去查询,该记录存不存在
List<StatisticsDurationCu> sdcu = statisticsDurationCuMapper.selectExistDurationCu(onlyDate,
schoolId, courseId, userId, lectureId);
if (sdcu.size() > 0) {
// 存在该条数据,去更新该条数据
StatisticsDurationCu statisticsDurationCu = sdcu.get(0);
float durationS = list.get(i).getDuration();
float durationH = durationS / 3600;
statisticsDurationCu.setDuration(durationH);// 新的时长替换旧的时长
statisticsDurationCu.setCount(list.get(i).getCount());
statisticsDurationCu.setSectionTitle(sectionTitle);
statisticsDurationCu.setLectureTitle(lectureTitle);
// 根据Id是唯一的,去更新时长、次数
statisticsDurationCuMapper.updateDurationCountToday(statisticsDurationCu);
System.out.println("-----updatezzzzz---------");
} else {
// 不存在该条数据,
StatisticsDurationCu sdc = new StatisticsDurationCu();
sdc = list.get(i);
float durationS = sdc.getDuration();
float durationH = durationS / 3600;
sdc.setDuration(durationH);
sdc.setSectionTitle(sectionTitle);
sdc.setLectureTitle(lectureTitle);
statisticsDurationCuMapper.insertSelective(sdc);
System.out.println("-----insertzzzz---------");
}
}
}
}
}
}
遇到故障重新找数据(根据时间)
package com.school.statistics;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.school.dao.CourseContentMapper;
import com.school.dao.StatisticsDurationCuMapper;
import com.school.dao.StatisticsDurationMapper;
import com.school.domain.CourseContent;
import com.school.domain.CourseContentJson;
import com.school.domain.CourseContentJson.Lecture;
import com.school.domain.CourseContentJson.Section;
import com.school.domain.StatisticsDurationCu;
/**
* 遇到故障了,根据传过来的日期去筛选数据,insert到综合表
*/
public class FailureAndInsert {
private static ApplicationContext applicationContext = null;
public static StatisticsDurationMapper statisticsDurationMapper;// 明细统计
public static StatisticsDurationCuMapper statisticsDurationCuMapper;// 根据课程统计
public static CourseContentMapper courseContentMapper;// 课时内容
public static String breakDate = "2014-10-10 00:00:00";// 故障日期
// 构造函数
public FailureAndInsert() {
}
public static void main(String[] args) {
BreakDownInsert(breakDate);
System.out.println("-------------------程序运行结束可以终止------------------------------");
}
/**
* 遇到故障了,根据传过来的日期去筛选数据,insert到综合表
*/
public static void BreakDownInsert(String breakDate) {
if (applicationContext == null) {
applicationContext = new ClassPathXmlApplicationContext(new String[] { "applicationContext-resources.xml",
"applicationContext-business.xml", "classpath:applicationContext-dao.xml" });
}
statisticsDurationMapper = (StatisticsDurationMapper) applicationContext.getBean("statisticsDurationMapper");
statisticsDurationCuMapper = (StatisticsDurationCuMapper) applicationContext
.getBean("statisticsDurationCuMapper");
courseContentMapper = (CourseContentMapper) applicationContext.getBean("courseContentMapper");
// 今天的日期
// SimpleDateFormat sdfOne = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdfTwo = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
Date todayStr = null;
try {
todayStr = sdfTwo.parse(breakDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String today = sdfTwo.format(todayStr);
System.out.println("------t--------" + today);
// 明天的日期
Calendar calendar = Calendar.getInstance();
calendar.setTime(todayStr);
int day = calendar.get(Calendar.DATE);
calendar.set(Calendar.DATE, day + 1);
String tomorrow = new SimpleDateFormat("yyyy-MM-dd 00:00:00").format(calendar.getTime());
System.out.println("------m-------" + tomorrow);
// 筛选当天的数据(根据传过去的时间),筛选明细表的数据,去插入综合表
List<StatisticsDurationCu> list = statisticsDurationMapper.selectDurationCu(today, tomorrow);
System.out.println("------zzzsi------" + list.size());
if (list.size() > 0) {
for (Integer i = 0; i < list.size(); i++) {
String schoolId = list.get(i).getSchoolId();
String courseId = list.get(i).getCourseId();
String lectureId = list.get(i).getLectureId();
String userId = list.get(i).getUserId();
String sectionId = list.get(i).getSectionId();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
String onlyDate = sdf.format(list.get(i).getDate());
String sectionTitle = "";
String lectureTitle = "";
boolean insertMark = false;// 预防lecture_id不存在的情况,存在可以insert
System.out.print("-----m-------" + i);
System.out.print("-----secid-------" + sectionId);
System.out.println("-----lecid-------" + lectureId);
// 获取章节标题、与课时标题
// CourseContentExample exampleC = new CourseContentExample();
// exampleC.createCriteria().andSchoolIdEqualTo(schoolId).andCourseIdEqualTo(courseId);
// List<CourseContent> courseContentList = courseContentMapper.selectByExample(exampleC);
CourseContent courseContent = courseContentMapper.selectByPrimaryKey(courseId);
if (courseContent != null) {
CourseContentJson ccj = courseContent.getCourseContentJson();
List<Section> sections = ccj.getSections();// 获取章节列表
if (sections.size() > 0) {
// 遍历章节
for (int j = 0; j < sections.size(); j++) {
if (insertMark) {
break;// 找到了课时title就没必要继续遍历其他的section
}
Section s = sections.get(j);
System.out.println("------secIdccc-------" + s.getSectionId());
// 因为拖动排序,没有章节概念,所以找课时标题,只能从所有的章节去找
List<Lecture> lecList = sections.get(j).getLectures();// 获取到课时列表
if (lecList.size() > 0) {
for (int k = 0; k < lecList.size(); k++) {
if (lectureId.equals(lecList.get(k).getLectureId())) {
sectionTitle = sections.get(j).getTitle();// 找到不一定是所需要的章节,并获取章节的标题
lectureTitle = lecList.get(k).getTitle();
insertMark = true;
System.out.print("-------le找到-------" + lectureTitle);
break;
}
}
System.out.println("--------lecList结束--------");
}
}
}
}
// ///--end
System.out.println("---only------" + onlyDate);
// /insertMark为true表示在课程内容表(course_content)存在相应的lecture_id,
if (insertMark) {
// 先去查询,该记录存不存在
List<StatisticsDurationCu> sdcu = statisticsDurationCuMapper.selectExistDurationCu(onlyDate,
schoolId, courseId, userId, lectureId);
if (sdcu.size() > 0) {
// 存在该条数据,去更新该条数据
StatisticsDurationCu statisticsDurationCu = sdcu.get(0);
float durationS = list.get(i).getDuration();
float durationH = durationS / 3600;
statisticsDurationCu.setDuration(durationH);// 新的时长替换旧的时长
statisticsDurationCu.setCount(list.get(i).getCount());
statisticsDurationCu.setSectionTitle(sectionTitle);
statisticsDurationCu.setLectureTitle(lectureTitle);
// 根据Id是唯一的,去更新时长、次数
statisticsDurationCuMapper.updateDurationCountToday(statisticsDurationCu);
System.out.println("-----updatezzzzz---------");
} else {
// 不存在该条数据,
StatisticsDurationCu sdc = new StatisticsDurationCu();
sdc = list.get(i);
float durationS = sdc.getDuration();
float durationH = durationS / 3600;
sdc.setDuration(durationH);
sdc.setSectionTitle(sectionTitle);
sdc.setLectureTitle(lectureTitle);
statisticsDurationCuMapper.insertSelective(sdc);
System.out.println("-----insertzzzz---------");
}
}
}
}
}
}
package com.school.statistics;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.school.dao.StatisticsDurationCuMapper;
import com.school.dao.StatisticsDurationMapper;
import com.school.domain.StatisticsDurationExample;
/*
* 删除明细表的数据
*/
public class DeleteDetailData {
private static ApplicationContext applicationContext = null;
public static StatisticsDurationMapper statisticsDurationMapper;// 明细统计
public static StatisticsDurationCuMapper statisticsDurationCuMapper;// 根据课程统计
public static String breakDate = "2012-09-18 00:00:00";// 故障日期
// 构造函数
public DeleteDetailData() {
}
public static void main(String[] args) {
deleteData(breakDate);
}
/**
* 删除明细表的数据
*/
public static void deleteData(String breakDate) {
if (applicationContext == null) {
applicationContext = new ClassPathXmlApplicationContext(new String[] { "applicationContext-resources.xml",
"classpath:applicationContext-dao.xml" });
}
statisticsDurationMapper = (StatisticsDurationMapper) applicationContext.getBean("statisticsDurationMapper");
statisticsDurationCuMapper = (StatisticsDurationCuMapper) applicationContext
.getBean("statisticsDurationCuMapper");
// 把用户输入的日期转成 java 日期类
DateFormat df = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
Date deleteTime = null;
try {
deleteTime = df.parse(breakDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 删除小于这个时间的记录---明细表
StatisticsDurationExample example = new StatisticsDurationExample();
example.createCriteria().andDateEndLessThanOrEqualTo(deleteTime);
statisticsDurationMapper.deleteByExample(example);
}
}