logback使用总结

Logback

  Log4j的创始人Ceki Gülcü重写了Log4j的内部实现,改进后形成了Logback,相比Log4j速度更快,资源占用更少,也更稳定。(另外Log4j 2.0又是在Logback基础上进行了改进,但还未广泛使用)

官方网站:http://logback.qos.ch/

Logback包括3个部分:

  • logback-core(基础核心模块)
  • logback-classic(log4j改良版,完整实现SLF4J API接口,可方便的与其他日志系统切换)
  • logback-access(与Servlet容器集成提供通过Http访问日志的功能)

特性:

  • Logback传统方法是使用XML保存配置,0.9.22+版本支持Groovy配置转换工具)。配置文件中支持条件处理。
  • Logback-classic可以在配置修改后自动重新载入。
  • FileAppender和它的子类,包括RollingFileAppender,可以优雅的从I/O错误中恢复。
  • 通过设置TimeBasedRollingPolicy 或者 SizeAndTimeBasedFNATP的 maxHistory 属性,你就可以控制日志归档文件的最大数量,清除旧的日志。
  • RollingFileAppender可以在回滚操作中,自动压缩归档日志文件。
  • Lilith是logback的一个记录和访问事件查看器。它相当于log4j的 chainsaw。
  • 强大的日志过滤功能
  • SiftingAppender全能追加器
  • 日志中堆栈信息包含依赖包名和版本
  • 谨慎模式下,多个JVM的多个FileAppender可以安全写入统一的日志文件。

Logback的核心对象和用法与Log4j是相承的,主要对象有:

  • Logger
  • Appender
  • Layout
  • Filter:Logback-classic提供两种类型的过滤器:常规过滤器和TuroboFilter过滤器。

Logback整体流程:

  • Logger 产生日志信息;
  • Layout修饰这条msg的显示格式;
  • Filter过滤显示的内容;
  • Appender具体的显示,即保存这日志信息的地方。

Logback应用示例

1.包引入

  • logback-classic.jar  (依赖logback-core.jar,如果用maven等能够自动处理依赖的工具可以不用引入core包)
  • slf4j-api.jar           (如果应用中使用slf4j API而不是logback自身的api才需引入)

2.配置文件

因为核心对象与Log4J相承,所有配置的思路也类似于log4j的.properties文件。

A.XML版配置

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <property name="LOG_HOME" value="log"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>\(%d{HH:mm:ss.SSS} [%thread]\) %-5level %logger{32} %L - %msg%n</pattern>
        </encoder>
    </appender>

    <!--discardingThreshold: 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
    <!--queueSize:  更改默认的队列的深度,该值会影响性能.默认值为256 -->
    <!--appender-ref:  添加附加的appender,最多只能添加一个 -->
    <!-- 包装其他的Appender,支持异步输出
    <appender name ="asyncFlume" class= "ch.qos.logback.classic.AsyncAppender">
         <discardingThreshold >0</discardingThreshold>
         <queueSize>512</queueSize>
         <appender-ref ref ="flume"/>
    </appender>
     -->

    <appender name="info2File" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY </onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/info.%d{yyyy-MM-dd}.log
            </FileNamePattern>
            <MaxHistory>100</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%-26(%d{HH:mm:ss SSS,Asia/Chongqing} [%thread]) %-5level
                %logger{32} - %msg%n %caller{1, DISP_CALLER_EVAL}</pattern>
        </encoder>
    </appender>

    <appender name="error2File" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY </onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.log
            </FileNamePattern>
            <MaxHistory>100</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%-26(%d{HH:mm:ss SSS,Asia/Chongqing} [%thread]) %-5level
                %logger{32} - %msg%n %caller{1, DISP_CALLER_EVAL}</pattern>
        </encoder>
    </appender>

      <appender name="login2File" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 特定过滤含有某字符串的日志
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator>
                <expression>message.contains("str")</expression>
            </evaluator>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
         -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/login.%d{yyyy-MM-dd-HH}.log</FileNamePattern>
            <MaxHistory>2400</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%m%n</pattern>
        </encoder>
      </appender>

    <appender name="all2db" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource
            class="ch.qos.logback.core.db.DriverManagerConnectionSource">
            <driverClass>com.mysql.jdbc.Driver</driverClass>
            <url>jdbc:mysql://host_name:3306/datebase_name</url>
            <user>username</user>
            <password>password</password>
        </connectionSource>
    </appender>

    <logger name="loginLog" level="INFO" additivity="false">
        <appender-ref ref="login2File"/>
    </logger>

    <logger name="errorLog" level="WARN" additivity="true">
        <appender-ref ref="error2File"/>
    </logger>

    <root>
        <level value="INFO"/>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="info2File"/>
        <appender-ref ref="error2File"/>
    <appender-ref ref="all2db"/>
    </root>
</configuration>

3.代码中调用

 A.使用SLF4J API

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogbackDemo {
    private static Logger log = LoggerFactory.getLogger(LogbackDemo.class);
    private static Logger loginlog = LoggerFactory.getLogger("loginLog");
    public static void main(String[] args)
    {
        log.info("normal message");
        log.warn("warning message");
        log.error("error message");
        loginlog.warn("login message");
    }
}

