做同城网站需要哪些,龙岗区住房和建设局在线网站,福清市建设局监督站网站,中国石油大学网站建设Logback简介
日志系统是用于记录程序的运行过程中产生的运行信息、异常信息等#xff0c;一般有8个级别#xff0c;从低到高为All Trace Debug Info Warn Error Fatal OFF
off 最高等级#xff0c;用于关闭所有日志记录fatal 指出每个…Logback简介
日志系统是用于记录程序的运行过程中产生的运行信息、异常信息等一般有8个级别从低到高为All Trace Debug Info Warn Error Fatal OFF
off 最高等级用于关闭所有日志记录fatal 指出每个严重的错误事件将会导致应用程序的退出。error 指出虽然发生错误事件但仍然不影响系统的继续运行。warn 表明会出现潜在的错误情形。info 一般和在粗粒度级别上强调应用程序的运行全程。debug 一般用于细粒度级别上对调试应用程序非常有帮助。trace 该级别日志默认情况下既不打印到终端也不输出到文件。此时对程序运行效率几乎不产生影响all 最低等级用于打开所有日志记录。
Logback和Log4j都是为Java应用程序提供的比较流行的开源日志框架它们都由同一个开发者创建和维护但在功能和性能上存在一些差异Logback可以认为是log4j的改进版在性能、配置应用上都要优于log4jLogback主要由三个模块构成logback-corelogback-classic和logback-access。其中logback-core是其他两个模块的基础提供了Logback的核心功能。logback-classic模块实现了简单日志门面SLF4J而logback-access模块则主要作为一个与Servlet容器交互的模块提供与HTTP访问相关的一些功能。
Logback配置详解
Spring Boot默认是使用Logback的并且提供了自动配置默认使用logback-spring.xml作为配置文件的名称当然也可以在application.properties或application.yml中配置。下面分享一下logback-spring.xml中常用的一些标签。
configuration
configuration为根节点有scan、scanPeriod、debug三个属性
scan当此属性设置为true时配置文件如果发生改变将会被重新加载默认值为true。scanPeriod设置监测配置文件是否有修改的时间间隔如果没有给出时间单位默认单位是毫秒。当scan为true时此属性生效。默认的时间间隔为1分钟。debug当此属性设置为true时将打印出logback内部日志信息实时查看logback运行状态。默认值为false。
configuration scantrue scanPeriod60 seconds debugfalse !-- 其他配置省略--
/configuration
property
property是configuration的子标签有两个属性name和valuename变量的名称value变量的值。
?xml version1.0 encodingUTF-8?
configuration scantrue scanPeriod60 seconds debugfalse!-- logback项目名称 --property nameappName valuelogback-demo/property!-- 日志级别 DEBUGER INFO WARN ERROR --property namelogLevel valuetrace/property!-- 日志路径--property namelogPath value/logs/property!-- 最大保存时间 60天--property namemaxHistory value60/
/configuration
logger
logger节点可选节点作用是指明具体的包或类的日志输出级别以及要使用的
name必写属性指定具体包或类被指定的包或类中的日志输出将遵从该logger规定配置level非必写属性指定日志输出级别该级别将覆盖root配置的输出级别addtivity非必写属性是否向上级loger传递打印信息默认是trueappender-ref引用的appender引用后将实现appender中定义的行为。一个logger可以有多个引用互不影响
root
root节点必选节点用来指定最基础的日志输出级别并指定可以理解为根logger。
appender
appender是configuration的子节点也是非常关键的一个节点它有两个必要属性name和classname指定appender名称class指定appender的全限定名。
appender有四种类型如下其中第四种比较特殊后面再说
ConsoleAppender控制台日志FileAppender文件日志RollingFileAppender滚动文件日志AsyncAppender异步日志
appender内的有一个子标签encoder有两个作用一是把日志信息转换成字节数组二是把字节数组写入到输出流可以用于定义输出日志内容的编码格式、日志格式其中endcoder内的子标签charset用于定义输出日志内容的编码格式子标签pattern用于定义输出日志的具体格式
%date表示日期%thread表示线程名%-5level表示级别从左显示 5 个字符宽度%logger{36}表示 Logger 名字最长 36 个字符%msg表示日志消息%n换行符%line表示当前日志事件的行号
ConsoleAppender
?xml version1.0 encodingUTF-8?
configuration scantrue scanPeriod60 seconds debugfalse!-- logback项目名称 --property nameappName valuelogback-demo/property!-- 日志级别 DEBUGER INFO WARN ERROR --property namelogLevel valueINFO/property!-- lOGGER PATTERN 根据个人喜好选择匹配 --property namelogPattern value[ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{36} [%line] [%thread]- %msg%n/property!-- 控制台的标准输出 --appender nameconsole classch.qos.logback.core.ConsoleAppenderencodercharsetUTF-8/charsetpattern${logPattern}/pattern/encoder/appenderroot level${logLevel}appender-ref refconsole//root
/configuration
FileAppender与RollingFileAppender
FileAppender与RollingFileAppender都是用于将日志写入文件的组件配置属性基本相同因此这里放在一起来说但是需要注意的是二者在日志文件处理方式上有所不同FileAppender将所有的日志信息写入一个指定的文件中当文件达到一定大小或时间点时它会被新的日志文件所替代。而RollingFileAppender则会在日志文件达到指定大小时创建新的日志文件继续写入并且保留一定数量的旧日志文件。
以下是RollingFileAppender和FileAppender的主要区别
RollingFileAppender
日志滚动当日志文件达到指定大小时RollingFileAppender会自动创建一个新的日志文件并将当前日志文件中的内容复制到新文件中。新创建的日志文件的名称会加上一个时间戳或索引号以便区分。日志文件保留RollingFileAppender可以设置保留的日志文件数量。当超过这个数量时最早创建的日志文件会被自动删除。日志索引RollingFileAppender还可以生成一个索引文件用于记录所有滚动日志文件的名称和位置信息。这样可以在需要查看历史日志时快速定位到需要的日志文件。
FileAppender
日志输出FileAppender将日志输出到一个指定的文件中不进行滚动操作。当文件达到一定大小限制时FileAppender会停止写入新的日志信息并创建一个新的日志文件继续写入。日志文件命名FileAppender可以设置日志文件的名称和位置但不会像RollingFileAppender那样添加时间戳或索引号。需要注意的是RollingFileAppender和FileAppender在配置上略有不同。例如RollingFileAppender需要指定日志文件的最大大小和保留数量而FileAppender则需要指定日志文件的最大大小和文件数量等参数。
另外这里着重说一下maxFileSize和maxHistory以及filter标签maxFileSize 是用来限制单个日志文件的最大大小。例如如果你设置 maxFileSize 为 10MB那么当日志文件达到 10MB 时Logback 会开始创建新的日志文件例如app.log.1app.log.2等等。旧的日志文件将被保留直到达到配置的 maxHistory 天数。
而 totalSizeCap 是用来限制所有日志文件的总大小。例如如果你设置 totalSizeCap 为 1GB那么当所有日志文件的总大小达到 1GB 时Logback 会开始删除旧的日志文件以便为新的日志文件腾出空间。这个属性对于防止日志文件占用过多的磁盘空间非常有用。
注意totalSizeCap 和 maxFileSize 不建议同时使用。如果同时设置totalSizeCap 将优先于 maxFileSize。也就是说当达到 totalSizeCap 时将删除旧的日志文件无论这些文件是否达到了 maxFileSize。
在Logback中filter标签用于过滤日志消息。通过在filter标签中定义条件可以实现对日志消息的筛选和拦截实现根据指定的条件来控制哪些日志消息应该被记录。
filter标签有三种类型onMatch、onMismatch和always。这些类型决定了在过滤器匹配或不匹配时应该执行的操作。onMatch当过滤器条件匹配时执行的操作。通常你可以将其设置为记录匹配的日志消息或采取其他所需的操作。onMismatch当过滤器条件不匹配时执行的操作。通常情况下你可以将其设置为记录不匹配的日志消息或采取其他所需的操作。always无论过滤器条件是否匹配都会执行的操作。这通常用于对日志消息进行一些通用的处理或记录。
在下面的示例中我们使用了一个名为ThresholdFilter的过滤器它根据日志级别进行过滤。我们将level属性设置为info这意味着只有级别为info及以上的日志消息会被记录到文件中其他级别的日志消息将被拦截。
?xml version1.0 encodingUTF-8?
configuration scantrue scanPeriod60 seconds debugfalse!-- logback项目名称 --property nameappName valuelogback-demo/property!-- 日志级别 DEBUGER INFO WARN ERROR --property namelogLevel valueinfo/property!-- lOGGER PATTERN 根据个人喜好选择匹配 --property namelogPattern value[ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{36} [%line] [%thread]- %msg%n/property!-- 日志路径--property namelogPath value./logs/property!-- 最大保存时间 60天--property namemaxHistory value60/!-- 控制台的标准输出 --appender nameconsole classch.qos.logback.core.ConsoleAppenderencodercharsetUTF-8/charsetpattern${logPattern}/pattern/encoder/appender!-- INFO 级别的日志记录 --appender namefile_info classch.qos.logback.core.rolling.RollingFileAppenderfile${logPath}/${appName}_info.log/file!-- 日志记录器的滚动策略按日期按大小记录 --rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicyfileNamePattern${logPath}/${appName}_info-%d{yyyy-MM-dd}.%i.log/fileNamePattern!-- 限制单个日志文件的大小--maxFileSize10MB/maxFileSize!--最大保存时间--maxHistory${maxHistory}/maxHistory!-- 所有日志文件总大小的限制--totalSizeCap1GB/totalSizeCap/rollingPolicyencoderpattern${logPattern}/patterncharsetutf-8/charset/encoderfilter classch.qos.logback.classic.filter.LevelFilterlevelINFO/levelonMatchACCEPT/onMatchonMismatchDENY/onMismatch/filter/appenderroot level${logLevel}appender-ref refconsole/appender-ref reffile_info//root
/configuration
AsyncAppender
上面已经说了四种类型的appenderAsyncAppender比较特殊特殊就在于记录日志时从同步或异步的角度来看前三者属于同步日志后者属于异步日志。Logback的同步日志是立即写入磁盘的日志而异步日志是通过线程池异步处理写入磁盘的日志。
Logback异步输出的原理是先写入到缓冲区当缓冲区满了或者达到一定时间再把缓冲区的数据一次性写入磁盘这样可以减少磁盘IO操作提高性能。
Logback异步输出的配置是配置一个例如然后在中配置一个表示缓冲区的大小再配置一个表示缓冲区达到这个阈值时会触发一个强制写入磁盘的操作。
queueSize控制阻塞队列大小使用的ArrayBlockingQueue阻塞队列默认容量256内存中最多保存256条日志discardingThreshold丢弃日志的阈值为防止队列满后发生阻塞。默认队列剩余容量 队列长度的20%就会丢弃TRACE、DEBUG和INFO级日志若discardingThreshold 0那么队列满时再有日志写入就会阻塞。若discardingThreshold ! 0也只丢弃≤INFO级日志出现大量错误日志时还是会阻塞。neverBlock控制队列满时加入的数据是否直接丢弃不会阻塞等待默认是false队列满时offer不阻塞而put会阻塞neverBlock为true时使用offer
在《基于Redis实现消息队列的实践》遇到的明明程序执行结果正常就是看不到过程日志最后的解决办法就使用了logback的异步日志有兴趣的小伙伴可移步参考一下。
?xml version1.0 encodingUTF-8?
configuration scantrue scanPeriod60 seconds debugfalse!-- logback项目名称 --property nameappName valuelogback-demo/property!-- 日志级别 DEBUGER INFO WARN ERROR --property namelogLevel valueinfo/property!-- lOGGER PATTERN 根据个人喜好选择匹配 --property namelogPattern value[ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{36} [%line] [%thread]- %msg%n/property!-- 日志路径--property namelogPath value./logs/property!-- 最大保存时间 60天--property namemaxHistory value60/!-- 异步缓冲队列的深度,该值会影响性能.默认值为256 --property namequeueSize value512/property!-- 控制台的标准输出 --appender nameconsole classch.qos.logback.core.ConsoleAppenderencodercharsetUTF-8/charsetpattern${logPattern}/pattern/encoder/appender!-- INFO 级别的日志记录 --appender namefile_info classch.qos.logback.core.rolling.RollingFileAppenderfile${logPath}/${appName}_info.log/file!-- 日志记录器的滚动策略按日期按大小记录 --rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicyfileNamePattern${logPath}/${appName}_info-%d{yyyy-MM-dd}.%i.log/fileNamePattern!-- 限制单个日志文件的大小--maxFileSize10MB/maxFileSize!--最大保存时间--maxHistory${maxHistory}/maxHistory!-- 所有日志文件总大小的限制--totalSizeCap1GB/totalSizeCap/rollingPolicyencoderpattern${logPattern}/patterncharsetutf-8/charset/encoderfilter classch.qos.logback.classic.filter.LevelFilterlevelINFO/levelonMatchACCEPT/onMatchonMismatchDENY/onMismatch/filter/appenderappender nameasync_log_info classch.qos.logback.classic.AsyncAppender!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --discardingThreshold0/discardingThreshold!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --queueSize${queueSize}/queueSize!-- 设置该属性 logback 会使用 ArrayBlockingQueue 的非阻塞方法 offer 代替 put, 防止在队列满时阻塞业务线程 --neverBlocktrue/neverBlockappender-ref reffile_info//appenderroot level${logLevel}appender-ref refconsole/appender-ref reffile_info/appender-ref refasync_log_info//root
/configuration
Logback与Springboot
引入依赖
如果项目是Springboot项目默认已经引入不需要额外引入依赖如果确实需要可参考 dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.11/version /dependency
配置文件
配置文件命名
在Springboot项目中默认的配置文件名称是logback-spring.xml官方也推荐使用这样的命名方式logback本身默认的配置文件名称是logback.xml
配置文件加载顺序
在工程resources目录下建立logback.xml配置文件的加载顺序是
logback首先会试着查找logback.groovy文件;当没有找到时继续试着查找logback-test.xml文件;当没有找到时继续试着查找logback.xml文件如果是Springboot项目则找logback-spring.xml;如果仍然没有找到则使用默认配置打印到控制台
程序中注入logger
在程序中注入logger有两种方式
final static Logger logger LoggerFactory.getLogger(“名称”);
Component
public class DemoTask {private final static Logger logger LoggerFactory.getLogger(DemoTask.class);Scheduled(fixedDelay 10, timeUnit TimeUnit.SECONDS)public void test() {logger.info(-------------);logger.trace(trace);logger.debug(debug);logger.info(info);logger.warn(warn);logger.error(error);logger.info(-------------);}
}
Sl4j注解如果引入了lombok可以在类上标记Sl4jLombok会在类中自动生成一个名为log的静态final成员变量
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional
/dependency
Component
Slf4jj
public class DemoTask {Scheduled(fixedDelay 10, timeUnit TimeUnit.SECONDS)public void test() {log.info(-------------);log.trace(trace);log.debug(debug);log.info(info);log.warn(warn);log.error(error);log.info(-------------);}
}
文章中展示了关键性代码示例全部代码地址凡夫贩夫 / logback-demo · GitCode