文章目录
前言
1 日志级别
哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮
有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。
官网:https://www.couragesteak.com/
ALL 最低等级的,用于打开所有日志记录。
TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。
DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示
ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
OFF 最高等级的,用于关闭所有日志记录。
2 使用logback记录日志
2.1 Maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2.2 application.yml
server:
port: 8080
logging:
config: classpath:log/logback.xml
2.3 logback.xml配置文件
/resources/logback.xml
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %p (%file:%line\)- %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="fileLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>log/file/fileLog.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>log/file/fileLog.log.%d.%i</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>64 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>
%d %p (%file:%line\)- %m%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="sqlFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>log/sql/sqlFile.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>log/sql/sqlFile.log.%d.%i</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>64 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>
%d %p (%file:%line\)- %m%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="errorFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>log/error/errorFile.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>log/error/errorFile.%d.log.%i</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>64 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>
%d %p (%file:%line\)- %m%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="INFO">
<appender-ref ref="fileLog" />
<appender-ref ref="console" />
<appender-ref ref="errorFile" />
</root>
<logger name="com.dolphin.mapper" level="DEBUG" additivity="false">
<appender-ref ref="console" />
<appender-ref ref="sqlFile" />
</logger>
</configuration>
2.4 Java后端
package com.couragesteak.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.logging.Logger;
@RestController
@Slf4j
public class MyIndex {
@RequestMapping("/getInfo")
public String getInfo(String name, int age) {
log.info("===============");
log.info("name: {}, age: {}", name, age);
return name;
}
}
2.5 lombok
如果idea没有状lombok插件,则需要再类中添加如下代码,才能使用此日志功能。
private static Logger log = Logger.getLogger(String.valueOf(MyIndex.class));

3 使用 log4j 记录日志
机制:如果一条日志信息的级别 >= 配置文件的级别,就记录。
trace:追踪,就是程序推进一下,可以写个trace输出
debug:调试,一般作为最低级别,trace基本不用。
info:输出重要的信息,使用较多
warn:警告,有些信息不是错误信息,但也要给程序员一些提示。
error:错误信息。用的也很多。
fatal:致命错误。
输出源
CONSOLE(输出到控制台)
FILE(输出到文件)
格式
SimpleLayout:以简单的形式显示
HTMLLayout:以HTML表格显示
PatternLayout:自定义形式显示
3.1 log4j 配置文件
log4j.properties
#log4j.rootLogger=CONSOLE,info,error,DEBUG
log4j.rootLogger=DEBUG,error,CONSOLE,info
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = info
log4j.appender.info.append=true
log4j.appender.info.File=E:/code/log/info.log
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = error
log4j.appender.error.append=true
log4j.appender.error.File=E:/code/log/error.log
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold = DEBUG
log4j.appender.DEBUG.append=true
log4j.appender.DEBUG.File=E:/code/log/dubug.log
3.2 Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
3.3 application.yml
server:
port: 8083
logging:
config: classpath:log4j.properties
3.4 Java
private static final Logger log = Logger.getLogger(String.valueOf(MyIndex.class));
4 使用AOP统一处理 web 请求日志
在方法前后实现拦截,减少代码打印日志代码冗余。
4.1 Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
4.2 拦截日志类WebLogAspect.java
package com.couragesteak.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
@Aspect
@Component
@Slf4j
public class WebLogAspect {
@Pointcut("execution(public * com.couragesteak.controller.*.*(..))")
public void webLog() {
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
log.info("URL : " + request.getRequestURL().toString());
log.info("HTTP_METHOD : " + request.getMethod());
log.info("IP : " + request.getRemoteAddr());
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = (String) enu.nextElement();
log.info("name:{},value:{}", name, request.getParameter(name));
}
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
log.info("RESPONSE : " + ret);
}
}

