技术标签: spring boot springboot logback
首先先对springboot和logback做一个简单的集成。
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
logback依赖的核心包是logback-core、logback-classic、slf4j-api,spring-boot-start-web默认已经集成包括了这几个包。
可以进到web里面看一下
看到maven依赖的jar文件里也有相关的包
新建logback.xml文件
配置文件内容如下:
<?xml version='1.0' encoding='UTF-8'?>
<!--日志配置-->
<configuration>
<!--直接定义属性-->
<property name="" value=""/>
<!--通过配置文件定义属性-->
<springProperty name="" source=""/>
<!--定义并描述一个日志的输出属性-->
<appender name="" class="">
</appender>
<!--创建一个具体的日志输出-->
<logger name="" level="" additivity="">
<appender-ref ref=""/>
</logger>
<!--基础的日志输出-->
<root level="">
<appender-ref ref=""/>
</root>
</configuration>
上面的这一堆的配置到底是几个意思,看下面的这张图:
下面就按照上图里面的解释按个走一遍实例。
业务要求:规定controller报里面的日志打到controller文件里面去,service包里面的日志打到service文件里面去。并且每个日志文件的大小不能超过3M,超过以后将滚动保存到下一个日志文件。
新建测试controller、service包
controller的测试代码
package com.springboot.logback.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.springboot.logback.service.ITestService;
@RestController
public class TestController {
private static final Logger LOG = LoggerFactory.getLogger(TestController.class);
@Autowired
private ITestService testService;
@GetMapping(value = "logTest")
public String logTest(String msg) {
if(StringUtils.isEmpty(msg)) {
LOG.info("the param is null!!");
return "the param is null!!";
}
LOG.info("the param is : {}",msg);
testService.testServiceMethod(msg);
return "success";
}
}
service的测试代码
package com.springboot.logback.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.springboot.logback.service.ITestService;
@Service
public class TestServiceImpl implements ITestService{
private static final Logger LOG = LoggerFactory.getLogger(TestServiceImpl.class);
@Override
public String testServiceMethod(String msg) {
LOG.info("this is a test serviceMethod,the msg is : {}",msg);
return "this is a test method,the msg is : "+msg;
}
}
配置application.properties文件
其实在application.properties文件中的配置说白了就是为不同的类配置参数,比如logging.config=classpath:logback.xml,进入之后就会发现就是为LoggingApplicationListener类配置了一个CONFIG_PROPERTY参数,用于加载logback.xml配置文件的路径。
配置logback.xml文件
1、定义两个全局变量,用于指定controller、service日志的输出文件位置和名称
<!-- 定义日志存储位置变量,可以是相对路径也可以是绝对路径 -->
<property name="serviceLogFile" value="logs/serviceLog"/>
<property name="controllerLogFile" value="logs/controllerLog"/>
2、定义一个controller的日志数据模板appender,用于规定controller日志的输出格式
<appender name="controllerFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${controllerLogFile}.log</file>
<encoder>
<!--日志输出格式-->
<pattern>%d [%thread] %-5level -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${controllerLogFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${maxFileSize}</maxFileSize>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
name代表模板的名称。class为滚动日志输出类。file为日志的位置和名称。encoder、pattern定义格式标签%d代表日期,全部配置为%d{yyyy-MM},花括号中定义日期格式,%d为%d{yyyy-MM-dd}的缩写;[%thread]代表线程;%-5level代表级别从左显示5个字符宽度;[%file:%line]代表哪个类文件和第几行;%msg%n代表消息和换行。
fileNamePattern代表日志滚后的命名规则,maxFileSize为最大日志大小
3、定义一个具体的日志输出
<!--创建一个具体的日志输出-->
<logger name="com.springboot.logback.controller" level="info" additivity="true">
<!--可以有多个appender-ref,即将日志记录到不同的位置-->
<!-- <appender-ref ref="STDOUT"/> -->
<appender-ref ref="controllerFile"/>
</logger>
appender-ref连接到日志模板controllerFile
4、运行测试
调用测试controller里面的测试接口
就会发现生成的controller日志文件和里面的内容
测试滚动日志生成
新建一个新的测试类用户生成大量日志
package com.springboot.logback.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestRollingPolicy {
private final static Logger LOG = LoggerFactory.getLogger(TestRollingPolicy.class);
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0;i<50000;i++) {
LOG.info("this massage is a text massage!!!");
}
}
}
执行main方法,就会发现生成了滚动日志
按照controller的方式新建service层和控制台的appender。另外再建一个全局的appender,用于输出controller、service之外的日志。所以完整的配载如下:
<?xml version='1.0' encoding='UTF-8'?>
<!--日志配置-->
<configuration>
<!--直接定义属性(全局变量)-->
<!-- 定义日志存储位置变量,可以是相对路径也可以是绝对路径 -->
<property name="testLogFile" value="logs/testLog"/>
<property name="serviceLogFile" value="logs/serviceLog"/>
<property name="controllerLogFile" value="logs/controllerLog"/>
<!-- 单个日志文件大小 -->
<property name="maxFileSize" value="3MB"/>
<!--控制台日志-->
<!-- appender类似于一个日志格式化模板,描述了日志的格式、规则、输出形式等 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- %d代表日期,%thread代表线程名,%-5level表示级别从左显示 5 个字符宽度,
%logger{50}表示 Logger 名字最长 50 个字符,[%file:%line]表示哪个类文件和第几行,
%msg代表日志消息,%n代表换行-->
<pattern>%d [%thread] %-5level %logger{50} -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--滚动文件日志-->
<appender name="testFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${testLogFile}.log</file>
<encoder>
<!--日志输出格式-->
<pattern>%d [%thread] %-5level -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${testLogFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${maxFileSize}</maxFileSize>
</rollingPolicy>
</appender>
<appender name="serviceFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${serviceLogFile}.log</file>
<encoder>
<!--日志输出格式-->
<pattern>%d [%thread] %-5level -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${serviceLogFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${maxFileSize}</maxFileSize>
</rollingPolicy>
</appender>
<appender name="controllerFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${controllerLogFile}.log</file>
<encoder>
<!--日志输出格式-->
<pattern>%d [%thread] %-5level -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${controllerLogFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${maxFileSize}</maxFileSize>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!--创建一个具体的日志输出-->
<logger name="com.springboot.logback.controller" level="info" additivity="true">
<!--可以有多个appender-ref,即将日志记录到不同的位置-->
<!-- <appender-ref ref="STDOUT"/> -->
<appender-ref ref="controllerFile"/>
</logger>
<logger name="com.springboot.logback.service" level="info" additivity="true">
<!--可以有多个appender-ref,即将日志记录到不同的位置-->
<!-- <appender-ref ref="STDOUT"/> -->
<appender-ref ref="serviceFile"/>
</logger>
<!--基础的日志输出-->
<root level="info">
<appender-ref ref="testFile" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
再次执行测试的controller接口,效果如下:
控制台:
logs文件夹下面:
springboot、logback集成的复习简单就到这了,logback还有很多其他的功能和用法,如项目中有需要可自行了解学习。
演示代码后续传到个人下载空间。
P3835 【模板】可持久化平衡树题意题目背景本题为题目普通平衡树的可持久化加强版。题目描述您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本):插入\(x\)数删除\(x\)数(若有多个相同的数,因只删除一个,如果没有请忽略该操作)查询\(x\)数的排名(排名定义为比当前数小的数的个数\(+1\)。若有多个相同的数,因输出最小的排...
点击上方“码农突围”,马上关注这里是码农充电第一站,回复“666”,获取一份专属大礼包真爱,请设置“星标”或点个“在看”作者 |只会一点java来源 |cnblogs.com/den..._线程池里有多少个线程
使用EasyUI,tab标签使用引入iframe页面function createFrame(url) { var frame = '<iframe id="mainFrame" name="mainFrame" scrolling="auto" frameborder="0" src="' + url + '" style=\"width_easyui gettab
1. Listener virtual void addListener (Listener *s) Add a listener which will get called back on scene manager events. Listener借口提供的功能 Public Member Functions virtual void preFindVisibleObjects (SceneManager *source, IlluminationRen_at function.scenemanager
这两天在搭建VNC服务的时候,遇到一个简单的问题,却困扰了我有一会:网上的教程大部分是修改.service文件,然后启动服务,但是我发现使用vncserver这个命令也可以达到同样的目的,这两者之间有什么区别呢?查了一些资料,简单的做一个总结。工作管理一般情况下,我们可能会在命令行下这样启动一个程序,以新做的版本管理系统为例:java -jar VersionManager.jar现在,内网中的其..._java linux 守护进程
效果代码<template> <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --> <div style="width: 600px;height:400px;"/></template><script>import echarts from 'echarts'require('echart..._vue 图表切换
ANSYS参数化设计语言(APDL)是一种用来完成有限元常规分析操作或通过参数化变量方式建立分析模型的脚本语言,它用智能化分析的手段,为用户提供了自动完成有限元分析过程的功能,即程序的输入可根据指定的函数、变量以及选用的分析类型来确定,是完成优化设计和自适应网格的最主要基础。APDL允许复杂的数据输人,使用户实际上对任何设计或分析属性有控制权,如分析模型的尺寸、材料的性能、载荷、边界条件施加的位置和_ansys apdl桁架桥
单片机不是一门技术,而是一个工具。对于工具,我们的目的是会熟练地使用它。如果你看懂这句话,会少走很多弯路。下面我来讲一下使用这个工具时,会涉及到的一些知识点。1.单片机是什么?2.单片机编程需要掌握哪些知识?一、单片机是什么?简单来说就是一个可编程的芯片,它的特点可通过不同程序和不同的电路实现不同产品的功能,价格便宜,功耗也低,所以非常适合去做各种消费类、工业、医疗、航空等智能控制。这里只要有基本概念就行了,它就是一个芯片,可以通过程序控制它就够了。二、单片机编程需要掌握哪些知识?很_单片机编程
1、提示Package pgfkeys Error: Choice '1.13' unknown in key '/pgfplots/compat/anchors'分析:通过各种搜索应该是版本不对应,也就是pgfplots版本过低。解决方法:①更新pgfplots版本,我只知道https://sourceforge.net/projects/pgfplots/files/pgfplots/这里可以下载各个版本的pgfplots,但具体怎么更新不知道。②在画图的时候是调用了\pgfplotsset_package pgfkeys error: i do not know the key '/tikz/height', to which you pa
目录:目录:前言实用组件聊天机器人图灵小 i查找共同好友忽略 ResponseError 异常前言学习完了python的基本概念和相应操作后,就要进入实战阶段了,首先选的和微信端口自动交互的wxpy。 本文操靠wxpy的官方文档:官方文档 机器人对象可以参考前文:机器人对象 聊天对象可以参考前文:聊天对象 消息处理可以参考前文:消息处理 微信...
Dubbo :是一个RPC框架,SOA框架:Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。作为RPC:支持各种传输协议,如dubbo,hession,json,fastjson,底层采用mina,netty长连接进行传输!典型的provider和cusomer模式!作为SOA:具有服务治理功能,提供服务的注册和发现!用zookeeper实现注册中心!启动时候服务端会把所有接口注册到注册中心,并且订阅conf
前言想起这个思路的缘由是在medium上看到很多关于PWA的文章,但是国内接受度似乎还不高,因此我也没太在意,看了下PWA的简洁,知道它的一些优点之后就没打算深入学习。直到今天看见一篇文章这样形容PWA:可以把它(PWA)理解为国外版的小程序这让我对PWA的实现产生了一定的兴趣。为什么这个问题的原因其实官网有详细的阐述,我这里用比较通俗的语言解释一下:首先我们要了解的是原生应用对..._pwa渠道