笔者是一个爱折腾的人,本着对软件开发的热爱,都要尝试一番:
- 导入pom依赖文件,笔者这里是用的Spring boot版本控制这里就不写版本号了;
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-logging
org.slf4j
slf4j-api
org.slf4j
slf4j-log4j12
- 写入配置文件:
log4j.rootLogger=DEBUG,stdout,HTML
#控制台输出日志
log4j.additivity.org.apache=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold=INFO
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n
#打印html的log文件
log4j.appender.HTML = org.apache.log4j.DailyRollingFileAppender
log4j.appender.HTML.File=${user.dir}/fileService/log4j/log.html
log4j.appender.HTML.DatePattern='.'yyyy-MM-dd-a
log4j.appender.HTML.encoding=UTF-8
#这里注意: 写的是html的配置class全路径
log4j.appender.HTML.layout =com.rubik.merchant.config.HTMLLogFormatLayOut
log4j.appender.HTML.Threshold=INFO
- 配置html的格式类,这个全类名要写入上方的配置文件中的
import org.apache.log4j.HTMLLayout;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.helpers.Transform;
import org.apache.log4j.spi.LoggingEvent;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
@Component
public class HTMLLogFormatLayOut extends HTMLLayout {
public HTMLLogFormatLayOut() {
}
protected final int BUF_SIZE = 256;
protected final int MAX_CAPACITY = 1024;
static String TRACE_PREFIX = "
";
private StringBuffer sbuf = new StringBuffer(BUF_SIZE);
public static final String TITLE_OPTION = "Title";
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 + "" + Layout.LINE_SEP);
sbuf.append("");
sbuf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new java.util.Date()));
sbuf.append(" " + Layout.LINE_SEP);
sbuf.append("");
if (event.getLevel().equals(Level.FATAL)) {
sbuf.append("");
sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
sbuf.append("");
} else if (event.getLevel().isGreaterOrEqual(Level.WARN)) {
sbuf.append("");
sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
sbuf.append("");
} else {
sbuf.append("");
sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
sbuf.append("");
}
sbuf.append(" " + Layout.LINE_SEP);
String content = Transform.escapeTags(event.getRenderedMessage());
if (content.contains("|")) {
String[] temp = content.split("\|");
sbuf.append("");
sbuf.append(temp[0]);
sbuf.append(" " + Layout.LINE_SEP);
} else {
sbuf.append("");
sbuf.append(content);
sbuf.append(" " + Layout.LINE_SEP);
}
sbuf.append(" " + Layout.LINE_SEP);
if (event.getNDC() != null) {
sbuf.append("");
sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));
sbuf.append(" " + Layout.LINE_SEP);
}
String[] s = event.getThrowableStrRep();
if (s != null) {
sbuf.append("");
appendThrowableAsHTML(s, sbuf);
sbuf.append(" " + Layout.LINE_SEP);
}
return sbuf.toString();
}
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() {
// 日志文件 的头
String title = "日志文件";
// 日志文件 表格的 头
StringBuffer sbuf = new StringBuffer();
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("");
sbuf.append("" + title + " " + Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("body, table {font-family: 'Courier New',arial,sans-serif; font-size: 13px;}"
+ Layout.LINE_SEP);
sbuf.append("th {background: #336699; color: #FFFFFF; text-align: center;}"
+ Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append(""
+ Layout.LINE_SEP);
sbuf.append(""
+ Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("时间 " + Layout.LINE_SEP);
sbuf.append("日志级别 " + Layout.LINE_SEP);
sbuf.append("类型 " + Layout.LINE_SEP);
sbuf.append(" " + Layout.LINE_SEP);
sbuf.append("
" + Layout.LINE_SEP);
return sbuf.toString();
}
}
设置tomcat资源映射:
- 这个类要么不写,写了映射就要统一放行,包括static目录如下所示:
- 文件映射一般我会写在工作目录下,用 {user.dir}获取绝对路径,这里工作目录可以填写绝对路径;
- 这里的 file:为本地静态资源的映射路径,设置后此路径文件可以服务器访问,log的html文件要配置在这里
@Configuration
@Slf4j
public class WebMvcConfig implements WebMvcConfigurer {
// 实现静态资源的映射
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/meta-INF/resources/") // 映射swagger2
.addResourceLocations("file:/这里是工作目录/") // 映射本地静态资源
.addResourceLocations("classpath:/resources/")
.addResourceLocations("classpath:/static/");
}
}
如果你用了权限类的框架记得给配置的映射路径放行
笔者用的spring security放行如下:
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/swagger-ui.html","/webjars/**","/v2/**","/swagger-resources/**","/doc.html","/file/**","/images/**","/log4j/**");
}
那么我们启动项目测试一下吧:
- 正常启动后:在工作目录中,生成了log日志
我们可以看到日志被正常访问了,你学废了吗;
Java相关栏目本月热门文章
- 1【Linux驱动开发】设备树详解(二)设备树语法详解
- 2别跟客户扯细节
- 3Springboot+RabbitMQ+ACK机制(生产方确认(全局、局部)、消费方确认)、知识盲区
- 4【Java】对象处理流(ObjectOutputStream和ObjectInputStream)
- 5【分页】常见两种SpringBoot项目中分页技巧
- 6一文带你搞懂OAuth2.0
- 7我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:虚拟机与Java虚拟机介绍
- 8【Spring Cloud】新闻头条微服务项目:FreeMarker模板引擎实现文章静态页面生成
- 9JavaSE - 封装、static成员和内部类
- 10树莓派mjpg-streamer实现监控及拍照功能调试
- 11用c++写一个蓝屏代码
- 12从JDK8源码中看ArrayList和LinkedList的区别
- 13idea 1、报错java: 找不到符号 符号: 变量 log 2、转换成Maven项目
- 14在openwrt使用C语言增加ubus接口(包含C uci操作)
- 15Spring 解决循环依赖
- 16SpringMVC——基于MVC架构的Spring框架
- 17Andy‘s First Dictionary C++ STL set应用
- 18动态内存管理
- 19我的创作纪念日
- 20Docker自定义镜像-Dockerfile
热门相关搜索
路由器设置
木托盘
宝塔面板
儿童python教程
心情低落
朋友圈
vim
双一流学科
专升本
我的学校
日记学校
西点培训学校
汽修学校
情书
化妆学校
塔沟武校
异形模板
西南大学排名
最精辟人生短句
6步教你追回被骗的钱
南昌大学排名
清朝十二帝
北京印刷学院排名
北方工业大学排名
北京航空航天大学排名
首都经济贸易大学排名
中国传媒大学排名
首都师范大学排名
中国地质大学(北京)排名
北京信息科技大学排名
中央民族大学排名
北京舞蹈学院排名
北京电影学院排名
中国戏曲学院排名
河北政法职业学院排名
河北经贸大学排名
天津中德应用技术大学排名
天津医学高等专科学校排名
天津美术学院排名
天津音乐学院排名
天津工业大学排名
北京工业大学耿丹学院排名
北京警察学院排名
天津科技大学排名
北京邮电大学(宏福校区)排名
北京网络职业学院排名
北京大学医学部排名
河北科技大学排名
河北地质大学排名
河北体育学院排名



