摘要:日志名的从开始,自动递增就是指抛出的异常,是显示全部,如果在中写入数字,则表示展示多少行重点来了,上边都是输出源。
一、简介
LogBack是一个日志框架,它是Log4j作者Ceki的又一个日志组件。
LogBack,Slf4j,Log4j之间的关系
slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log4j,LogBack,java.util.logging使用。Slf4j作为应用层的Log接入时,程序可以根据实际应用场景动态调整底层的日志实现框架(Log4j/LogBack/JdkLog...);
LogBack和Log4j都是开源日记工具库,LogBack是Log4j的改良版本,比Log4j拥有更多的特性,同时也带来很大性能提升。
LogBack官方建议配合Slf4j使用,这样可以灵活地替换底层日志框架。
LogBack的结构
LogBack分为3个组件,logback-core, logback-classic 和 logback-access。
其中logback-core提供了LogBack的核心功能,是另外两个组件的基础。
logback-classic则实现了Slf4j的API,所以当想配合Slf4j使用时,则需要引入这个包。
logback-access是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口。
Log的行为级别:
OFF、
FATAL、
ERROR、
WARN、
INFO、
DEBUG、
ALL
从下向上,当选择了其中一个级别,则该级别向下的行为是不会被打印出来。
举个例子,当选择了INFO级别,则INFO以下的行为则不会被打印出来。
我们从java代码最简单的获取logger开始
Logger logger = LoggerFactory.getLogger(xxx.class.getName());
LoggerFactory是slf4j的日志工厂,获取logger方法就来自这里。
public static Logger getLogger(String name) { ILoggerFactory iLoggerFactory = getILoggerFactory(); return iLoggerFactory.getLogger(name); }
这个方法里面有分为两个过程。第一个过程是获取ILoggerFactory,就是真正的日志工厂。第二个过程就是从真正的日志工厂中获取logger。
第一个过程又分为三个部分。
第一个部分加载org/slf4j/impl/StaticLoggerBinder.class文件
paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);//STATIC_LOGGER_BINDER_PATH = "org/slf4j/impl/StaticLoggerBinder.class"
第二部分随机选取一个StaticLoggerBinder.class来创建一个单例
当项目中存在多个StaticLoggerBinder.class文件时,运行项目会出现以下日志:
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/jiangmitiao/.m2/repository/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/C:/Users/jiangmitiao/.m2/repository/org/slf4j/slf4j-log4j12/1.7.12/slf4j-log4j12-1.7.12.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
最后会随机选择一个StaticLoggerBinder.class来创建一个单例
StaticLoggerBinder.getSingleton()
第三部分返回一个ILoggerFactory实例
StaticLoggerBinder.getSingleton().getLoggerFactory();
所以slf4j与其他实际的日志框架的集成jar包中,都会含有这样的一个org/slf4j/impl/StaticLoggerBinder.class类文件,并且提供一个ILoggerFactory的实现。
第二个过程就是每一个和slf4j集成的日志框架中实现ILoggerFactory方法getLogger()的实例所做的事了。
三、slf4j与logback结合使用实践第一步引入jar包
slf4j-api
logback-core
logback-classic(含有对slf4j的集成包)
org.slf4j slf4j-api 1.7.12 ch.qos.logback logback-core 1.1.3 ch.qos.logback logback-classic 1.1.3
第二步编写简单的logback配置文件
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
文件位置位于src/main/resources下,名字默认为logback.xml。
当然,logback也支持groovy格式的配置文件,如果你会用那更好。
接下来,自己随便写一个类调用一下logger
package log.test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author jiangmitiao * @date 2016/3/24 * @description TODO */ public class Foo { public static void doIt(){ Logger logger = LoggerFactory.getLogger(Foo.class.getName()); logger.debug("let`s do it"); } } package log.test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author jiangmitiao * @date 2016/3/24 * @description TODO */ public class MyApp1 { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(MyApp1.class.getName()); logger.info("before"); Foo.doIt(); logger.info("after"); try { int i = 10 / 0; } catch (Exception e) { logger.error("errorTest",e); } } }
最后的结果是:
16:22:13.459 [main] INFO log.test.MyApp1 - before 16:22:13.463 [main] DEBUG log.test.Foo - let`s do it 16:22:13.463 [main] INFO log.test.MyApp1 - after 16:22:13.466 [main] ERROR log.test.MyApp1 - errorTest java.lang.ArithmeticException: / by zero at log.test.MyApp1.main(MyApp1.java:19) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_25] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_25] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_25] at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_25] at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) [idea_rt.jar:na]
这么简单的配置当然是没有用的,下面这个就能够说明logback配置文件的编写规则了。
四、过滤器的一些疑问myApp1 contextName debug %-4d [%thread] %highlight%-5level %cyan%logger.%-10method - %message%n ${USER_HOME}/myApp1log-${bySecond}.log %date %level [%thread] %logger{30} [%file:%line] %msg%n debug ACCEPT DENY %relative%thread%mdc%level%logger%msg ${USER_HOME}/test.html true ${USER_HOME}/logFile.%d{yyyy-MM-dd}_%i.log 30 10KB %-4date [%thread] %-5level %logger{35} - %msg%n%ex{full, DISPLAY_EX_EVAL}
Logback的过滤器基于三值逻辑,允许把它们组装或成链,从而组成任意的复合过滤策略。过滤器很大程度上受到Linux的iptables启发。这里的所谓三值逻辑是说,过滤器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一个。
如果返回DENY,那么记录事件立即被抛弃,不再经过剩余过滤器;
如果返回NEUTRAL,那么有序列表里的下一个过滤器会接着处理记录事件;
如果返回ACCEPT,那么记录事件被立即处理,不再经过剩余过滤器。
写一个简单的过滤器大家就明白了。
package log.test; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.FilterReply; public class SampleFilter extends Filter{ @Override public FilterReply decide(ILoggingEvent event) { if (event.getMessage().contains("let")) { return FilterReply.ACCEPT; } else { return FilterReply.DENY; } } }
可以选择任意几个输出源加入这个filter
最后的结果是,加入该filter的输出源只能输出Foo.doIt()中的日志了。
五、总结LogBack配置比较简单,官网手册也是比较容易看懂的。除上边几种输出源之外,logback还支持输出到远程套接字服务器、 MySQL、 PostreSQL、Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等等。
第一次学习log方面的知识,如有错误,请不吝赐教。
相关资源:
官方手册
LogBack简易教程
实际的xml配置
Logback浅析
logback 配置详解(一)
更多文章:http://blog.gavinzh.com
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65657.html
摘要:是由创始人设计的又一个开源日志组件。此外完整实现使你可以很方便地更换成其它日志系统如或。访问模块与容器集成提供通过来访问日志的功能。依赖配置的核心,包建议使用来管理日志,方便替换底层实现,要用,就在依赖中加入包和包。 Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback-classic和logback-ac...
摘要:本文要来分享给大家程序员最常用的日志框架组件。没有基础的同学也不要着急,这套教程覆盖了目前所有的日志框架,只要你学,就一定用得到,先收藏,以备不时之需。 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用、WEB应用以及移动应用。然而日志系统是一个成熟Java应用所必不可少的。在开发和调试阶段,日志可以帮...
摘要:二环境准备编译器选择这里我们使用进行工作流开发,虽然对于工作流的友好度不是很好,因为会有一些小的,但是,对于的开发还是非常的好的。新建后出现下面的编辑页面到现在,编辑插件就准备好了。 文章源码托管:https://github.com/OUYANGSIHA...欢迎 star !!! 一、前言 在上一节中我们对activiti进行了基本的介绍activiti进行了基本的介绍,同时介绍了...
摘要:时间年月日星期二说明本文部分内容均来自慕课网。项目一个项目代表一个正在构建的组件比如一个文件,当构建启动后,会基于实例化一个类,并且能够通过变量使其隐式可用。任务动作定义了一个最小的工作单元。 时间:2017年05月16日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://github.com/zccod...
阅读 665·2021-11-25 09:43
阅读 2934·2021-11-24 10:20
阅读 969·2021-10-27 14:18
阅读 1055·2021-09-08 09:36
阅读 3357·2021-07-29 14:49
阅读 1766·2019-08-30 14:07
阅读 2916·2019-08-29 16:52
阅读 2989·2019-08-29 13:12