java日志框架系列(5):logback框架appender详解
1.appender
1.什么是appender
2.AppenderBase
public synchronized void doAppend(E eventObject) { // prevent re-entry. if (guard) { return; } try { guard = true; if (!this.started) { if (statusRepeatCount++ < ALLOWED_REPEATS) { addStatus(new WarnStatus( "Attempted to append to non started appender [" + name + "].", this)); } return; } if (getFilterChainDecision(eventObject) == FilterReply.DENY) { return; } // ok, we now invoke derived class' implementation of append this.append(eventObject); } catch (Exception e) { if (exceptionCount++ < ALLOWED_REPEATS) { addError("Appender [" + name + "] failed to append.", e); } } finally { guard = false; } }
通过代码可以知道AppenderBase类是的doAppender()是同步线程安全的;并不是所有时候都需要同步,因此当不需要同步的时候可以使用UnsynchronizedAppenderBase类。
3. logback-core
logback-core模块是logback的基础。下面讲解一下可以直接使用的appender。
1.logback-core模块中的appender
logback-core模块中的appender种类:OutputStreamAppender、ConsoleAppender、FileAppender、RollingFileAppender。
你有没有发现:logback-core中的appender的目的地都是本地啊,那有没有可以发送到网络上的appender呀,当然有,在logback-classic模块中,下一节介绍。
这些appender之间的关系如下所示:
1.OutputStreamAppender讲解
2.ConsoleAppender讲解
这些属性是需要配置的,因此我们可以通过在xml配置文件中的<appender>标签中创建以属性名为标签名的标签,并为这些标签进行配置。
注意:<appender>中不同的class属性值表明使用不同的目的地,因此会有不同的参数,从而表现出在配置文件中的标签有所差异。
3.FileAppender讲解
这些属性是需要配置的,因此我们可以通过在xml配置文件中的<appender>标签中创建以属性名为标签名的标签,并为这些标签进行配置。
注意:<appender>中不同的class属性值表明使用不同的目的地,因此会有不同的参数,从而表现出在配置文件中的标签有所差异。
4.RollingFIleAppender讲解
1.实现滚动记录原理
这些属性是需要配置的,因此我们可以通过在xml配置文件中的<appender>标签中创建以属性名为标签名的标签,并为这些标签进行配置。
注意:<appender>中不同的class属性值表明使用不同的目的地,因此会有不同的参数,从而表现出在配置文件中的标签有所差异。
1.最受欢迎的滚动策略TimeBaseRollingPolicy
下面讲解一下fileNamePattern的部分值及作用:
注意:所有“\”和“/”都被解释为目录分隔符。任何需要的目录都会被创建。所以你可以轻松地把记录文件放到不同的目录。
4.logback-classic
原文地址:https://www.cnblogs.com/z-x-p/p/11683820.html
- zephir-(7)数组
- phalapi-进阶篇5(数据库读写分离以及多库使用)
- phalapi-进阶篇4(notrom进阶以及事务操作)
- 自动机器学习:利用遗传算法优化递归神经网络
- zephir-(8)类和对象1
- zephir-(4)基本语法
- zephir-(2)安装和初体验
- phalcon-入门篇8(Model层基础使用2)
- 封装、私有,一文掌握Python关键代码
- 基于TensorFlow的比较研究:神经网络优化算法
- Visual Studio 2008 每日提示(二十三)
- 应用层/安全层/传输层如何进行协议选型?
- 一分钟掌握数据库垂直拆分
- 在创建的Silverlight Control中使用图片
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Intellij IDEA 如何自动生成 serialVersionUID
- 图解面试题:SQL存储过程有什么用?
- LeetCode-6.Z 字形变换 - 消费补偿算法
- python + redis 实现 分布式队列任务
- Git error: hint: Updates were rejected because the remote contains work that you do hint: not have l
- 500 行代码写一个俄罗斯方块游戏
- k8s——资源限制
- k8s群集之动态扩缩容——HPA
- k8s群集的三种Web-UI界面部署
- Hive通过Jdbc连接HiveServer2
- SAP Spartacus OccCmsComponentAdapter的findComponentsByIds方法
- 分布式锁:二、Redis锁
- 面试官:kill -9 进程杀不掉,怎么办?
- SAP Spartacus的OccCmsPageNormalizer
- Redis性能指标监控!你知几何?