原文地址:https://www.couragesteak.com/article/293
<p><h3>文章目录</h3><ul><ul><li><a href="#_2">前言</a></li><li><a href="#1__4">1 日志级别</a></li><li><a href="#2_logback_28">2 使用logback记录日志</a></li><ul><li><a href="#21_Maven_30">2.1 Maven依赖</a></li><li><a href="#22_applicationyml_40">2.2 application.yml</a></li><li><a href="#23_logbackxml_51">2.3 logback.xml配置文件</a></li><li><a href="#24_Java_162">2.4 Java后端</a></li><li><a href="#25_lombok_197">2.5 lombok</a></li></ul><li><a href="#3__log4j__207">3 使用 log4j 记录日志</a></li><ul><li><a href="#31_log4j__225">3.1 log4j 配置文件</a></li><li><a href="#32_Maven_264">3.2 Maven依赖</a></li><li><a href="#33_applicationyml_293">3.3 application.yml</a></li><li><a href="#34_Java_304">3.4 Java</a></li></ul><li><a href="#4_AOP_web__310">4 使用AOP统一处理 web 请求日志</a></li><ul><li><a href="#41_Maven_314">4.1 Maven依赖</a></li><li><a href="#42_WebLogAspectjava_323">4.2 拦截日志类WebLogAspect.java</a></li></ul></ul></ul></p>
<h2><a id="_2"></a>前言</h2>
<h2><a id="1__4"></a>1 日志级别</h2>
<p><font face="楷体,华文行楷,隶书,黑体" color="red" size="4"><strong>哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮</strong></font></p>
<p><font face="楷体,华文行楷,隶书,黑体" color="blue" size="4"><strong>有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。</strong></font></p>
<p>官网:<a href="https://www.couragesteak.com/" target="_blank">https://www.couragesteak.com/</a></p>
<p>ALL 最低等级的,用于打开所有日志记录。</p>
<p>TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。</p>
<p><strong>DEBUG</strong> <strong>指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。</strong></p>
<p><strong>INFO</strong> <strong>消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。</strong></p>
<p>WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示</p>
<p><strong>ERROR</strong> <strong>指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。</strong></p>
<p>FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。</p>
<p>OFF 最高等级的,用于关闭所有日志记录。</p>
<h2><a id="2_logback_28"></a>2 使用logback记录日志</h2>
<h3><a id="21_Maven_30"></a>2.1 Maven依赖</h3>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-comment"><!--SpringBoot热部署配置 --></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.projectlombok<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>lombok<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
</code></div></pre>
<h3><a id="22_applicationyml_40"></a>2.2 application.yml</h3>
<pre><div class="hljs"><code class="lang-yaml"><span class="hljs-attr">server:</span>
<span class="hljs-attr">port:</span> <span class="hljs-number">8080</span>
<span class="hljs-comment"># 指定读取logback配置文件</span>
<span class="hljs-attr">logging:</span>
<span class="hljs-attr">config:</span> <span class="hljs-string">classpath:log/logback.xml</span>
</code></div></pre>
<h3><a id="23_logbackxml_51"></a>2.3 logback.xml配置文件</h3>
<p><code>/resources/logback.xml</code></p>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-tag"><<span class="hljs-name">configuration</span>></span>
<span class="hljs-comment"><!--本文主要输出日志为控制台日志,系统日志,sql日志,异常日志--></span>
<span class="hljs-comment"><!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, --></span>
<span class="hljs-comment"><!--控制台--></span>
<span class="hljs-tag"><<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"console"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.core.ConsoleAppender"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">encoder</span>></span>
<span class="hljs-tag"><<span class="hljs-name">pattern</span>></span>%d %p (%file:%line\)- %m%n<span class="hljs-tag"></<span class="hljs-name">pattern</span>></span>
<span class="hljs-tag"><<span class="hljs-name">charset</span>></span>UTF-8<span class="hljs-tag"></<span class="hljs-name">charset</span>></span>
<span class="hljs-tag"></<span class="hljs-name">encoder</span>></span>
<span class="hljs-tag"></<span class="hljs-name">appender</span>></span>
<span class="hljs-comment"><!--系统info级别日志--></span>
<span class="hljs-comment"><!--<File> 日志目录,没有会自动创建--></span>
<span class="hljs-comment"><!--<rollingPolicy>日志策略,每天简历一个日志文件,或者当天日志文件超过64MB时--></span>
<span class="hljs-comment"><!--encoder 日志编码及输出格式--></span>
<span class="hljs-tag"><<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"fileLog"</span>
<span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.core.rolling.RollingFileAppender"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">File</span>></span>log/file/fileLog.log<span class="hljs-tag"></<span class="hljs-name">File</span>></span>
<span class="hljs-tag"><<span class="hljs-name">rollingPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">fileNamePattern</span>></span>log/file/fileLog.log.%d.%i<span class="hljs-tag"></<span class="hljs-name">fileNamePattern</span>></span>
<span class="hljs-tag"><<span class="hljs-name">timeBasedFileNamingAndTriggeringPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"</span>></span>
<span class="hljs-comment"><!-- or whenever the file size reaches 64 MB --></span>
<span class="hljs-tag"><<span class="hljs-name">maxFileSize</span>></span>64 MB<span class="hljs-tag"></<span class="hljs-name">maxFileSize</span>></span>
<span class="hljs-tag"></<span class="hljs-name">timeBasedFileNamingAndTriggeringPolicy</span>></span>
<span class="hljs-tag"></<span class="hljs-name">rollingPolicy</span>></span>
<span class="hljs-tag"><<span class="hljs-name">encoder</span>></span>
<span class="hljs-tag"><<span class="hljs-name">pattern</span>></span>
%d %p (%file:%line\)- %m%n
<span class="hljs-tag"></<span class="hljs-name">pattern</span>></span>
<span class="hljs-tag"><<span class="hljs-name">charset</span>></span>UTF-8<span class="hljs-tag"></<span class="hljs-name">charset</span>></span>
<span class="hljs-comment"><!-- 此处设置字符集 --></span>
<span class="hljs-tag"></<span class="hljs-name">encoder</span>></span>
<span class="hljs-tag"></<span class="hljs-name">appender</span>></span>
<span class="hljs-comment"><!--sql日志--></span>
<span class="hljs-tag"><<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"sqlFile"</span>
<span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.core.rolling.RollingFileAppender"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">File</span>></span>log/sql/sqlFile.log<span class="hljs-tag"></<span class="hljs-name">File</span>></span>
<span class="hljs-tag"><<span class="hljs-name">rollingPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">fileNamePattern</span>></span>log/sql/sqlFile.log.%d.%i<span class="hljs-tag"></<span class="hljs-name">fileNamePattern</span>></span>
<span class="hljs-tag"><<span class="hljs-name">timeBasedFileNamingAndTriggeringPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"</span>></span>
<span class="hljs-comment"><!-- or whenever the file size reaches 64 MB --></span>
<span class="hljs-tag"><<span class="hljs-name">maxFileSize</span>></span>64 MB<span class="hljs-tag"></<span class="hljs-name">maxFileSize</span>></span>
<span class="hljs-tag"></<span class="hljs-name">timeBasedFileNamingAndTriggeringPolicy</span>></span>
<span class="hljs-tag"></<span class="hljs-name">rollingPolicy</span>></span>
<span class="hljs-comment"><!--对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。--></span>
<span class="hljs-tag"><<span class="hljs-name">encoder</span>></span>
<span class="hljs-comment"><!--用来设置日志的输入格式--></span>
<span class="hljs-tag"><<span class="hljs-name">pattern</span>></span>
%d %p (%file:%line\)- %m%n
<span class="hljs-tag"></<span class="hljs-name">pattern</span>></span>
<span class="hljs-tag"><<span class="hljs-name">charset</span>></span>UTF-8<span class="hljs-tag"></<span class="hljs-name">charset</span>></span>
<span class="hljs-comment"><!-- 此处设置字符集 --></span>
<span class="hljs-tag"></<span class="hljs-name">encoder</span>></span>
<span class="hljs-tag"></<span class="hljs-name">appender</span>></span>
<span class="hljs-comment"><!--异常日志--></span>
<span class="hljs-tag"><<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"errorFile"</span>
<span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.core.rolling.RollingFileAppender"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">File</span>></span>log/error/errorFile.log<span class="hljs-tag"></<span class="hljs-name">File</span>></span>
<span class="hljs-tag"><<span class="hljs-name">rollingPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">fileNamePattern</span>></span>log/error/errorFile.%d.log.%i<span class="hljs-tag"></<span class="hljs-name">fileNamePattern</span>></span>
<span class="hljs-tag"><<span class="hljs-name">timeBasedFileNamingAndTriggeringPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"</span>></span>
<span class="hljs-comment"><!-- or whenever the file size reaches 64 MB --></span>
<span class="hljs-tag"><<span class="hljs-name">maxFileSize</span>></span>64 MB<span class="hljs-tag"></<span class="hljs-name">maxFileSize</span>></span>
<span class="hljs-tag"></<span class="hljs-name">timeBasedFileNamingAndTriggeringPolicy</span>></span>
<span class="hljs-tag"></<span class="hljs-name">rollingPolicy</span>></span>
<span class="hljs-comment"><!--对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。--></span>
<span class="hljs-tag"><<span class="hljs-name">encoder</span>></span>
<span class="hljs-comment"><!--用来设置日志的输入格式--></span>
<span class="hljs-tag"><<span class="hljs-name">pattern</span>></span>
%d %p (%file:%line\)- %m%n
<span class="hljs-tag"></<span class="hljs-name">pattern</span>></span>
<span class="hljs-tag"><<span class="hljs-name">charset</span>></span>UTF-8<span class="hljs-tag"></<span class="hljs-name">charset</span>></span>
<span class="hljs-comment"><!-- 此处设置字符集 --></span>
<span class="hljs-tag"></<span class="hljs-name">encoder</span>></span>
<span class="hljs-comment"><!--
日志都在这里 过滤出 error
使用 try {}catch (Exception e){} 的话异常无法写入日志,可以在catch里用logger.error()方法手动写入日志
--></span>
<span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ch.qos.logback.classic.filter.LevelFilter"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">level</span>></span>ERROR<span class="hljs-tag"></<span class="hljs-name">level</span>></span>
<span class="hljs-tag"><<span class="hljs-name">onMatch</span>></span>ACCEPT<span class="hljs-tag"></<span class="hljs-name">onMatch</span>></span>
<span class="hljs-tag"><<span class="hljs-name">onMismatch</span>></span>DENY<span class="hljs-tag"></<span class="hljs-name">onMismatch</span>></span>
<span class="hljs-tag"></<span class="hljs-name">filter</span>></span>
<span class="hljs-tag"></<span class="hljs-name">appender</span>></span>
<span class="hljs-comment"><!-- 日志输出级别 --></span>
<span class="hljs-comment"><!--All\DEBUG\INFO\WARN\ERROR\FATAL\OFF--></span>
<span class="hljs-comment"><!--打印info级别日志,分别在控制台,fileLog,errorFile输出
异常日志在上面由过滤器过滤出ERROR日志打印
--></span>
<span class="hljs-tag"><<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"INFO"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"fileLog"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"console"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"errorFile"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">root</span>></span>
<span class="hljs-comment"><!--打印sql至sqlFile文件日志--></span>
<span class="hljs-tag"><<span class="hljs-name">logger</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"com.dolphin.mapper"</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"DEBUG"</span> <span class="hljs-attr">additivity</span>=<span class="hljs-string">"false"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"console"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"sqlFile"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">logger</span>></span>
<span class="hljs-tag"></<span class="hljs-name">configuration</span>></span>
</code></div></pre>
<h3><a id="24_Java_162"></a>2.4 Java后端</h3>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">/*
* @Author : 有勇气的牛排
* @FileName: MyIndex.java
* desc :
* */</span>
<span class="hljs-keyword">package</span> com.couragesteak.controller;
<span class="hljs-keyword">import</span> lombok.extern.slf4j.Slf4j;
<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;
<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RestController;
<span class="hljs-keyword">import</span> java.util.logging.Logger;
<span class="hljs-meta">@RestController</span>
<span class="hljs-meta">@Slf4j</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">MyIndex</span> {
<span class="hljs-comment">// private static Logger log = Logger.getLogger(MyIndex.class);</span>
<span class="hljs-comment">// http://127.0.0.1:8080/getInfo?name=cs&age=22</span>
<span class="hljs-meta">@RequestMapping("/getInfo")</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getInfo</span><span class="hljs-params">(String name, <span class="hljs-type">int</span> age)</span> {
log.info(<span class="hljs-string">"==============="</span>);
log.info(<span class="hljs-string">"name: {}, age: {}"</span>, name, age);
<span class="hljs-keyword">return</span> name;
}
}
</code></div></pre>
<h3><a id="25_lombok_197"></a>2.5 lombok</h3>
<p>如果idea没有状lombok插件,则需要再类中添加如下代码,才能使用此日志功能。</p>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-type">Logger</span> <span class="hljs-variable">log</span> <span class="hljs-operator">=</span> Logger.getLogger(String.valueOf(MyIndex.class));
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/97cb1cab1f0ffd133edabd1892e08f67.png" alt="image.png" /></p>
<h2><a id="3__log4j__207"></a>3 使用 log4j 记录日志</h2>
<p>机制:如果一条日志信息的级别 >= 配置文件的级别,就记录。</p>
<p>trace:追踪,就是程序推进一下,可以写个trace输出<br />
debug:调试,一般作为最低级别,trace基本不用。<br />
info:输出重要的信息,使用较多<br />
warn:警告,有些信息不是错误信息,但也要给程序员一些提示。<br />
error:错误信息。用的也很多。<br />
fatal:致命错误。<br />
输出源<br />
CONSOLE(输出到控制台)<br />
FILE(输出到文件)<br />
格式<br />
SimpleLayout:以简单的形式显示<br />
HTMLLayout:以HTML表格显示<br />
PatternLayout:自定义形式显示</p>
<h3><a id="31_log4j__225"></a>3.1 log4j 配置文件</h3>
<p><code>log4j.properties</code></p>
<pre><div class="hljs"><code class="lang-java">#log4j.rootLogger=CONSOLE,info,error,DEBUG
log4j.rootLogger=DEBUG,error,CONSOLE,info
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.info.datePattern=<span class="hljs-string">'.'</span>yyyy-MM-dd
log4j.appender.info.Threshold = info
log4j.appender.info.append=<span class="hljs-literal">true</span>
log4j.appender.info.File=E:/code/log/info.log
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.error.datePattern=<span class="hljs-string">'.'</span>yyyy-MM-dd
log4j.appender.error.Threshold = error
log4j.appender.error.append=<span class="hljs-literal">true</span>
log4j.appender.error.File=E:/code/log/error.log
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.DEBUG.datePattern=<span class="hljs-string">'.'</span>yyyy-MM-dd
log4j.appender.DEBUG.Threshold = DEBUG
log4j.appender.DEBUG.append=<span class="hljs-literal">true</span>
log4j.appender.DEBUG.File=E:/code/log/dubug.log
</code></div></pre>
<h3><a id="32_Maven_264"></a>3.2 Maven依赖</h3>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-comment"><!-- spring boot start --></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">exclusions</span>></span>
<span class="hljs-comment"><!-- 排除自带的logback依赖 --></span>
<span class="hljs-tag"><<span class="hljs-name">exclusion</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-logging<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">exclusion</span>></span>
<span class="hljs-tag"></<span class="hljs-name">exclusions</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.projectlombok<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>lombok<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-comment"><!-- springboot-log4j --></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-log4j<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>1.3.8.RELEASE<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
</code></div></pre>
<h3><a id="33_applicationyml_293"></a>3.3 application.yml</h3>
<pre><div class="hljs"><code class="lang-yaml"><span class="hljs-attr">server:</span>
<span class="hljs-attr">port:</span> <span class="hljs-number">8083</span>
<span class="hljs-attr">logging:</span>
<span class="hljs-comment"># 指定log4j.properties配置文件路径</span>
<span class="hljs-attr">config:</span> <span class="hljs-string">classpath:log4j.properties</span>
</code></div></pre>
<h3><a id="34_Java_304"></a>3.4 Java</h3>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-type">Logger</span> <span class="hljs-variable">log</span> <span class="hljs-operator">=</span> Logger.getLogger(String.valueOf(MyIndex.class));
</code></div></pre>
<h2><a id="4_AOP_web__310"></a>4 使用AOP统一处理 web 请求日志</h2>
<p>在方法前后实现拦截,减少代码打印日志代码冗余。</p>
<h3><a id="41_Maven_314"></a>4.1 Maven依赖</h3>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-aop<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
</code></div></pre>
<h3><a id="42_WebLogAspectjava_323"></a>4.2 拦截日志类WebLogAspect.java</h3>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">/*
* @Author : 有勇气的牛排
* @FileName: WebLogAspect.java
* desc :
* */</span>
<span class="hljs-keyword">package</span> com.couragesteak.aop;
<span class="hljs-keyword">import</span> lombok.extern.slf4j.Slf4j;
<span class="hljs-keyword">import</span> org.aspectj.lang.JoinPoint;
<span class="hljs-keyword">import</span> org.aspectj.lang.annotation.AfterReturning;
<span class="hljs-keyword">import</span> org.aspectj.lang.annotation.Aspect;
<span class="hljs-keyword">import</span> org.aspectj.lang.annotation.Before;
<span class="hljs-keyword">import</span> org.aspectj.lang.annotation.Pointcut;
<span class="hljs-keyword">import</span> org.springframework.stereotype.Component;
<span class="hljs-keyword">import</span> org.springframework.web.context.request.RequestContextHolder;
<span class="hljs-keyword">import</span> org.springframework.web.context.request.ServletRequestAttributes;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import</span> java.util.Enumeration;
<span class="hljs-comment">/**
* 定义一个切面,拦截包
*/</span>
<span class="hljs-meta">@Aspect</span>
<span class="hljs-meta">@Component</span>
<span class="hljs-meta">@Slf4j</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">WebLogAspect</span> {
<span class="hljs-comment">// private static final log logger = logFactory.getlog(WebLogAspect.class);</span>
<span class="hljs-comment">/**
* com.couragesteak.controller下所有类
* *:所有方法
* (..): 所有参数
*/</span>
<span class="hljs-meta">@Pointcut("execution(public * com.couragesteak.controller.*.*(..))")</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">webLog</span><span class="hljs-params">()</span> {
}
<span class="hljs-comment">/**
* 前置通知:请求前拦截
*/</span>
<span class="hljs-meta">@Before("webLog()")</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">doBefore</span><span class="hljs-params">(JoinPoint joinPoint)</span> <span class="hljs-keyword">throws</span> Throwable {
<span class="hljs-comment">// 接收到请求,记录请求内容</span>
<span class="hljs-type">ServletRequestAttributes</span> <span class="hljs-variable">attributes</span> <span class="hljs-operator">=</span> (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
<span class="hljs-type">HttpServletRequest</span> <span class="hljs-variable">request</span> <span class="hljs-operator">=</span> attributes.getRequest();
<span class="hljs-comment">// 记录下请求内容</span>
log.info(<span class="hljs-string">"URL : "</span> + request.getRequestURL().toString());
log.info(<span class="hljs-string">"HTTP_METHOD : "</span> + request.getMethod());
log.info(<span class="hljs-string">"IP : "</span> + request.getRemoteAddr());
Enumeration<String> enu = request.getParameterNames();
<span class="hljs-keyword">while</span> (enu.hasMoreElements()) {
<span class="hljs-type">String</span> <span class="hljs-variable">name</span> <span class="hljs-operator">=</span> (String) enu.nextElement();
log.info(<span class="hljs-string">"name:{},value:{}"</span>, name, request.getParameter(name));
}
}
<span class="hljs-comment">/**
* 打印目标方法响应信息
* */</span>
<span class="hljs-meta">@AfterReturning(returning = "ret", pointcut = "webLog()")</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">doAfterReturning</span><span class="hljs-params">(Object ret)</span> <span class="hljs-keyword">throws</span> Throwable {
<span class="hljs-comment">// 处理完请求,返回内容</span>
log.info(<span class="hljs-string">"RESPONSE : "</span> + ret);
}
}
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/22b61601b7288e1e2f68266aaaa31082.png" alt="image.png" /></p>
<p>原文地址:<a href="https://www.couragesteak.com/article/293" target="_blank">https://www.couragesteak.com/article/293</a></p>
留言