关于SLF4J

  Simple Logging Facade for Java。SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时,在应用不作任何改动的情况下,决定或切换使用的具体的日志系统。

  如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用SLF4J的必要。

  SLF4J提供了各个日志系统通用的接口以及一个LoggerFactory的工厂类。程序中使用SLF4j API时,不需要在代码或配置文件中指定具体要用哪个日志系统(如java.util.logging、 Log4j、logback等)。要切换成哪个日志系统,只需要把该系统对应的jar包加入到项目中,SLF4J就能自动选择使用你加入的这种日志系统了。这种方法被称之为动态绑定。当然,这个具体的日志系统的相关类库和配置是不能少,如果你打算使用log4j,那么还需要log4j的类库,可能还有配置配置log4j.properties。

  有些具体的日志系统在绑定时还需要桥接包(slf4j-xxx.jar),如slf4j-log412.jar(Log4j), slf4j-jdk14.jar(java.util.logging), slf4j-jcl.jar(commons-logging)。logback不需要桥接。具体日志系统绑定到slf4j如下图。

  

  有时候应用中已经使用了具体的日志系统,slf4j也可以为这些具体日志系统提供底层服务而不需要修改应用。通过另一类桥接包(xxx-over-slf4j.jar、xxx-to-slf4j.jar),能将slf4j绑定到已适用的具体日志系统中,如下图所示。

关于common-logging

  common-logging是apache提供的一个通用的日志接口,动态绑定。作用与SLF4J相同。早期名为Jakarta Commons Logging,JCL。

参考文档

logback配置:http://blog.csdn.net/haidage/article/details/6794529

http://www.cnblogs.com/yongze103/archive/2012/05/05/2484753.html

各个日志系统及其绑定关系: http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html

时间: 2024-10-04 21:49:15

logback使用总结的相关文章

java web工程中logback换配置文件的路径

本人小网站:   http://51kxd.com/  欢迎大家不开心的时候访问访问,调节一下心情 web.xml中配置: <!-- windows  logback.xml文件跟web容器(比如tomcat)在同一个目录中.linux随意  --> <context-param> <param-name>logbackConfigLocation</param-name> <param-value>file:/datum/Data/conf/c

如何加载指定路径的Logback.xml

今天想外置logback.xml,谢了如下代码 File logbackFile = new File("./conf/logback.xml"); if (logbackFile.exists()) { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); JoranConfigurator configurator = new JoranConfigurator(); configurator.s

logback logback.xml 常用配置详解

一:根节点 包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒.当scan为true时,此属性生效.默认的时间间隔为1分钟. debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态.默认值为false. 例如: <configuration scan="true" scan

踩坑记(1)——使用slf4j+logback记录日志

jar包版本: <spring.version>3.1.0.RELEASE</spring.version> <slf4j.version>1.7.25</slf4j.version> <logback.version>1.2.3</logback.version> <logback.ext.version>0.1.1</logback.ext.version> commons-logging:scope为pr

使用SLF4J和LOGBACK (一 : 基本使用)

1.SLF4J是什么? slf4j是一个日志门面,它不是具体的日志实现框架,而是提供了通用的日志接口,按个人理解来说,是通过接口实现多态,来满足应用在不同日志框架间切换的需求. 例如在程序中我们需要记录日志,使用SLF4J提供的接口来调用: Logger logger = LoggerFactory.getLogger(Class.class); logger.info(); 上边两行代码中的Logger和LoggerFactory对象均来自SLF4J包中. 具体的日志实现框架,我们可以选择LO

slf4j+logback搭建超实用的日志管理模块

文章转自http://www.2cto.com/kf/201702/536097.html slf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们非常有必要记录下发生在服务器上的活动,这些日志将用于debug.统计等各种用途. slf4j+logback这种实现方式是很常见的,好处自然是方便!.在这篇文章中,你将看到如何使用logback搭建你自己的日志组件并将日志输出到文件.如何查看这些文件.如何为每个线程上的访问分配独有的一个日志id.

SpringBoot application.yml logback.xml,多环境配置,支持 java -jar --spring.profiles.active

趁今天有时间整理了一下 启动命令为 //开发环境 java -jar app.jar --spring.profiles.active=dev--server.port=8060 //测试环境 java -jar app.jar --spring.profiles.active=qa --server.port=8060 //生产环境 java -jar app.jar --spring.profiles.active=prod --server.port=8060 废话少说,直接上代码 app

log4j升级到logback

虽然现在log4j已经基本上不更新很久了,但实际上升级log4j到logback最大的难度并不在于本身的替换,而是现有大量的三方jar依然使用log4j,以至于无法100%的exclude掉,所以很有可能是无法做到纯粹将log4j升级到logback的.在我们的很多系统中,就如此. 如果是使用slf4j作为facade的话,是可以无缝的升级的,但是如果直接使用了Log4j中的类,恐怕就无能为力了. maven依赖: <dependency>              <groupId&g

将spark默认日志log4j替换为logback

1.将jars文件夹下apache-log4j-extras-1.2.17.jar,commons-logging-1.1.3.jar, log4j-1.2.17.jar, slf4j-log4j12-1.7.16.jar 替换成log4j-over-slf4j-1.7.23.jar,logback-access-1.2.1.jar, logback-classic-1.2.1.jar, logback-core-1.2.1.jar. 2.将conf文件夹下的log4j.properties.t

log4jdbc与logback

在项目中使用了log4jdbc,可以很方便的把sql的参数也打印出来,便于问题调试.比如原始sql: select * from t_order where order_id = ? : 经过log4jdbc的处理后就变成了 select * from t_order where order_id = 123. 但是经过这个处理以后,默认会打印sql相关的很多信息,比如连接.执行时间.参数绑定.结果等信息, 会使日志打印迅速膨胀,我这里服务调用比较频繁,有两个定时任务在调用服务,日志每天在50G