当前位置: 首页 > news >正文

Java Logback教程

今天仔细配置了一下Logback,之前都是直接从网上找一下,今天仔细研究了一下。首先简单配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
  <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
	<springProperty scope="context" name="logLevel" source="logBack.level"/>
	<springProperty scope="context" name="logPath" source="logBack.path"/>
	<springProperty scope="context" name="logName" source="logBack.name"/>

	<property name="COLOR_PATTERN" value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''})- %gray(%msg%xEx%n)" />
	<!-- 控制台输出 -->
	<appender name="STDOUT"
		class="ch.qos.logback.core.ConsoleAppender">
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
		</encoder>
	</appender>

	<!-- 按照每天生成日志文件 -->
	<appender name="FILE"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy
			class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<!--日志文件输出的文件名 -->
			<FileNamePattern>${logPath}/${logName}.%d{yyyy-MM-dd}.%i.log
			</FileNamePattern>
			<!--日志文件保留天数 -->
			<MaxHistory>180</MaxHistory>
			<MaxFileSize>500MB</MaxFileSize>
			<!--重启清理日志文件-->
			<cleanHistoryOnStart>true</cleanHistoryOnStart>
		</rollingPolicy>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
		</encoder>
	</appender>

	<!-- 生成html格式日志结束 -->

	<!-- 每天生成一个html格式的日志开始 -->
	<appender name="FILE_HTML"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy
			class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<!--日志文件输出的文件名 -->
			<FileNamePattern>${logPath}/${logName}.%d{yyyy-MM-dd}.%i.html
			</FileNamePattern>
			<!--日志文件保留天数 -->
			<MaxHistory>180</MaxHistory>
			<MaxFileSize>500MB</MaxFileSize>
			<!--重启清理日志文件-->
			<cleanHistoryOnStart>true</cleanHistoryOnStart>
		</rollingPolicy>
		<encoder
			class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
			<layout class="ch.qos.logback.classic.html.HTMLLayout">
				<pattern>%p%d%msg%M%F{32}%L</pattern>
			</layout>
		</encoder>
	</appender>
	<!-- 每天生成一个html格式的日志结束 -->

	<!--myibatis log configure -->
	<logger name="com.apache.ibatis" level="DEBUG" />
	<logger name="java.sql.Connection" level="DEBUG" />
	<logger name="java.sql.Statement" level="DEBUG" />
	<logger name="java.sql.PreparedStatement" level="DEBUG" />


	<!-- 日志输出级别 -->
	<root level="${logLevel}">
		<appender-ref ref="STDOUT" />
		<appender-ref ref="FILE" />
		<appender-ref ref="FILE_HTML" />
	</root>

</configuration>

然后日志级别的区分如下:

在这里插入图片描述

fileNamePattern 值及其作用说明

fileNamePattern展期时间表
/wombat/foo.%d每日滚动(在午夜)。由于省略了%d令牌说明符的可选时间和日期模式,因此采用了默认模式yyyy-MM-dd,它对应于每日滚动。未设置文件属性:在2006年11月23日,日志记录输出将进入文件 /wombat/foo.2006-11-23。在午夜以及24日的其余时间,日志记录输出将定向到 /wombat/foo.2006-11-24。文件属性设置为 /wombat/foo.txt:在2006年11月23日,日志输出将转到文件/wombat/foo.txt。在午夜,foo.txt将重命名为 /wombat/foo.2006-11-23。将创建一个新的 /wombat/foo.txt文件,并在11月24日的其余时间将日志输出定向到 foo.txt。
/wombat/%d{yyyy/MM}/foo.txt在每个月初进行过渡。未设置文件属性:在2006年10月,日志记录输出将进入 /wombat/2006/10/foo.txt。在10月31日午夜之后和11月下旬,日志记录输出将定向到/wombat/2006/11/foo.txt。文件属性设置为 /wombat/foo.txt:活动日志文件将始终为 /wombat/foo.txt。在2006年10月,日志记录输出将转到/wombat/foo.txt。在10月31日午夜,/ wombat/foo.txt将重命名为/wombat/2006/10/foo.txt。将创建一个新的 /wombat/foo.txt文件,该日志文件将在11月下旬输出。在11月30日午夜,/ wombat / foo.txt将重命名为 /wombat/2006/11/foo.txt,依此类推。
/wombat/foo.%d{yyyy-ww}.log在每周的第一天进行过渡。请注意,一周的第一天取决于语言环境。与以前的情况类似,不同的是,过渡将在每个新的星期开始时进行。
/wombat/foo%d{yyyy-MM-dd_HH}.log每小时顶部滚动一次。与以前的情况类似,除了过渡将在每小时的顶部进行。
/wombat/foo%d{yyyy-MM-dd_HH-mm}.log每分钟开始时进行翻转。与以前的情况类似,除了在每分钟的开始发生翻转。
/ wombat / foo%d {yyyy-MM-dd_HH-mm,UTC} .log每分钟开始时进行翻转。与以前的情况类似,除了文件名将以UTC表示。
/ foo /%d {yyyy-MM,aux } /%d.log每天滚动。存档位于包含年和月的文件夹下。在此示例中,第一个%d令牌被标记为 辅助 iliary。然后假定第二个%d令牌是主要令牌,其中省略了时间和日期模式。因此,过渡将每天发生一次(%d的默认设置),并且文件夹名称将取决于年份和月份。例如,在2006年11月,归档文件将全部放在/ foo / 2006

