SpringMVC - 使用切面打请求返回参数日志 [推荐方案]

继续后端服务系列:

基于AOP统一打请求返回参数日志。

Read More

SpringMVC - web.xml 版本踩坑 [简记]

继续后端服务系列:

不知道从哪抄来的web.xml,遇到奇怪问题折腾半天,原来版本过旧。

当然,版本太新也不行,需要根据 tomcat 或 jetty 的版本来选择 web.xml 的版本。

基本功不扎实就是处处踩坑。

Read More

SpringMVC - 使用 Filter 统一打请求日志

继续后端服务系列:

使用 Filter 统一打日志。Filter 其实来自 javax.servlet.Filter,是在 Servlet 规范中定义的,是 Servlet 容器支持的。

Read More

双十一有感

双十一的本意

中国的会计年度是自然年,《会计法》规定,会计年度自公历1月1日起至12月31日止。11.11 这个时间节点,很难让人不猜测它的本意是为了方便商家会计年度清库存。双十一的始作勇者也正是财会出身。(某里是美国上市公司,会计年度不同,这里说的是平台上广大商家)

另外,对于互联网平台来说,他们需要多搞噱头争流量。

Read More

SpringMVC:配置 Log

继续后端服务系列:

SpringMVC 配置 slf4j + log4j2。

log4j2参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:

  1. 异常处理:在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制。
  2. 性能提升:log4j2相较于log4j 1和logback都具有很明显的性能提升。
  3. 自动重载配置:参考了logback的设计,提供自动刷新参数配置,可以动态的修改日志的级别而不需要重启应用。
  4. 无垃圾机制,log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvm gc。

Read More

Log4j 2, 按级别打印到不同文件

继续后端服务系列:

配置日志,按日志级别分别打印到 info.log, warn.log, error.log 三个文件

log4j2.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30">
<properties>
<property name="baseLogDir">/tmp/logs/webapp</property>
</properties>
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<File name="log" fileName="/tmp/log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${baseLogDir}/info.log"
filePattern="${baseLogDir}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${baseLogDir}/warn.log"
filePattern="${baseLogDir}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${baseLogDir}/error.log"
filePattern="${baseLogDir}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>

参考:
Log4j2最佳实践 https://www.jianshu.com/p/62c0ef1cc699 简书这篇写得很详细,仅供查阅,里面的例子打印不出来。

TODO:
按时间备份日志,参考 https://www.jianshu.com/p/c7ae523f6e82,https://www.jianshu.com/p/37ef7bc6d6eb

markdown 绘制 Mermaid

利用 markdown 绘制 Mermaid

对比 PlantUML(摘抄自网络):

Mermaid 是一个用于画流程图、状态图、时序图、甘特图的库,使用 JS 进行本地渲染,广泛集成于许多 Markdown 编辑器中。

之前用过 PlantUML,但是发现这个东西的实现原理是生成 UML 的图片后上传服务端,每次再从服务端读取,因此觉得不够鲁棒,隐私性也不好,因而弃用。——(编者按:纠正一下,不是图片,而是SVG 可缩放矢量图形。但确实存在上传到plantuml.com,博客生成的图表点开是这个域名)

Mermaid 作为一个使用 JS 渲染的库,生成的不是一个“图片”,而是一段 HTML 代码,因此安全许多。

Read More