这段时间公司要自己写一个巡检项目,就每次不用自己去巡检,放在服务器上,用rundeck设置定时任务跑着就行,之后每日查看日志信息。
日志要求是按照自定义列去生成excel文档。
网上资料有限,学习之后记录一下,希望能帮到有需要的人。
首先是maven配置,在pom.xml添加这些:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
log4j配置 这配置比较简单易懂:
log4j.rootLogger = INFO,D
### 输出INFO 级别以上的日志文件设置 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File =/sgmw/runJars/log/sparkInspectionAll.xlsx//生成表格格式
log4j.appender.D.Append = true
log4j.appender.D.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = com.bw.FormatHTMLLayout//自定义格式类的路径和类名
log4j.appender.D.Encoding=UTF-8
FormatHTMLLayout类,自定义格式类:
package com.llz.dailyInspection;
import org.apache.log4j.HTMLLayout;
import org.apache.log4j.Layout;
import org.apache.log4j.helpers.Transform;
import org.apache.log4j.spi.LoggingEvent;
public class FormatHTMLLayout extends HTMLLayout {
public FormatHTMLLayout() {
}
protected final int BUF_SIZE = 256;
protected final int MAX_CAPACITY = 1024;
static String TRACE_PREFIX = "<br> ";
private StringBuffer sbuf = new StringBuffer(BUF_SIZE);
String title="日志";
/**
* A string constant used in naming the option for setting the the HTML
* document title. Current value of this string constant is <b>Title</b>.
*/
public static final String TITLE_OPTION = "Title";
// Print no location info by default
boolean locationInfo = true;
public String format(LoggingEvent event) {
if (sbuf.capacity() > MAX_CAPACITY) {
sbuf = new StringBuffer(BUF_SIZE);
} else {
sbuf.setLength(0);
}
sbuf.append(Layout.LINE_SEP + "<tr style=\"text-align:left\"> " + Layout.LINE_SEP);
sbuf.append("</td>" + Layout.LINE_SEP);
/* 日志内容 */
String content = Transform.escapeTags(event.getRenderedMessage());
//这里content就是logger.inf("")里面的内容 并且已经用下划线 "|"分开各个字段 下面我会具体写
if (content.contains("|")) {
String[] temp = content.split("\\|");
sbuf.append("<td title='列1'>");
sbuf.append(temp[0]);
sbuf.append("</td>" + Layout.LINE_SEP);
sbuf.append("<td title='列2'>");
sbuf.append(temp[1]);
sbuf.append("</td>" + Layout.LINE_SEP);
sbuf.append("<td title='列3'>");
sbuf.append(temp[2]);
sbuf.append("</td>" + Layout.LINE_SEP);
}
sbuf.append("</tr>" + Layout.LINE_SEP);
if (event.getNDC() != null) {
sbuf.append("<tr><td bgcolor=\"#EEEEEE\" style=\"font-size : xx-small;\" colspan=\"6\" title=\"Nested Diagnostic Context\">");
sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));
sbuf.append("</td></tr>" + Layout.LINE_SEP);
}
String[] s = event.getThrowableStrRep();
if (s != null) {
sbuf.append("<tr><td bgcolor=\"#66CDAA\" style=\"color:White; font-size : xx-small;\" colspan=\"6\">");
appendThrowableAsHTML(s, sbuf);
sbuf.append("</td></tr>" + Layout.LINE_SEP);
}
return sbuf.toString();
}
/**
* 生成HTML
* @param s
* @param sbuf
*/
private void appendThrowableAsHTML(String[] s, StringBuffer sbuf) {
if (s != null) {
int len = s.length;
if (len == 0)
return;
sbuf.append(Transform.escapeTags(s[0]));
sbuf.append(Layout.LINE_SEP);
for (int i = 1; i < len; i++) {
sbuf.append(TRACE_PREFIX);
sbuf.append(Transform.escapeTags(s[i]));
sbuf.append(Layout.LINE_SEP);
}
}
}
/**
* 返回的日志文件头
*/
public String getHeader() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">" + Layout.LINE_SEP);
sbuf.append("<html>" + Layout.LINE_SEP);
sbuf.append("<head>" + Layout.LINE_SEP);
sbuf.append("<title>" + title + "</title>" + Layout.LINE_SEP);
sbuf.append("<style type=\"text/css\">" + Layout.LINE_SEP);
sbuf.append("<!--" + Layout.LINE_SEP);
sbuf.append("body, table {font-family: '??',arial,sans-serif; font-size: 12px;}" + Layout.LINE_SEP);
sbuf.append("th {background: #336699; color: #FFFFFF; }" + Layout.LINE_SEP);
sbuf.append("-->" + Layout.LINE_SEP);
sbuf.append("</style>" + Layout.LINE_SEP);
sbuf.append("</head>" + Layout.LINE_SEP);
sbuf.append("<body bgcolor=\"#CCE8CFRGB\" topmargin=\"6\" leftmargin=\"6\">" + Layout.LINE_SEP);
sbuf.append("<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\" bordercolor=\"#224466\" width=\"100%\">" + Layout.LINE_SEP);
sbuf.append("<tr> "+Layout.LINE_SEP);
sbuf.append("<th>列1</th>" + Layout.LINE_SEP);
sbuf.append("<th>列2</th>" + Layout.LINE_SEP);
sbuf.append("<th>列3</th>" + Layout.LINE_SEP);
return sbuf.toString();
}
}
然后再你需要生成日志的类里写:
public class SparkInspection {
protected static final Logger logger = Logger.getLogger(SparkInspection.class);
/*
业务处理
*/
logger.info("列1"+" | "+"列2"+" | "+列3+ "); //用"|"分开 再在格式化类里面判断列
}
整体流程代码就这样 自己弄明白之后稍微记录一下 方便以后使用。
最后提供一个表格排版和I修改文档样式思路,这本是个html表格格式,可以先把文档格式改为.log或者是.html,用浏览器打开,再在浏览器修改想要的格式,修改好了记下改的东西,再在格式类里面相印位置做修改就方便很多。
如有不正确的地方 恳请指正