(网页)Java日志记录框架Logback配置详解(企业级应用解决方案)(转)
转自CSDN:
前言
Logback是现在比较流行的一个日志记录框架,它的配置比较简单学习成本相对较低,所以刚刚接触该框架的朋友不要畏惧,多花点耐心很快就能灵活应用了。本篇博文不会具体介绍Logback搭建过程,如果你是Logback初学者,强烈建议阅读Logback常用配置详解,它对Logback的配置介绍的非常的详细,相信你看完这篇博客后会对Logback有一定的了解,然后再回头看下面的内容收获会更大
企业级应用常用Logback配置
<?xml version="1.0" encoding="UTF-8" ?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位默认单位是毫秒,当scan为true时此属性生效,默认时间间隔为1分钟
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态,默认值为false
-->
<configuration scan="true" scanPeriod="3 seconds" debug="false">
<!-- 这一句的意思是打印所有进入的信息 -->
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> <!--
appender是<configuration>的子节点,是负责写日志的组件
两个必要属性name和class:name指定appender名称,class指定appender的全限定名
定义控制台appender 作用:把日志输出到控制台 class="ch.qos.logback.core.ConsoleAppender"
-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 对日志进行格式化 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
{"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS}","thread":"%t","line":"%line","log_level":"%p","class_name":"%C;","msg":"%m"}\n
</pattern>
</layout>
</appender> <!--
定义滚动记录文件appender 作用:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件
RollingFileAppender class="ch.qos.logback.core.rolling.RollingFileAppender"
参数:
<append>:如果是true日志被追加到文件结尾,如果是false清空现存文件,默认是true
<file>:被写入的文件名,可以是相对目录也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值
<rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名
<triggeringPolicy>:告知RollingFileAppender合适激活滚动
<prudent>:当为true时不支持FixedWindowRollingPolicy支持TimeBasedRollingPolicy,但是有两个限制:1不支持也不允许文件压缩,2不能设置file属性必须留空
-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 如果是true日志被追加到文件结尾,如果是false清空现存文件,默认是true -->
<append>true</append>
<File>logs/logback-test.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天滚动一次的日志 只保留30天内的日志文件 -->
<FileNamePattern>
logs/logback-test.%d{yyyy-MM-dd}.log.zip
<maxHistory></maxHistory>
</FileNamePattern> <!-- 每分钟滚动一次日志 -->
<!-- <FileNamePattern>
logs/logback-test.%d{yyyy-MM-dd_HH-mm}.log.zip
</FileNamePattern> -->
</rollingPolicy>
<!-- 对日志进行格式化 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
{"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS}","thread":"%t","line":"%line","log_level":"%p","class_name":"%C;","msg":"%m"}\n
</Pattern>
</layout>
</appender> <!--
定义滚动记录文件appender 作用:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件
RollingFileAppender class="ch.qos.logback.core.rolling.RollingFileAppender"
参数:
<append>:如果是true日志被追加到文件结尾,如果是false清空现存文件,默认是true
<file>:被写入的文件名,可以是相对目录也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值
<rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名
<triggeringPolicy>:告知RollingFileAppender合适激活滚动
<prudent>:当为true时不支持FixedWindowRollingPolicy支持TimeBasedRollingPolicy,但是有两个限制:1不支持也不允许文件压缩,2不能设置file属性必须留空
-->
<appender name="LOGBACK_ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>logs/logback-test-error.log</file> <!--
定义滚动策略 作用:根据固定窗口算法重命名文件的滚动策略 class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy
<fileNamePattern>:表示当触发了回滚策略后,按这个文件命名规则生成归档文件,命名规则中的%i表示在maxIndex和minIndex之间的一个整数值
<minIndex>:最小索引值
<maxIndex>:最大索引值
-->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>logs/logback-test-error.log.%i</fileNamePattern>
<minIndex></minIndex>
<maxIndex></maxIndex>
</rollingPolicy> <!--
定义按文件大小触发滚动策略triggeringPolicy 作用:查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender触发当前活动文件滚动
只有一个参数 maxSize 这是活动文件的大小,默认值是10MB
-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>50MB</maxFileSize>
</triggeringPolicy> <!--
配置日志级别过滤器 作用:根据日志级别进行过滤,如果日志级别等于配置级别过滤器会根据onMath和onMismatch接收或拒绝日志
参数:
<level>:设置过滤级别
<onMatch>:用于配置符合过滤条件的操作
<onMismatch>:用于配置不符合过滤条件的操作
此处配置为只接收ERROR日志级别信息
-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter> <encoder>
<pattern>
{"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS}","thread":"%t","line":"%line","log_level":"%p","class_name":"%C;","msg":"%m%n", "caller":"%caller{1}"}
</pattern>
</encoder>
</appender> <!--
定义滚动记录文件appender 作用:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件
RollingFileAppender class="ch.qos.logback.core.rolling.RollingFileAppender"
参数:
<append>:如果是true日志被追加到文件结尾,如果是false清空现存文件,默认是true
<file>:被写入的文件名,可以是相对目录也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值
<rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名
<triggeringPolicy>:告知RollingFileAppender合适激活滚动
<prudent>:当为true时不支持FixedWindowRollingPolicy支持TimeBasedRollingPolicy,但是有两个限制:1不支持也不允许文件压缩,2不能设置file属性必须留空
-->
<appender name="LOGBACK_ALL_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>logs/logback-test-all.log</file> <!--
定义滚动策略 作用:根据固定窗口算法重命名文件的滚动策略 class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy
<fileNamePattern>:表示当触发了回滚策略后,按这个文件命名规则生成归档文件,命名规则中的%i表示在maxIndex和minIndex之间的一个整数值
<minIndex>:最小索引值
<maxIndex>:最大索引值
-->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>logs/logback-test-all.log.%i</fileNamePattern>
<minIndex></minIndex>
<maxIndex></maxIndex>
</rollingPolicy> <!--
定义按文件大小触发滚动策略triggeringPolicy 作用:查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender触发当前活动文件滚动
只有一个参数 maxSize 这是活动文件的大小,默认值是10MB
-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>50MB</maxFileSize>
</triggeringPolicy> <!--
配置临界值过滤器 作用:过滤掉低于指定临界值的日志,当日志级别等于或高于临界值时过滤器返回NEUTRAL,当日志级别低于临界值时,日志会被拒绝
此处配置为INFO 即过滤掉日志级别小于INFO的日志信息
-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter> <encoder>
<pattern>
{"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS}","thread":"%t","line":"%line","log_level":"%p","class_name":"%C;","msg":"%m%n", "caller":"%caller{1}"}
</pattern>
</encoder>
</appender> <!--
logger用来设置某一个包的日志打印级别,以及指定<appender>
<loger> 仅有一个name属性,一个可选的level和一个可选的addtivity属性
name:用来指定受此loger约束的某一个包或者具体的某一个类
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
addtivity:是否向上级loger传递打印信息。默认是true,会将信息输入到root配置指定的地方,可以包含多个appender-ref,标识这个appender会添加到这个logger
-->
<logger name="com.roberto" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="LOGBACK_ALL_LOG" />
<appender-ref ref="LOGBACK_ERROR_LOG" />
</logger> <!-- 将root的打印级别设置为"INFO",指定了名字为"FILE","STDOUT"的appender -->
<root>
<level value="INFO" />
<appender-ref red="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
以上配置部分涵盖了大部分日志记录的需求,如控制台输出日志,文件记录日志,日志输出格式化,按文件大小滚动日志,按日期滚动日志,日志级别过滤等等,在实际应用中只需对配置进行适当的修改即可。以上配置注释部分可以帮助你解决百分90的疑惑,接下来我以上诉配置为基准,运行程序进行简单解释说明
实例讲解
在com.roberto包下测试
package com.roberto; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class LogbackTest {
private static Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class); public static void main(String[] args) {
LOGGER.debug("=======DEBUG=======");
LOGGER.info("========INFO=======");
LOGGER.warn("========WARN=======");
LOGGER.error("=======ERROR=======");
}
}
以上诉配置为基准 新建Logback测试类 观察日志输出情况 切记包名为com.roberto
1.控制台输出
{"timestamp":"2017-07-19T22:11:40.248","thread":"main","line":"","log_level":"DEBUG","class_name":"com.roberto.LogbackTest;","msg":"=======DEBUG======="}
{"timestamp":"2017-07-19T22:11:40.252","thread":"main","line":"","log_level":"INFO","class_name":"com.roberto.LogbackTest;","msg":"========INFO======="}
{"timestamp":"2017-07-19T22:11:40.253","thread":"main","line":"","log_level":"WARN","class_name":"com.roberto.LogbackTest;","msg":"========WARN======="}
{"timestamp":"2017-07-19T22:11:40.253","thread":"main","line":"","log_level":"ERROR","class_name":"com.roberto.LogbackTest;","msg":"=======ERROR======="}
<logger name="com.roberto" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="LOGBACK_ALL_LOG" />
<appender-ref ref="LOGBACK_ERROR_LOG" />
</logger>
控制台打印以上内容是因为这里配置了包名为com.roberto的DEBUG信息输出到控制台
2.logback-test-all.log内容
{"timestamp":"2017-07-19T22:11:40.252","thread":"main","line":"","log_level":"INFO","class_name":"com.roberto.LogbackTest;","msg":"========INFO=======
", "caller":"Caller+ at com.roberto.LogbackTest.main(LogbackTest.java:)
"}{"timestamp":"--19T22::40.253","thread":"main","line":"","log_level":"WARN","class_name":"com.roberto.LogbackTest;","msg":"========WARN=======
", "caller":"Caller+ at com.roberto.LogbackTest.main(LogbackTest.java:)
"}{"timestamp":"--19T22::40.253","thread":"main","line":"","log_level":"ERROR","class_name":"com.roberto.LogbackTest;","msg":"=======ERROR=======
", "caller":"Caller+ at com.roberto.LogbackTest.main(LogbackTest.java:)
"}
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
虽然配置是com.roberto的DEBUG级别信息输出到logback-test-all.log,但是由于在LOGBACK_ALL_LOG appender中配置了过滤器,过滤掉了INFO级别以下的信息,所以logback-test-all.log信息如上
3.logback-test-error.log内容
{"timestamp":"2017-07-19T22:11:40.253","thread":"main","line":"","log_level":"ERROR","class_name":"com.roberto.LogbackTest;","msg":"=======ERROR=======
", "caller":"Caller+ at com.roberto.LogbackTest.main(LogbackTest.java:)
"}
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
虽然配置是com.roberto的DEBUG级别信息输出到logback-test-error.log,但是由于在LOGBACK_ERROR_LOG appender中配置了过滤器,只输出ERROR级别信息,所以logback-test-error.log打印信息如上
4.logback-test.log内容
logback-test.log内容是空的,什么也没接收到,是因为已经为com.roberto包设置了日志打印机制,并且配置了additivity为false,日志信息不传递到上级,所以logback-test.log接收不到任何日志请求
在非com.roberto包下测试
package com.dreamt; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class LogbackTest {
private static Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class); public static void main(String[] args) {
LOGGER.debug("=======DEBUG=======");
LOGGER.info("========INFO=======");
LOGGER.warn("========WARN=======");
LOGGER.error("=======ERROR=======");
}
}
注意此处包名不为com.roberto,观察日志输出发现logback-test-all.log,logback-test-error.log的输出为空,只有logback-test.log和控制台的输出如下:
{"timestamp":"2017-07-19T22:23:15.666","thread":"main","line":"","log_level":"INFO","class_name":"com.dreamt.LogbackTest;","msg":"========INFO======="}
{"timestamp":"2017-07-19T22:23:15.670","thread":"main","line":"","log_level":"WARN","class_name":"com.dreamt.LogbackTest;","msg":"========WARN======="}
{"timestamp":"2017-07-19T22:23:15.670","thread":"main","line":"","log_level":"ERROR","class_name":"com.dreamt.LogbackTest;","msg":"=======ERROR======="}
<root>
<level value="INFO" />
<appender-ref red="STDOUT" />
<appender-ref ref="FILE" />
</root>
此次日志打印请求只命中了STDOUT和FILE,并且设置了日志输出级别为INFO,所以logback-test.log和控制台输出如上
关于滚动日志这里就不做测试,你们可以自己写个循环输出日志进行测试,上面配置注释的非常清楚,只要你们肯动手肯定能实验成功的,以上部分纯属个人拙见,如有误解欢迎大家指正,谢谢~
原文:http://blog.csdn.net/RobertoHuang/article/details/75452508
(网页)Java日志记录框架Logback配置详解(企业级应用解决方案)(转)的更多相关文章
- Spring Boot 2 中的默认日志管理与 Logback 配置详解
Spring Boot在所有内部日志中使用Commons Logging,但是对底层日志的实现是开放的.在Spring Boot生态中,为Java Util Logging .Log4J2 和Logb ...
- 170512、java日志文件log4j.properties配置详解
一.Log4j配置 第一步:加入log4j-1.2.8.jar到lib下. 第二步:在CLASSPATH下建立log4j.properties.内容如下: 放在src下的话就不用配置 否则得去web. ...
- java日志文件log4j.properties配置详解
一.Log4j配置 第一步:加入log4j-1.2.8.jar到lib下. 第二步:在CLASSPATH下建立log4j.properties.内容如下: 放在src下的话就不用配置 否则得去web. ...
- logback -- 配置详解 -- 四 -- <filter>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- logback -- 配置详解 -- 三 -- <encoder>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- logback -- 配置详解 -- 二 -- <appender>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- logback -- 配置详解 -- 一 -- <configuration>及子节点
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- logback 配置详解(上)
logback 配置详解(一)<configuration> and <logger> 一:根节点<configuration>包含的属性: scan: 当此属性设 ...
- 日志分析工具ELK配置详解
日志分析工具ELK配置详解 一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分 ...
随机推荐
- Liferay7 BPM门户开发之5: Activiti和Spring集成
参考文档: https://github.com/jbarrez/spring-boot-with-activiti-examplehttps://github.com/sxyx2008/spring ...
- Django2.1发布,Django2.1新特性
Django 2.1 现已正式发布,官方表示随着 2.1 的发布,对 2.0 系列的主流支持服务将结束,进入安全修复服务周期,直至2019年4月. 2.1新特性:https://docs.django ...
- python 离散序列 样本数伸缩(原创)
解决问题: 有一个固定长度的1维矩阵,将这个矩阵的取样点进行扩充和减少 功能函数: def discrete_scale(data, num): import numpy as np import c ...
- Hadoop社区版搭建
1.环境准备 1.1 硬件配置 设备名 参数 数量 6台 系统 centos6.5 内存 64G 硬盘 32T/台 CPU 16核/台 1.2 软件版本 Hadoop-2.x 下载地址 JDK1.7 ...
- 网站性能压力测试工具--apache ab使用详解
ab是apache自带的压力测试工具.ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对其它类型的服务器进行压力测试.比如nginx.tomcat.IIS等. 下面我们开始介绍 ...
- 第二篇:SpringBoot2.0整合ActiveMQ
本篇开始将具体介绍SpringBoot如何整合其它项目. 如何创建SpringBoot项目 访问https://start.spring.io/. 依次选择构建工具Maven Project.语言ja ...
- JavaWeb学习 (十九)————JavaBean
一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...
- 安装searchd
把安装包解压到 D:coreseek 创建表 create table product( id int key auto_increment, title ), content text ); ins ...
- python学习笔记01--基础
一.解释型语言 python是一门解释型语言,这意味着: l 编写过后的代码不用编译连接即可运行,节约调试时间 l python的解释器在大多数系统中都有很好实现,所以编写的代码可以运行在任何系统 ...
- centos6.5修改yum安装的mysql默认目录
0.说明 Linux下更改yum默认安装的mysql路径datadir. linux下,MySQL默认的数据文档存储目录为/var/lib/mysql. 假如要把MySQL目录移到/home/data ...