Java日志框架(二)
最流行的日志框架解决方案
按笔者理解,现在最流的日志框架解决方案莫过于SLF4J + LogBack。其有以下几个优点:
- LogBack 自身实现了 SLF4J 的日志接口,不需要 SLF4J 去做进一步的适配。
- LogBack 自身是在 Log4J 的基础上优化而成的,其运行速度和效率都比 LOG4J 高。
- SLF4J + LogBack 支持占位符,方便日志代码的阅读,而 LOG4J 则不支持。
从上面几点来看,SLF4J + LogBack是一个较好的选择。
LogBack 被分为3个组件:logback-core、logback-classic 和 logback-access。
- logback-core 提供了 LogBack 的核心功能,是另外两个组件的基础。
- logback-classic 则实现了 SLF4J 的API,所以当想配合 SLF4J 使用时,需要将 logback-classic 引入依赖中。
- logback-access 是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口。
了解 LogBack 日志的日志流向,对于我们后面学习日志框架的配置很有帮助。从下图可以看出 LogBack 的日志记录数据流是从 Class 或 Package 流到 Logger,再从Logger到Appender,最后从Appender到具体的输出终端。
LogBack配置文件可以分为几个节点,其中 Configuration 是根节点,Appender、Logger、Root是Configuration的子节点。
appender节点
<appender>是<configuration>的子节点,是负责写日志的组件。appender有两个必要属性name、class 。name指定appender的名称,class指定appender的全限定名
class,主要包括:
- ch.qos.logback.core.ConsoleAppender 控制台输出
- ch.qos.logback.core.FileAppender 文件输出
- ch.qos.logback.core.RollingFileAppender 文件滚动输出
<?xml version="1.0" encoding="utf-8"?> <configuration debug="true" scan="true" scanPeriod="2"> <!-- conf consoel out --> <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender"> </appender> <!-- conf file out --> <appender name="file_out" class="ch.qos.logback.core.FileAppender"> </appender> <!-- conf file out --> <appender name="file_out" class="ch.qos.logback.core.RollingFileAppender"> </appender> <root></root> <logger></logger> </configuration>
ConsoleAppender
把日志添加到控制台,有如下节点:
<encoder>
: 对日志进行格式化。<target>
: 字符串System.out 或者 System.err, 默认 System.out;
<?xml version="1.0" encoding="utf-8"?> <configuration> <!-- conf consoel out --> <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%date [%thread] %-5level %logger - %message%newline</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="console_out" /> </root> </configuration>
FileAppender
把日志添加到文件,有如下节点:
<file>
:被写入的文件名,可以是相对目录 , 也可以是绝对目录 , 如果目录不存在则会自动创建。<append>
:如果是true , 日志被追加到文件结尾 , 如果是false,清空现存文件 , 默认是true。<encoder>
:对日志进行格式化 [具体的转换符说明请参见官网.]
<?xml version="1.0" encoding="utf-8"?> <configuration> <appender name="file_out" class="ch.qos.logback.core.FileAppender"> <file>logs/debug.log</file> <encoder> <pattern>%date [%thread] %-5level %logger - %message%newline</pattern> </encoder> </appender> </configuration>
rollingFileAppender
滚动纪录文件,先将日志记录到指定文件,当符合某种条件时,将日志记录到其他文件,有如下节点:
<file>
:被写入的文件名,可以是相对目录,也可以解决目录,如果目录不存在则自动创建。<append>
:如果是true,日志被追加到文件结尾,如果是false,清空现存文件,默认是true。<encoder>
:对日志进行格式化。<rollingPolicy>
:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
rollingPolicy
TimeBaseRollingPolicy :最常用的滚动策略,根据时间来制定滚动策略,即负责滚动也负责触发滚动。有如下节点;
<fileNamePattern>
:必要节点,包含文件及“%d” 转换符,“%d”可以包含一个java.text.SimpleDateFormat 制定的时间格式,如:%d{yyyy-MM},如果直接使用%d ,默认格式是 yyyy-MM-dd。<maxHistory>
:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,且<maxHistory> 是 6,则只保存最近6个月的文件,删除之前的旧文件,注意:删除旧文件是哪些为了归档而创建的目录也会被删除。<filenamePattern>
:必须包含“%i” 例如:设置最小值,和最大值分别为1和2,命名模式为 log%i.log,会产生归档文件log1.log和log2.log,还可以指定文件压缩选项,例如:log%i.log.gz 或者 log%i.log.zip
- triggeringPolicy:告知RollingFileAppender,激活RollingFileAppender滚动。
<!-- 03:conf errorAppender out -->
<appender name="errorAppender" class="ch.qos.logback.core.RollingFileAppender"> <file>logs/error.log</file> <!-- 设置滚动策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--设置日志命名模式--> <fileNamePattern>errorFile.%d{yyyy-MM-dd}.log</fileNamePattern> <!--最多保留30天log--> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 超过150MB时,触发滚动策略 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>150</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d [%p] %-5level %logger - %msg%newline</pattern> </encoder> </appender>
logger节点
logger是<configuration>的子节点,来设置某一个包或者具体的某一个类的日志打印级别,以及指定<appender>。logger仅有一个name属性,两个可选属性 level/addtivity。
- name:用来指定受此loger约束的某一个包或者具体的某一个类。
- level:用来设置打印级别,大小写无关。可选值有TRACE、DEBUG、INFO、WARN、ERROR、ALL和OFF。还有一个特俗值INHERITED 或者 同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。
- addtivity:是否向上级logger传递打印信息,默认为true;
<logger>可以包含零个或多个<appender-ref>元素,表示这个appender将会添加到logger。
<?xml version="1.0" encoding="utf-8"?> <configuration> <!-- conf consoel out --> <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 过滤掉非INFO级别 --> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- conf infoAppender out --> <appender name="infoAppender" class="ch.qos.logback.core.RollingFileAppender"> <file>logs/info.log</file> <!-- 设置滚动策略 --> <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--设置日志命名模式--> <fileNamePattern>infoFile.%d{yyyy-MM-dd}.log</fileNamePattern> <!--最多保留30天log--> <maxHistory>30</maxHistory> </rollingPoliy> <!-- 超过150MB时,触发滚动策略 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>150</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d [%p] %-5level %logger - %msg%newline</pattern> </encoder> </appender> <!-- 添加两个appender节点 --> <logger name="logback.olf.log" level="info"> <appender-ref ref = "console_out"/> <appender-ref ref = "infoAppender"/> </logger> </configuration>
root节点
元素配置根logger。该元素有一个level属性,没有name属性,因为已经被命名 为root。Level属性的值大小写无关,其值为下面其中一个字符串:TRACE、DEBUG、INFO、 WARN、ERROR、ALL 和 OFF。如果 root 元素没 有引用任何 appender,就会失去所有 appender。
<?xml version="1.0" encoding="utf-8"?> <configuration> <!-- conf consoel out --> <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 过滤掉非INFO级别 --> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 01:conf infoAppender out --> <appender name="infoAppender" class="ch.qos.logback.core.RollingFileAppender"> <file>logs/info.log</file> <!-- 设置滚动策略 --> <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--设置日志命名模式--> <fileNamePattern>infoFile.%d{yyyy-MM-dd}.log</fileNamePattern> <!--最多保留30天log--> <maxHistory>30</maxHistory> </rollingPoliy> <!-- 超过150MB时,触发滚动策略 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>150</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d [%p] %-5level %logger - %msg%newline</pattern> </encoder> </appender> <!-- 02:conf debugAppender out --> <appender name="debugAppender" class="ch.qos.logback.core.RollingFileAppender"> <file>logs/debug.log</file> <!-- 设置滚动策略 --> <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--设置日志命名模式--> <fileNamePattern>debugFile.%d{yyyy-MM-dd}.log</fileNamePattern> <!--最多保留30天log--> <maxHistory>30</maxHistory> </rollingPoliy> <!-- 超过150MB时,触发滚动策略 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>150</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d [%p] %-5level %logger - %msg%newline</pattern> </encoder> </appender> <!-- 03:conf errorAppender out --> <appender name="errorAppender" class="ch.qos.logback.core.RollingFileAppender"> <file>logs/error.log</file> <!-- 设置滚动策略 --> <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--设置日志命名模式--> <fileNamePattern>errorFile.%d{yyyy-MM-dd}.log</fileNamePattern> <!--最多保留30天log--> <maxHistory>30</maxHistory> </rollingPoliy> <!-- 超过150MB时,触发滚动策略 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>150</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d [%p] %-5level %logger - %msg%newline</pattern> </encoder> </appender>
转载于:https://www.cnblogs.com/ifindu-san/p/9716821.html
Java日志框架(二)相关推荐
- java日志框架JUL、JCL、Slf4j、Log4j、Log4j2、Logback 一网打尽
为什么程序需要记录日志 我们不可能实时的24小时对系统进行人工监控,那么如果程序出现异常错误时要如何排查呢?并且系统在运行时做了哪些事情我们又从何得知呢?这个时候日志这个概念就出现了,日志的出现对系统 ...
- Java日志框架 -- 日志框架介绍、日志门面技术、JUL日志(JUL架构、JUL入门示例、JUL日志级别、JUL日志的配置文件)
1. 日志的概念 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 2. Java日志框架 问题: 控制日志输出的内容 ...
- Java日志框架简介
一.java日志发展线路图 上面涵盖了java世界里主要的日志框架或门面,注意,jcl和slf4j是日志门面,因此,在slf4j之前的日志框架,要使用桥接模式来适应slf4j的通用接口,达到统一接口调 ...
- 学习Java日志框架之——搞懂日志门面(JCL+SLF4J)
文章目录 系列文章目录 一.什么是日志门面 1.门面模式(外观模式) 2.日志门面 二.了解JCL 1.JCL组件结构 2.JCL案例 (1)JCL默认实现 (2)导入log4j测试原有程序 三.SL ...
- 学习Java日志框架之——搞懂JUL(java.util.logging)
文章目录 系列文章目录 一.JUL简介 二.JUL组件介绍 三.代码实例 1.入门案例 2.日志级别 (1)默认日志级别源码分析 3.自定义日志级别 4.将日志输出到文件中 5.Logger的父子关系 ...
- Java日志框架日志门面介绍
文章目录 一.日志 二.常见日志框架 历史 各大框架介绍 JUL Log4j(1999-2015) Logback(2006-?) Log4j2 Logback与Log4j2对比 三.日志门面 什么是 ...
- java日志框架简介(日志框架选型)
目录 日志框架发展历程 实现框架 log4j1 JUL logback log4j2 门面日志 SLF4J JCL Spring-JCL Jboss-logging 日志框架选型 日志框架发展历程 现 ...
- 多种java 日志框架【超详细图文】
一.目标 日志的作用和目的 日志的框架 JUL的使用 LOG4J的使用 JCL的使用 二.日志的概念 2.1 日志文件 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志.具有处理历史 ...
- 获取日志的等级_进阶之路:Java 日志框架全画传(中)
导读:随着互联网和大数据的蓬勃发展,分布式日志系统以及日志分析系统得到了广泛地应用.目前,几乎在所有应用程序中,都会用到各种各样的日志框架来记录程序的运行信息.鉴于此,工程师十分有必要熟悉主流的日志记 ...
- java log4j logback jcl_进阶之路:Java 日志框架全画传(下)
导读:随着互联网和大数据的蓬勃发展,分布式日志系统以及日志分析系统得到了广泛地应用.目前,几乎在所有应用程序中,都会用到各种各样的日志框架来记录程序的运行信息.鉴于此,工程师十分有必要熟悉主流的日志记 ...
最新文章
- JSONObject和JSONArray(json-lib-2.4)的基本用法
- log4net按照不同的【LEVEL】级别输出到不同文件
- MPLS由何而来?—Vecloud微云
- 解决在配置Oracle数据库连接错误问题
- JavaScript中为何要使用prototype
- [20161128]关于Little Enddian.txt
- 【maven】No plugin found for prefix ‘install‘ in the current project
- Matcha已升级至0xV4版,比Uniswap和Sushi等平台节省4%的交易费
- python递归函数介绍
- php.ini添加的变量读取,php用ini_get获取php.ini里变量值的方法
- 办理美国商务和旅游签证(B1 B2)和面签的奥秘
- 电感电容之开关电源的原理
- Java集成Outlook邮件操作
- 【暴强】200种好口碑便宜护肤品 - 健康程序员,至尚生活!
- VS2010编译静态链接MFC的OCX遇到的问题:nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已经在 LIBCMTD.lib(dllm
- Win32窗口程序实例
- Golang 中 map 探究
- html 图片缩小后模糊,css图片缩放失真出现锯齿的如何解决呢?
- 51信用卡孙海涛:信用卡账单背后的大数据 | 万物互联创新大会
- 测控计算机三级有用吗,测控专业与计算机三级
热门文章
- 【Tensorflow】图像的读取、解码、显示、处理、编码、保存
- 区块链 性能测试工具
- 区块链 Fisco bcos 智能合约(12)-Solidity的高级特性
- FISCO BCOS Solidity 使用Table合约CRUD接口 智能合约例子
- 7723java之战,满江红4之江山美人
- 基于SSM的在线商城系统(最新)
- cactiez mysql_cactiez v11添加对mysql数据库、apache系统进行监控
- 计算机网络综合应用实验报告,计算机网络综合实验报告
- redis 字符串类型命令
- Centos7 Kubernetes(k8s) 开发服务器(单服务器)部署 nacos