Java 如何解析原始日志文件转储并提取相关信息
解析原始日志文件转储并提取相关信息 以下是两个事件的日志文件提取。每个事件由**分隔,如下所示:Java 如何解析原始日志文件转储并提取相关信息,java,logging,Java,Logging,解析原始日志文件转储并提取相关信息 以下是两个事件的日志文件提取。每个事件由**分隔,如下所示: 01/23/13 17:29:25 |-| ***************************************************************** 01/23/13 17:29:25 |-| MTCLPrint: processCodesoftPrintRequest() [-WEB--JU-LBCH-Wed Jan 23 17:29:25 CST 2013]... 01
01/23/13 17:29:25 |-| *****************************************************************
01/23/13 17:29:25 |-| MTCLPrint: processCodesoftPrintRequest() [-WEB--JU-LBCH-Wed Jan 23 17:29:25 CST 2013]...
01/23/13 17:29:25 |-| ==> CS Label: [JU , LBCH , 70005023489 , JU Filtrete UPC0 3 Up Label , JU Filtrete UPC0 Labels 3 up , JUCHIZ01 , Qty: 1100]
01/23/13 17:29:26 |-| TrkgNbr: [-WEB--JU-LBCH-Wed Jan 23 17:29:25 CST 2013] ,CSPid: 5372
01/23/13 17:29:27 |-| Sending print job to -\\JUFP01\JUCHIZ01 [-WEB--JU-LBCH-Wed Jan 23 17:29:25 CST 2013]...
01/23/13 17:29:29 |-| Cannot delete file in temp dir (mergeAndPrint) - P786406707_67724_818342796.prn
01/23/13 17:29:29 |-| MTCLPrint: processCodesoftPrintRequest() [-WEB--JU-LBCH-Wed Jan 23 17:29:25 CST 2013]...complete.
01/23/13 17:29:29 |-| ~~~~ MTCL Print Web Service is terminated. ~~~~
01/23/13 17:29:56 |-| ~~~~ MTCL Print Web Service is started. ~~~~
01/23/13 17:29:56 |-| *****************************************************************
01/23/13 17:29:56 |-| MTCLPrint: processCodesoftPrintRequest() [-WEB--SDL-P1-Wed Jan 23 17:29:56 CST 2013]...
01/23/13 17:29:56 |-| ==> CS Label: [SDL , P1 , 70000437403 , SDL GenericShip.CS7Z170 10-2006 REV , Medina HD Two Part Inter. Label , Z170 Packer , Qty: 1]
01/23/13 17:29:56 |-| TrkgNbr: [-WEB--SDL-P1-Wed Jan 23 17:29:56 CST 2013] ,CSPid: 8840
01/23/13 17:29:58 |-| Sending print job to -\\SPPRT10\SDL-PR-Zebra03 [-WEB--SDL-P1-Wed Jan 23 17:29:56 CST 2013]...
01/23/13 17:29:58 |-| Cannot delete file in temp dir (mergeAndPrint) - P1905794774_98669_986327948.prn
01/23/13 17:29:58 |-| MTCLPrint: processCodesoftPrintRequest() [-WEB--SDL-P1-Wed Jan 23 17:29:56 CST 2013]...complete.
01/23/13 17:29:58 |-| ~~~~ MTCL Print Web Service is terminated. ~~~~
01/23/13 17:30:11 |-| ~~~~ MTCL Print Web Service is started. ~~~~
应用程序日志转储一系列类似的重复日志。我需要解析这个文件,并通过Java程序将其输入MS Excel
以下是我需要从上述原始数据转储中提取的相关数据:
01/23/13 17:29:25 |-| ==> CS Label: [JU , LBCH , 70005023489 , JU Filtrete UPC0 3 Up Label , JU Filtrete UPC0 Labels 3 up , JUCHIZ01 , Qty: 1100]
01/23/13 17:29:56 |-| ==> CS Label: [SDL , P1 , 70000437403 , SDL GenericShip.CS7Z170 10-2006 REV , Medina HD Two Part Inter. Label , Z170 Packer , Qty: 1]
原始数据总是以“CS Label:”开头,后跟“[”,然后有7个字段用逗号分隔。我需要将这7个字段提取到excel工作表中的列中。实现这一点的最有效方法是什么?我看到了以下算法:
CS标签
字符串,则对其进行处理(否则放弃)String
方法)public class DateFunctions {
// Date related Logic
private Date startDate;
private Integer delta;
@SuppressWarnings("resource")
public DateFunctions() {
// ApplicationContext ctx = new
// ClassPathXmlApplicationContext("date-properties.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext(
"c:\\logAnalyzer\\date-properties.xml");
// Initializing date related data from spring configuration file
startDate = (Date) ctx.getBean("startDate");
delta = (Integer) ctx.getBean("delta");
}
public boolean isTimeDiffAcceptable(Date logDate) {
DateTime dt1, dt2;
Integer minutesDiff;
dt1 = new DateTime(logDate);
dt2 = new DateTime(startDate);
int daysDiff = Days.daysBetween(dt1, dt2).getDays();
if (daysDiff == 0) {
minutesDiff = dt1.getMinuteOfDay() - dt2.getMinuteOfDay();
} else {
minutesDiff = 0;
}
// System.out.println("minutesDiff : " + minutesDiff);
// System.out.println("delta : " + delta);
if (minutesDiff < 0 && (-1 * minutesDiff) < delta) {
return true;
} else {
return false;
}
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Integer getDelta() {
return delta;
}
public void setDelta(Integer delta) {
this.delta = delta;
}
}
公共类函数{
//日期相关逻辑
私人日期开始日期;
私有整数增量;
@抑制警告(“资源”)
公共日期函数(){
//ApplicationContext ctx=新建
//ClassPathXmlApplicationContext(“date properties.xml”);
ApplicationContext ctx=新文件系统XMLApplicationContext(
“c:\\logAnalyzer\\date properties.xml”);
//从spring配置文件初始化日期相关数据
startDate=(日期)ctx.getBean(“startDate”);
delta=(整数)ctx.getBean(“delta”);
}
公共布尔值可接受(日期日志日期){
日期时间dt1,dt2;
整数分差;
dt1=新的日期时间(logDate);
dt2=新的日期时间(startDate);
int daysDiff=Days.daysBetween(dt1,dt2).getDays();
如果(daysDiff==0){
minutesDiff=dt1.getMinuteOfDay()-dt2.getMinuteOfDay();
}否则{
分钟差=0;
}
//System.out.println(“minutesDiff:+minutesDiff”);
//System.out.println(“delta:+delta”);
如果(分钟差<0&(-1*分钟差)
然后,format log方法将允许您将日志放入excel工作表中
public class FormatLog {
private String searchRequiredString, searchStartString, searchEndString;
private String regex, line;
private Integer lengthStartStr, lengthEndStr;
private File inputFile;
private Integer rowNum, colNum;
private HSSFCell cell;
private String[] ary;
private Logger log;
// Initializing data in constructor
public FormatLog() {
// initializing the logger for log4j
log = Logger.getLogger(FormatLog.class);
@SuppressWarnings("resource")
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"spring.xml");
// Initializing search String related parameters
searchRequiredString = (String) ctx.getBean("searchRequiredString");
searchStartString = (String) ctx.getBean("searchStartString");
searchEndString = (String) ctx.getBean("searchEndString");
regex = (String) ctx.getBean("regex");
// Initializing the Log Input File
inputFile = (File) ctx.getBean("inputFile");
// Computing some start parameters
lengthStartStr = searchStartString.length();
lengthEndStr = searchEndString.length();
// Row Number initialized to -1
rowNum = -1;
}
/*
* Input: None Output: Integer rowNum - number of rows processed.
*/
@SuppressWarnings({ "resource", "deprecation" })
public Integer stringManipulation() {
// setting header text
String[] headerText = { "Date", "Facility Name", "Work Center",
"ID Nbr", "Preference", "Format", "Printer Name", "Qty" };
DateFunctions df = new DateFunctions();
try {
FileOutputStream fileOut = new FileOutputStream(
"c:\\logAnalyzer\\FormattedLogsELC.xls");
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet worksheet = workbook.createSheet("ELC Log Worksheet - "
+ df.getStartDate().toString());
BufferedReader br = new BufferedReader(new FileReader(inputFile));
while ((line = br.readLine()) != null) {
// Create the StringBuilder
StringBuilder builder = new StringBuilder(line);
Integer indexRequired = builder.indexOf(searchRequiredString);
if (indexRequired > 0) {
String date = builder.subSequence(1, 17).toString();
log.debug(date);
Date logDate = new Date(date);
if (df.isTimeDiffAcceptable(logDate)) {
log.debug(builder.toString());
Integer indexStart = builder.indexOf(searchStartString);
Integer indexEnd = builder.indexOf(searchEndString);
String s = builder.subSequence(
indexStart + lengthStartStr,
indexEnd - lengthEndStr + 1).toString();
// adding date to the string s
s = date + "," + s;
log.debug(s);
ary = s.split(regex);
if (ary.length != headerText.length) {
log.warn("Review row number : " + rowNum
+ ". Unexpected data was found");
}
// incrementing RowNumber for workbook calculation.
rowNum++;
if (rowNum == 0) {
log.info("Setting Header Text");
ary = headerText;
}
log.info("Row Number: " + rowNum
+ " extracted for time : " + date);
// Create a new wb row.
HSSFRow row = worksheet.createRow(rowNum);
for (colNum = 0; colNum < ary.length; colNum++) {
ary[colNum] = ary[colNum].trim();
log.debug(ary[colNum]);
cell = row.createCell(colNum);
cell.setCellValue(ary[colNum]);
}// end for
}// end if timeDiff
}// end if indexRequired
} // while
// write to workbook and close it
workbook.write(fileOut);
fileOut.flush();
fileOut.close();
} catch (FileNotFoundException e) {
log.error(e);
} catch (IOException e) {
log.error(e);
}
if (rowNum < 0) {
log.warn("No rows were written to the excel file.");
log.warn("Application Logs provided may be out of the Wily alert window if no exception was thrown.");
} else {
log.info("Success");
}
// Returns the rows processed
return rowNum;
}
}
公共类格式化日志{
私有字符串searchRequiredString、searchStartString、searchEndString;
私有字符串正则表达式,行;
专用整数lengthStartStr、LengthDSTR;
私有文件输入文件;
私有整数rowNum,colNum;
专用HSSFCell单元;
私有字符串[]元;
私人日志记录器;
//在构造函数中初始化数据
公共格式化日志(){
//初始化log4j的记录器
log=Logger.getLogger(FormatLog.class);
@抑制警告(“资源”)
ApplicationContext ctx=新类路径XmlApplicationContext(
“spring.xml”);
//初始化搜索字符串相关参数
searchRequiredString=(String)ctx.getBean(“searchRequiredString”);
searchStartString=(String)ctx.getBean(“searchStartString”);
searchEndString=(String)ctx.getBean(“searchEndString”);
regex=(字符串)ctx.getBean(“regex”);
//正在初始化日志输入文件
inputFile=(File)ctx.getBean(“inputFile”);
//计算一些起动参数
lengthStartStr=searchStartString.length();
LengthDSTR=searchEndString.length();
//行号已初始化为-1
rowNum=-1;
}
/*
*输入:无输出:整数rowNum-处理的行数。
*/
@SuppressWarnings({“资源”、“弃用”})
公共整数字符串处理(){
//设置标题文本
字符串[]headerText={“日期”、“设施名称”、“工作中心”,
“ID编号”、“首选项”、“格式”、“打印机名称”、“数量”};
DateFunctions df=新的DateFunctions();
试一试{
FileOutputStream fileOut=新的FileOutputStream(
“c:\\logAnalyzer\\FormattedLogsELC.xls”);
HSSFWorkbook=新的HSSFWorkbook();
HSSFSheet工作表=工作簿.createSheet(“ELC日志工作表-
+df.getStartDate().toString());
BufferedReader br=新的BufferedReader(新文件读取器(inputFile));
而((line=br.readLine())!=null){
//创建StringBuilder
StringBuilder=新的StringBuilder(线);
整数indexRequired=builder.indexOf(searchRequiredString);
如果(indexRequired>0){
字符串日期=builder.subSequence(1,17).toString();
log.debug(日期);
日期日志日期=新日期(日期);
if(df.isTimeDiffAcceptable(日志日期)){
log.debug(builder.toString());
整数indexStart=builder.indexOf(searchStartString);
整数indexEnd=builder.indexOf(searchEndString);
字符串s=builder.subSequence(
indexStart+lengthStartStr,
indexEnd-lengthDSTR+1).toString();
//将日期添加到字符串s
s=日期+“,”+s;
日志调试;
ary=s.split(正则表达式);
如果(ary.length!=标题文本