技术标签: spring boot java Java日志 tomcat
什么是Logback?
Logback是由log4j创始人设计的又一个开源日志组件。(百度百科)
Logback 相比于 log4j
与log4j相比,Logback带来了很大的改进,因为这两个项目都是由同一个开发人员创建的。如果您已经熟悉log4j,那么使用Logback很快就会感到宾至如归。作者根据以前在log4j上的工作,重新编写了Logback内部程序,以便在某些关键执行路径上执行速度大约快十倍。Logback组件不仅速度更快,而且内存占用也更小。logback是springboot默认自带的日志框架。
为什么要记录日志?
程序上线之前:
测试环节更快的找bug
易于观察程序的执行顺序和执行流程
程序上线之后:
用来跟踪定位程序的运行状态
用来快速的定位bug
市面上的日志框架
如log4j,log4j2,JUL等等。
logback主要由三个模块组成:
logback-access:logback-access模块与Servlet容器(如Tomcat和Jetty)集成,以提供HTTP访问日志功能。可以使用logback-access模块来替换tomcat的访问日志。
logback-classic:log4j的一个改良版本,同时它完整提供了slf4j API,让我们可以很方便地更换成其他日志系统如log4j。slf4j可以称之为门面日志接口,它提供了一套标准的日志功能的接口,没有任何的实现。而log4j和logback都是属于slf4j的具体实现。
logback-core:其他两个模块的基础模块
logback主要用到的标签有三个,如下:
1、首先引入logback对应的jar包:
<!--日志规范提供包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<!--日志实现包
logback-classic 包里面包含有 slf4j-api 包
只需要引入 logback-classic 包即可-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.5</version>
<scope>runtime</scope>
</dependency>
2,classpath 目录下创建 logback 的配置文件,取名就叫做 logback.xml
为什么 logback 的配置文件叫做 logback.xml
首先,logback的配置文件可以在运行java程序的时候手动指定:
# 执行命令
java -Dlogback.configurationFile=xxxxx/xxxx.xml
但是如果你没有手动指定,那么logback会自动去加载classpath下面logback.grovvy文件。如果这个logback.grovvy找不到,那么他会自动的加载classpath下面的logback-test.xml文件。如果logback-test.xml文件也没有,那会自动加载classpath下面的logback.xml文件。
本地环境玩一下就好了,部署到服务器上千万不要使用这个功能,有些标签的使用会受限制,需要改动 logback.xsd 文件内容才可以解决
1、打开网址:logback.xsd,点击另存为,把文件下载下来,然后再把 logback.xsd 文件拖拽到 classpath 目录下
2、在 classpath 目录下创建 logback.xml 文件,并把下面的内容复制进去,即可实现编写 Logback 配置文件时自动补全属性,等一些配置信息
<?xml version="1.0" encoding="UTF-8"?>
<configuration
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="logback.xsd">
<!--配置文件的内容写在这里面-->
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!--
configuration是logback的根标签
scan="true" 表示配置文件发生了改变会自动加载
scanPeriod="60 seconds" 检测配置文件修改的时间间隔,默认的单位是毫秒,这里设置的表示每分钟检测
debug="false" debug如果设置为true,表示会打印出来logback自身实时的运行信息,这里就不需要了,因为logback自身运行时非常稳定的,不需要对它做日志
-->
<configuration
scan="true"
scanPeriod="60 seconds"
debug="false">
<!--**************配置********************-->
<!--优雅关机 为了防止进程退出时,内存中的数据丢失,请加上此选项
5 seconds 表示服务会等待5秒后执行释放资源的相关操作,默认位0秒-->
<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook">
<delay>5 seconds</delay>
</shutdownHook>
<!--**************定义常量参数********************-->
<!--定义一些参数常量-->
<!--定义日志的输出地址 用于windows电脑日志存放地址路径-->
<property name="log.filepath" value="D:\\logfile\\logfile"/>
<!--定义日志的输出地址 用于linux服务器日志存放地址路径
source="logging.file.path" 指向 yml 或者 properties 配置文件里面的值-->
<springProperty scope="context" name="log.path.linux" source="logging.file.path"/>
<!--
定义日志展示格式
%d{yyyy-MM-dd HH:mm:ss} 定义一条日志的展示时间
[%thread] 表示执行日志的线程名称
%-5level 空出5个空格,然后显示日志级别
%logger{100} 显示在哪个类(全限定类名)里面记录的日志,后面的{100}表示这个类名展示的最大长度是100
%msg 表示的日志信息
%n 表示换行
-->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{100} - %msg%n"/>
<!--彩色日志展示格式-->
<property name="console.log.pattern" value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %msg%n"/>
<!--**************设置输出媒介********************-->
<!--定义日志输出媒介-->
<!--定义控制台输出,class指定的具体输出要使动的类-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!--appender其实是负责统一调度日志的输出工作,而具体的日志的格式化工作和输出的工作会交给encoder-->
<encoder>
<!--定义日志输出的格式-->
<pattern>${console.log.pattern}</pattern>
<!--设置输出内容编码-->
<charset>utf-8</charset>
</encoder>
<!--过滤底层日志记录器向上层抛出的日志
因为consoleAppender只需要记录INFO及其以上级别的日志,对于其他的日志不需要,
所以只需要下面设置即可实现只显示INFO及其以上级别的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!--
接下来还要定义不同级别的日志输出的媒介
对于日志框架来说,日志是有级别的,logback的日志级别有如下:
trace(追踪) < debug(调试) < info(记录信息) < warn(警告) < error(错误)
再记录日志的时候,一般需要使用到一个Logger类的对象,然后可以调用如下方法:
looger.trace("xxxx"),logger.debug("xxxx"),....等等
如果记录的日志级别是info的话,info是大于trace和debug的,这个时候调用trace和debug发方法记录的日志是无法显示的。而调用warn和error是可以展示的。
一般情况下在开发项目的时候,只需要记录debug,info,error的日志就行了,而这个三个级别的日志需要放在不同的文件中
-->
<!--定义debug级别的日志输出,RollingFileAppender表示滚动日志,可以按天或者按月来生成不同的日志文件-->
<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件路径-->
<file>${log.filepath}/debug.log</file>
<!--定义滚动策略,TimeBasedRollingPolicy是一个基于时间的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--设置按时间的方式来生成文件,如果文件名是用.gz结尾的,那么logback会自动压
缩日志文件,如果不需要压缩,可以直接把.gz删除就行了
%d{yyyy-MM-dd} 表示按天保存日志
%d{yyyy-MM-dd_HH_mm} 表示按分钟保存日志-->
<fileNamePattern>${log.filepath}/debug-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!--表示日志文件的最大大小,当日志文件达到该大小时,会进行滚动输出,创建一个新的日志文件-->
<maxFileSize>1024MB</maxFileSize>
<!--设置文件最大保存的历史数据,这里就默认30份就行了,也就是最大保存30个文件-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!--定义日志格式-->
<encoder>
<!--定义日志输出的格式-->
<pattern>${log.pattern}</pattern>
<!--设置输出内容编码-->
<charset>utf-8</charset>
</encoder>
<!--需要注意 <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch>
标签只用于日志记录到文件的类型、控制台输出不能使用
因为debugAppender只需要记录debug级别的日志,对于其他的日志不需要,
所以要加一个过滤器
<onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch> 两个标签
可以实现只显示某一级别的日志,使用这两个标签后,会把非匹配级别的日志直接过滤掉,
如果只是用了 <level>DEBUG</level> 标签,那么设置级别(包括设置的级别)以上
的级别都会被记录下来-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<!--如果是DEBUG日志,同意被记录到文件-->
<onMatch>ACCEPT</onMatch>
<!--如果不是DEBUG日志,直接忽略-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--定义info级别的日志的appender-->
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件路径-->
<file>${log.filepath}/info.log</file>
<!--定义滚动策略,TimeBasedRollingPolicy是一个基于时间的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--设置按时间的方式来生成文件,如果文件名是用.gz结尾的,那么logback会自动压
缩日志文件,如果不需要压缩,可以直接把.gz删除就行了
%d{yyyy-MM-dd} 表示按天保存日志
%d{yyyy-MM-dd_HH_mm} 表示按分钟保存日志-->
<fileNamePattern>${log.filepath}/info-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!--表示日志文件的最大大小,当日志文件达到该大小时,会进行滚动输出,创建一个新的日志文件-->
<maxFileSize>1024MB</maxFileSize>
<!--设置文件最大保存的历史数据,这里就默认30份就行了,也就是最大保存30个文件-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!--定义日志格式-->
<encoder>
<!--定义日志输出的格式-->
<pattern>${log.pattern}</pattern>
<!--设置输出内容编码-->
<charset>utf-8</charset>
</encoder>
<!--需要注意 <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch>
标签只用于日志记录到文件的类型、控制台输出不能使用
因为infoAppender只需要记录debug级别的日志,对于其他的日志不需要,
所以要加一个过滤器
<onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch> 两个标签
可以实现只显示某一级别的日志,使用这两个标签后,会把非匹配级别的日志直接过滤掉,
如果只是用了 <level>DEBUG</level> 标签,那么设置级别(包括设置的级别)以上
的级别都会被记录下来-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<!--如果是INFO日志,同意被记录到文件-->
<onMatch>ACCEPT</onMatch>
<!--如果不是INFO日志,直接忽略-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--定义error级别的日志的appender-->
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件路径-->
<file>${log.filepath}/error.log</file>
<!--定义滚动策略,TimeBasedRollingPolicy是一个基于时间的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--设置按时间的方式来生成文件,如果文件名是用.gz结尾的,那么logback会自动压
缩日志文件,如果不需要压缩,可以直接把.gz删除就行了
%d{yyyy-MM-dd} 表示按天保存日志
%d{yyyy-MM-dd_HH_mm} 表示按分钟保存日志-->
<fileNamePattern>${log.filepath}/error-%d{yyyy-MM-dd_HH_mm}.log.gz</fileNamePattern>
<!--表示日志文件的最大大小,当日志文件达到该大小时,会进行滚动输出,创建一个新的日志文件-->
<maxFileSize>1024MB</maxFileSize>
<!--设置文件最大保存的历史数据,这里就默认2份就行了,也就是最大保存2个文件-->
<maxHistory>2</maxHistory>
</rollingPolicy>
<!--定义日志格式-->
<encoder>
<!--定义日志输出的格式-->
<pattern>${log.pattern}</pattern>
<!--设置输出内容编码-->
<charset>utf-8</charset>
</encoder>
<!--需要注意 <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch>
标签只用于日志记录到文件的类型、控制台输出不能使用
因为errorAppender只需要记录debug级别的日志,对于其他的日志不需要,
所以要加一个过滤器
<onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch> 两个标签
可以实现只显示某一级别的日志,使用这两个标签后,会把非匹配级别的日志直接过滤掉,
如果只是用了 <level>DEBUG</level> 标签,那么设置级别(包括设置的级别)以上
的级别都会被记录下来-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<!--如果是ERROR日志,同意被记录到文件-->
<onMatch>ACCEPT</onMatch>
<!--如果不是ERROR日志,直接忽略-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--**************设置日志记录器(日志记录器+输出媒介即可输出日志)********************-->
<!--注意一:日志记录器和输出媒介都可以设置日志输出级别,日志记录器是第一层过滤,输出媒介是第二层过滤
注意二:自定义的日志记录器优先级大于根日志记录器-->
<!--根日志记录器,所有包下面的日志都会被记录-->
<root level="DEBUG">
<appender-ref ref="debugAppender"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="errorAppender"/>
</root>
<!--根日志记录器,所有包下面的日志都会被记录-->
<root level="DEBUG">
<appender-ref ref="consoleAppender"/>
</root>
<!--自定义记录器
配置自己写的代码的日志记录器
name="com.dkk" 表示对应包(包含子包)里面的代码产生的日志,会被下面的日志记录器记录,否则不会被记录
level="DEBUG" 表示日志记录的级别是DEBUG,如果不指定level的时候,这个日志记录器对应的级别自动继承根记录器
additivity="true" 表示日志事件是否向父节点logger传递。当additivity属性设置为true时,日志事件不仅会被当前logger处理,也会被传递给父节点logger进行处理。这意味着,如果一个logger的配置的appender(媒介输出器)是上级logger(如root logger也就是根记录器)配置的appender,那么当此logger的additivity属性为true时,日志信息会同时输出到当前logger和上级logger的appender中。反之,如果additivity属性设为false,则日志事件只会被当前的logger处理,不会传递给上级logger。因此,根据实际的项目需求,可以灵活设置additivity属性来控制日志信息的输出路径-->
<logger name="com.zdx" level="ERROR" additivity="true">
<appender-ref ref="consoleAppender"/>
</logger>
</configuration>
文章浏览阅读1.3w次。转载自 http://www.miui.com/thread-2003672-1-1.html 当手机在刷错包或者误修改删除系统文件后会出现无法开机或者是移动定制(联通合约机)版想刷标准版,这时就会用到线刷,首先就是安装线刷驱动。 在XP和win7上线刷是比较方便的,用那个驱动自动安装版,直接就可以安装好,完成线刷。不过现在也有好多机友换成了win8/8.1系统,再使用这个_mt65驱动
文章浏览阅读1k次。SonarQube是一个代码质量管理平台,可以扫描监测代码并给出质量评价及修改建议,通过插件机制支持25+中开发语言,可以很容易与gradle\maven\jenkins等工具进行集成,是非常流行的代码质量管控平台。通CheckStyle、findbugs等工具定位不同,SonarQube定位于平台,有完善的管理机制及强大的管理页面,并通过插件支持checkstyle及findbugs等既有的流..._sonar的客户端区别
文章浏览阅读3.4k次,点赞2次,收藏27次。神经图灵机是LSTM、GRU的改进版本,本质上依然包含一个外部记忆结构、可对记忆进行读写操作,主要针对读写操作进行了改进,或者说提出了一种新的读写操作思路。神经图灵机之所以叫这个名字是因为它通过深度学习模型模拟了图灵机,但是我觉得如果先去介绍图灵机的概念,就会搞得很混乱,所以这里主要从神经图灵机改进了LSTM的哪些方面入手进行讲解,同时,由于模型的结构比较复杂,为了让思路更清晰,这次也会分开几..._神经图灵机方法改进
文章浏览阅读2.8k次。一、模型迭代方法机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种:1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。优缺点:这也是实际最为常见的模型迭代方式,通常模型效果也是最好的,但这样模型迭代比较耗时,资源耗费比较多,实时性较差,特别是在大数据场景更为困难;2、模型融合的方法,将旧模..._模型迭代
文章浏览阅读2.3k次。1、前言上传图片一般采用异步上传的方式,但是异步上传带来不好的地方,就如果图片有改变或者删除,图片服务器端就会造成浪费。所以有时候就会和参数同步提交。笔者喜欢base64图片一起上传,但是图片过多时就会出现数据丢失等异常。因为tomcat的post请求默认是2M的长度限制。2、解决办法有两种:① 修改tomcat的servel.xml的配置文件,设置 maxPostSize=..._base64可以装换zip吗
文章浏览阅读1k次,点赞17次,收藏22次。Opencv自然场景文本识别系统(源码&教程)_opencv自然场景实时识别文字
文章浏览阅读1.3k次。拷贝虚拟机文件时间比较长,因为虚拟机 flat 文件很大,所以要等。脚本完成后,以复制虚拟机文件夹。将以下脚本内容写入文件。_exsi6.7快速克隆centos
文章浏览阅读2k次。本文主要实现基于二度好友的推荐。数学公式参考于:http://blog.csdn.net/qq_14950717/article/details/52197565测试数据为自己随手画的关系图把图片整理成文本信息如下:a b c d e f yb c a f gc a b dd c a e h q re f h d af e a b gg h f bh e g i di j m n ..._本关任务:使用 spark core 知识完成 " 好友推荐 " 的程序。
文章浏览阅读367次。南京大学高级程序设计期末复习总结,c++面向对象编程_南京大学高级程序设计
文章浏览阅读3.1k次,点赞2次,收藏12次。实现朴素贝叶斯分类器,并且根据李航《统计机器学习》第四章提供的数据训练与测试,结果与书中一致分别实现了朴素贝叶斯以及带有laplace平滑的朴素贝叶斯%书中例题实现朴素贝叶斯%特征1的取值集合A1=[1;2;3];%特征2的取值集合A2=[4;5;6];%S M LAValues={A1;A2};%Y的取值集合YValue=[-1;1];%数据集和T=[ 1,4,-1;..._朴素贝叶斯 matlab训练和测试输出
文章浏览阅读1.6k次。Markdown 文本换行_markdowntext 换行
文章浏览阅读6.7w次,点赞2次,收藏37次。win10 2016长期服务版激活错误解决方法:打开“注册表编辑器”;(Windows + R然后输入Regedit)修改SkipRearm的值为1:(在HKEY_LOCAL_MACHINE–》SOFTWARE–》Microsoft–》Windows NT–》CurrentVersion–》SoftwareProtectionPlatform里面,将SkipRearm的值修改为1)重..._错误: 0xc0000022 在运行 microsoft windows 非核心版本的计算机上,运行“slui.ex