吴广德吴好提 發表於 2025-8-15 20:58:00

SpringBoot-日志

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>1. java日志框架发展史<ul><li>1. 1起源</li><li>1. 2日志实现</li></ul></li><li>2. logback日志的集成<ul><li>2.1. 日志级别</li><li>2.2. 日志格式</li><li>2.3. 日志文件输出</li><li>2.4. 日志归档</li><li>2.5. 自定义配置文件</li><li>2.6. 日志其他框架切换</li></ul></li></ul></div><p></p>
<h2 id="1-java日志框架发展史">1. java日志框架发展史</h2>
<h3 id="1-1起源">1. 1起源</h3>
<p>在jdk1.3时期想要追踪异常大多只能使用<code>System.out.println("error")</code>的方式,这会导致代码中出现大量的打印而且无法记录在文本中。于是</p>
<ol>
<li>将错误信息写入txt并保存,这样就可以顺利追踪到异常了</li>
<li>但随着用户请求量越来越大单个文本达到1-2个G文件将很难打开,于是将日志信息按天迭送例如:xxxx年xx月xx日.log或者按物理大小迭代例如:xxxx年xx月xx日_20M.log</li>
<li>为能及时追踪异常信息,用户出现异常信息时能不能发送邮件或者短信提醒</li>
<li>按等级区分日志例如:追踪 信息 调试 异常</li>
<li>异步执行防止阻塞</li>
<li>自定义日志格式</li>
</ol>
<p>这便是日志框架的整体设计思路例如:log4j(开源)、jul(官方)</p>
<h3 id="1-2日志实现">1. 2日志实现</h3>
<table>
<thead>
<tr>
<th>日志实现</th>
<th>日志门面</th>
<th>实现方式</th>
</tr>
</thead>
<tbody>
<tr>
<td>log4j(性能差,淘汰)</td>
<td>JCL</td>
<td>使用类加载器主动寻找有没有日志实现,缺点:当使用自定义类加载器时可能会导致内存溢出。</td>
</tr>
<tr>
<td>jul(性能一般,使用方便)</td>
<td>SJF4J</td>
<td>使用<font color="red">桥接器</font>将日志实现和日志门面关联,性能更好。<font color="red">适配器</font>将其他日志转换成指定的日志类型,例如将jul或jcl等转换成slf4j。SJF4J官方针对每个日志都提供了对应的适配器,也针对日志实现提供了对应的桥接器。</td>
</tr>
<tr>
<td>log4j2(推荐)</td>
<td></td>
<td></td>
</tr>
<tr>
<td>logback(推荐,与SJF4J同一作者)</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>门面不实现日志功能,只是整合日志框架。</p>
<ol>
<li>使用jul+jcl记录日志</li>
</ol>
<pre><code>&lt;!--jcl依赖--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;commons-logging&lt;/groupId&gt;
    &lt;artifactId&gt;commons-logging&lt;/artifactId&gt;
    &lt;version&gt;1.2&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<p>多个日志框架同时存在时,为实现日志统一,将jcl转化到slf4j</p>
<pre><code>&lt;!--添加jcl-slf4j适配器--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
    &lt;artifactId&gt;jcl-over-slf4j&lt;/artifactId&gt;
    &lt;version&gt;1.7.30&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<pre><code>import org.apache.commons.logging.LogFactory;

Log logger = LogFactory.getLog(jul.class);
logger.info("\n一行信息");//对应不同日志级别
</code></pre>
<ol start="2">
<li>使用og4j+slf4j记录日志<br>
在使用log4j前需要在resources目录下新增log4j.properties配置文件文件</li>
</ol>
<pre><code>#ALL&lt;DEBUG&lt;INFO&lt;WARN&lt;ERROR&lt;FATAL&lt;OFF
log4j.rootLogger=ALL,file
log4j.appender.file = org.apache.log4j.ConsoleAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
</code></pre>
<pre><code>&lt;!--log4j依赖--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;log4j&lt;/groupId&gt;
    &lt;artifactId&gt;log4j&lt;/artifactId&gt;
    &lt;version&gt;1.2.12&lt;/version&gt;
&lt;/dependency&gt;
&lt;!--slf4j依赖--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
    &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
    &lt;version&gt;1.7.36&lt;/version&gt;
