java日志框架系列(3):logback框架配置详解

Wesley13
• 阅读 787

1.Logback配置

1.配置步骤及默认配置

logback即可以通过编程式配置,也可以通过xml的形式配置。

logback配置步骤:

1. 尝试在 classpath 下查找文件 logback-test.xml;

2. 如果文件不存在,则查找文件 logback.xml;

3. 如果两个文件都不存在,logback 用 BasicConfigurator 自动对自己进行配置(默认配置),这会导致记录输出到控制台。

注意:当配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator , 创 建一 个 最小 化配 置 。 最 小化 配置 由 一个 关联 到 根 logger 的ConsoleAppender 组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}- %msg%n 的 PatternLayoutEncoder 进行格式化。还有,根 logger 默认级别是 DEBUG。

2.xml文件进行配置

 在此通过xml文件创建一个上一小节中最小化配置,并将xml文件放到classpath中,代码如下:

<configuration>   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->     <encoder>       <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>   <root level="debug">     <appender-ref ref="STDOUT" />
  </root>
</configuration>

3.自动打印警告和错误消息

 java日志框架系列(3):logback框架配置详解

示例:打印logback的内部信息状态

 1 package logback;
 2 import org.slf4j.Logger;
 3 import org.slf4j.LoggerFactory;
 4 import ch.qos.logback.classic.LoggerContext;
 5 import ch.qos.logback.core.util.StatusPrinter;
 6 public class Demo2 {
 7     private static Logger logger=LoggerFactory.getLogger(Demo2.class);
 8     public static void main(String[] args) {
 9         // TODO Auto-generated method stub
10         //获得logback的logger上下文
11         LoggerContext context=(LoggerContext) LoggerFactory.getILoggerFactory();
12         //打印内部的日志:context找配置文件的过程,以及最终的配置
13         StatusPrinter.print(context);
14         logger.info("enter application.");
15         //Foo foo=new Foo();
16         //foo.doIt();
17         logger.info("exit application.");
18     }
19 }

如果一切顺利的话,控制台会输出以下内容:

14:17:33,156 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
14:17:33,157 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
14:17:33,157 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/E:/code/myeclipse_workspace/spring_heima_video/logback/bin/logback.xml]
14:17:33,237 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
14:17:33,237 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
14:17:33,246 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
14:17:33,252 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
14:17:33,310 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
14:17:33,310 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
14:17:33,311 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
14:17:33,312 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@198e2867 - Registering current configuration as safe fallback point

14:17:33.318 [main] INFO  logback.Demo2 -enter application.
14:17:33.321 [main] INFO  logback.Demo2 -exit application.

总结一下:在代码中可以通过ch.qos.logback.core.util.StatusPrinter对象方便的获得logback框架内部的状态。在配置文件中同样可以达到获得logback框架内部状态的这种效果,方法是设置configuration标签的debug属性为true;请注意debug属性只与状态数据有关,它不影响logback的配置,更不会影响记录级别。

注意

把 configuration 元素的 debug 属性设为 true 后,会输出状态信息,但是 前提是:

1. 找到了配置文件;

2. 配置文件是格式化良好的 XML。

如果其中任一条件未满足,Joran 就会因为配置文件不可读而无法读取 debug 属性。如果找到了配置文件,但却不是格式化良好的,那么 logback 会检测出错误并把内部状态打印到控制台。然而,如果找不到配置文件,由于这不是个严重的错误,logback 不会自动打印状态数据。

 4.配置文件修改后自动重新加载

如果设置成自动重新加载,logback-classic 会扫描配置文件里的变化,并且当发生变化后进行重新配置。设置 方法是设 configuration 元素的 scan 属性为 true。

java日志框架系列(3):logback框架配置详解

注意:内部实现是这样的,当设置扫描属性为 true 时,会安装一个叫 ReconfigureOnChangeFilter的 TurboFilter。每次调用 logger 的打印方法时,都会进行扫描。

比如,当名为 myLogger 的logger 执行“myLogger.debug("hello");”时,如果scan属性为true,则ReconfigureOnChangeFilter会被调用。而且,即使 myLogger 的 debug 级别被禁用了,仍然会调用上述过滤器。

 5.直接调用JoranConfigurator

Logback 依赖 Joran, Joran 是 logback-core 的一部分,是个配置类库。 Logback 的默认配置机制是调用JoranConfigurator 对classpath上的默认配置文件进行处理。不管出于什么理由,如果你想重新实现 logback 的默认配置机制的话,你可以直接调用 JoranConfigurator。

6.查看状态消息

Logback 把内部数据放在一个 StatusManager 对象里,并通过 LoggerContext 访问。

StatusManager 通过 logback 上下文来访问所有数据对象。为把内存占用保持在合理的范围内,默认的 StatusManager 实现将状态消息按头和尾两部分存储。头部存储开始的 H 条状态消息,尾部存储后面的 T 条消息。现在的 H=T=150,将来或许会改变。

java日志框架系列(3):logback框架配置详解

 要想在web程序中实现上述功能,可以在WEB-INF/web.xml中添加如下内容:

<servlet>
    <servlet-name>ViewStatusMessages</servlet-name>   <servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class>
</servlet> <servlet-mapping>   <servlet-name>ViewStatusMessages</servlet-name>   <url-pattern>/lbClassicStatus</url-pattern>
</servlet-mapping>

通过浏览器查看表格形式的logback内部状态信息的网址为:http://host/yourWebapp/lbClassicStatus。

7.监听状态消息

你也 可以为 StatusManager 附加一个 StatusListener,这样就能立即对状态消息作出响应,尤其对那些 logback 配置完成之后的消息。 注册一个状态监听器可以方便地实现对 logback内部状态的无人监管。

logback有一个名称为 OnConsoleStatusListener的 StatusListener接口实现,可以把状态消息打印到控制台。

1.为StatusManager注册StatusListener监听器

实例1:演示如何为StatusManager注册一个OnConsoleStatusListener实例。

java日志框架系列(3):logback框架配置详解

注意:注册了的状态监听器只会接收被注册之后的状态消息,不会接收注册之前的消息。

2.xml方式注册状态监听器

<configuration>   <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
  ... the rest of the configuration file 
</configuration>

通过xml配置文件注册状态监听器,方法是在configuration标签中添加子标签statusListener,并指定实现类。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Logback学习总结
使用前提Logbackclassic依赖slf4japi.jar和logbackcore.jarLogback选择配置:1.尝试在classpath下查找文件logbacktest.xml;2.如果文件不存在,则查找文件logback.xml;3.如果两个文件都不存在,logback用Basic
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这