然后今天主要测试了一下rollingPolicy节点下用ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy类和TimeBasedRollingPolicy类的MaxFileSize,MaxHistory的作用:

MaxFileSize:这个参数决定了单个log日志的大小,如果是ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy类,那就会在达到这个值得时候进行切分。但是如果用的是TimeBasedRollingPolicy类那么达到这个值之后,就不再写入日志,这点是比较坑的。

MaxHistory:这个值代表的是周期的概念,刚开始看各种文章有的说是代表保存日志的最多的天数,有的说是保存的文件个数,然后看了下官网,官网在SizeAndTimeBasedRollingPolicy和TimeBasedRollingPolicy类之下的时候的解释是Size and time based archiving supports deletion of old archive files. You need to specify the number of periods to preserve with the maxHistory property. When your application is stopped and restarted, logging will continue at the correct location, i.e. at the largest index number for the current period.然后经过我测试之后,发现这个表示的是周期。即在fileNamePattern 参数配置的如果是按照天进行分割,那这个的数量就表示是N天,如果fileNamePattern 配置的是分钟,那这个就表示N分钟。然后这个数量不能用类似3*30这种表达,必须直接用90表达。

 

参考:https://zhuanlan.zhihu.com/p/70595392

http://logback.qos.ch/manual/appenders.html#rfaRollingPolicy

https://blog.csdn.net/SIMBA1949/article/details/90718200

https://blog.csdn.net/u012723183/article/details/107685109

相关文章:

  • 石子合并[DP-N3]
  • log4j2定期生成和删除过期日志文件的配置
  • 使用netcat进行反弹链接的shellcode
  • mybatis 判断是否传入了某参数
  • sleep()和wait()区别
  • [LeetCode] NO. 387 First Unique Character in a String
  • Linux命令(网络)
  • 抽象工厂的一个范例
  • WebBrowser 和 Win Form 的关闭问题?
  • 蓝鸥Unity开发基础二——课时18 单例
  • 表示数值的字符串
  • 如何配置搜索功能
  • W3bsafe]SQLmap过狗命令的利用+教程
  • Linux的包管理工具介绍
  • Jive论坛与Spring框架
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【知识碎片】第三方登录弹窗效果
  • Angular 2 DI - IoC DI - 1
  • Consul Config 使用Git做版本控制的实现
  • gulp 教程
  • Java应用性能调优
  • Laravel 菜鸟晋级之路
  • MySQL的数据类型
  • Python socket服务器端、客户端传送信息
  • React中的“虫洞”——Context
  • Redis的resp协议
  • Spring框架之我见(三)——IOC、AOP
  • Vim Clutch | 面向脚踏板编程……
  • Vue实战(四)登录/注册页的实现
  • 不上全站https的网站你们就等着被恶心死吧
  • 从tcpdump抓包看TCP/IP协议
  • 大快搜索数据爬虫技术实例安装教学篇
  • 关于 Cirru Editor 存储格式
  • 前端面试总结(at, md)
  • 十年未变!安全,谁之责?(下)
  • 通过npm或yarn自动生成vue组件
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • Spring第一个helloWorld
  • ​Java并发新构件之Exchanger
  • # Maven错误Error executing Maven
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (175)FPGA门控时钟技术
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)php投票系统 毕业设计 121500
  • (十一)c52学习之旅-动态数码管
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)ObjectiveC 深浅拷贝学习
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @RequestMapping-占位符映射
  • @Transient注解