&lt;/dependency&gt;
&lt;!--slf4j-log4j桥接器--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
    &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;
    &lt;version&gt;1.7.30&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<pre><code>import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger(log4j.class);
logger.info("\nn一行信息");//对应不同日志级别
</code></pre>
<h2 id="2-logback日志的集成">2. logback日志的集成</h2>
<p>SpringBoot已经默认集成了slf4j+logback来实现日志,同时也把其他日志替换成了slf4j<br>
spring官网有详细说明</p>
<h3 id="21-日志级别">2.1. 日志级别</h3>
<pre><code>logging.level.org.example.springbootcode_logging=trace //修改日志文件等级
</code></pre>
<pre><code>&lt;!--trace&gt;debug&gt;info&gt;warn&gt;error--&gt;
import org.slf4j.LoggerFactory;

&lt;!--1、生命日志记录器--&gt;
static Logger logger = LoggerFactory.getLogger(SpringBootCodeLoggingApplication.class);
logger.trace("追踪");
logger.debug("调试");
logger.info("信息");
logger.warn("警告");
logger.error("异常");
</code></pre>
<h3 id="22-日志格式">2.2. 日志格式</h3>
<pre><code>&lt;!--包含日期方法名输出颜色等信息--&gt;
logging.pattern.console=%clr(%d{${LOG DATEFORMAT PATTERN:-yyyy-MM-ddHH:mm:ss.sss}}){faint}%c1r(${LOG LEVEL PATTERN:-%5p})%clr(${PID:-}){magenta} %clr(---){faint}%clr([%15.15t]){faint}%c1r(%-40.40logger{39}){cyan} %clr(:){faint}%m%n${LOG_EXCEPTION CONVERSION WORD:-%wEx}
</code></pre>
<h3 id="23-日志文件输出">2.3. 日志文件输出</h3>
<pre><code>&lt;!--指定文件夹路径,不可以指定名称,默认文件名spring.log--&gt;
logging.file.path=D:/Project/JavaProject/SpringBootCode_logging/Log
&lt;!--指定文件名称,如果没有设置路径就会创建在项目相对路径下--&gt;
logging.file.name=test.log
</code></pre>
<h3 id="24-日志归档">2.4. 日志归档</h3>
<pre><code>&lt;!--文件超出5kb打打压缩包--&gt;
logging.logback.rollingpolicy.max-file-size=5kb
</code></pre>
<h3 id="25-自定义配置文件">2.5. 自定义配置文件</h3>
<p>Sping只提供了基础的配置选项,想要实现更多更深层的功能就必须要自定义配置,具体怎么做呢</p>
<ul>
<li>在src/main/resources下创建logback-spring.xml文件,注意:<font color="red">文件名不能使用spring.xml,因为spring会在springboot之前读取spring.xml文件会导致logback-spring.xml不生效</font></li>
<li>会使全局配置文件中设置失效</li>
</ul>
<h3 id="26-日志其他框架切换">2.6. 日志其他框架切换</h3>
<ul>
<li>将logback切换成log4j2</li>
</ul>
<pre><code>&lt;!--添加Log4j2的场景启动器--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-log4j2&lt;/artifactId&gt;
&lt;/dependency&gt;
</code></pre>
<p>由于logback默认使用logback-classic桥接器,所以要排除掉默认的场景启动器,否则项目会报错</p>
<pre><code>&lt;!--排除的starter-logging场景启动器,也就是logback的依赖--&gt;
&lt;exclusions&gt;
    &lt;exclusion&gt;
      &lt;artifactId&gt;spring-boot-starter-logging&lt;/artifactId&gt;
      &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;/exclusion&gt;
&lt;/exclusions&gt;
</code></pre>
<p>添加log4j2配置文件</p>
<ul>
<li>将logback切换成log4j</li>
</ul>
<pre><code>&lt;!--添加Log4j的场景启动器--&gt;
&lt;dependency&gt;
        &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
        &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;
&lt;/dependency&gt;
</code></pre>
<pre><code>&lt;!--排除的starter-logging场景启动器,也就是logback的依赖--&gt;
&lt;exclusions&gt;
        &lt;exclusion&gt;
        &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
        &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
        &lt;/exclusion&gt;
&lt;/exclusions&gt;
</code></pre>
<p>添加log4j配置文件</p><br><br>
来源:https://www.cnblogs.com/yichenliu/p/19018794
頁: [1]
查看完整版本: SpringBoot-日志