zoukankan      html  css  js  c++  java
  • 日志组件 logback

    一、简介

    Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

    二、slf4j和logback的使用

    1.如果日志的参数超过3个,需要写成

        Object[] params = {newVal, below, above};  

        logger.debug("Value {} was inserted between {} and {}.", params);  

    2.因为内部已优化,作者认为slf4j的logger不需要定义为static。

    3.可设置缓存后批量写日志文件(但服务器如果重启,可能会丢失未写到磁盘的记录)

    4.MDC,用Filter,将当前用户名等业务信息放入MDC中,在日志format定义中即可使用该变量。

    5.JMS Appender用于告警, DB Appender用于业务日志等可以使用插件,如生成Log代码的Eclipse插件Log4E。

    6.tomcat和glassfish中,设定日志路径为../logs/xxxx.log 都能将日志放入应用服务器本身的logs目录

    三、例子

    准备相关工具

    1.  从网上下载slf4j组件和logback相关的jar包,很多网站都有,logback可以直接到这个网站下载http://logback.qos.ch/http://www.slf4j.org/可以直接到这里下载http://www.slf4j.org/。总之,不管在哪里下载,你都需要找到以下几个jar包(可能根据需要,有个别不需要,这个没有详细研究,读者可以自己研究下):

    1)  logback-acces-0.9.18.jar
    2)  logback-classic-0.9.18.jar
    3)  logback-core-0.9.18.jar
    4)  slf4j-api-1.5.6.jar

    2、实现记录日志

    1)建立一个JAVA工程,比如是LogTest,工程整体目录结构如下,工程根目录除了src目录外,新建一个lib目录,将上边4个jar包放入并导入工程。再新建一个config目录,用于存放日志配 置文件logback.xml,这个文件如何配置,后边再介绍。
    2)配置xml文件

    <?xml version="1.0" encoding="UTF-8"?>

    <configuration>
    <substitutionProperty name="log.base" value="d:\logback\logback" />
    <jmxConfigurator />
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator name="myEval">
    <expression>message.contains("dao")</expression>
    </evaluator>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
    </filter>
    <layout class="ch.qos.logback.classic.PatternLayout">
    <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
    </layout>
    </appender>
    <appender name="logfile-dao"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator name="myEval_dao">
    <expression>message.contains("dao")</expression>
    </evaluator>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
    </filter>
    <Encoding>UTF-8</Encoding>
    <File>${log.base}_dao.log</File>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <FileNamePattern>${log.base}.%d{yyyy-MM-dd}_dao.log.zip
    </FileNamePattern>
    </rollingPolicy>
    <layout class="ch.qos.logback.classic.PatternLayout">
    <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
    </layout>
    </appender>
    <appender name="logfile-service"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator name="myEval_service">
    <expression>message.contains("service.impl")</expression>
    </evaluator>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
    </filter>
    <Encoding>UTF-8</Encoding>
    <File>${log.base}_service.log</File>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <FileNamePattern>${log.base}.%d{yyyy-MM-dd}_service.log.zip
    </FileNamePattern>
    </rollingPolicy>
    <layout class="ch.qos.logback.classic.PatternLayout">
    <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
    </layout>
    </appender>
    <appender name="jms_dao" class="ch.qos.logback.classic.net.JMSQueueAppender">
    <InitialContextFactoryName>
    org.apache.activemq.jndi.ActiveMQInitialContextFactory
    </InitialContextFactoryName>
    <ProviderURL>tcp://192.168.1.120:61616</ProviderURL>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator name="myEval_service">
    <expression>message.contains("dao")</expression>
    </evaluator>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
    </filter>
    <QueueConnectionFactoryBindingName>ConnectionFactory
    </QueueConnectionFactoryBindingName>
    <QueueBindingName>cms_dao_log</QueueBindingName>
    </appender>
    <appender name="jms_service" class="ch.qos.logback.classic.net.JMSQueueAppender">
    <InitialContextFactoryName>
    org.apache.activemq.jndi.ActiveMQInitialContextFactory
    </InitialContextFactoryName>
    <ProviderURL>tcp://192.168.1.120:61616</ProviderURL>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator name="myEval_service">
    <expression>message.contains("service.impl")</expression>
    </evaluator>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
    </filter>
    <QueueConnectionFactoryBindingName>ConnectionFactory
    </QueueConnectionFactoryBindingName>
    <QueueBindingName>cms_service_log</QueueBindingName>
    </appender>
    <logger name="com.cms5.cmsservice.jms">
    <level value="DEBUG" />
    </logger>
    <logger name="java.sql.PreparedStatement">
    <level value="DEBUG" />
    </logger>
    <logger name="java.sql.Connection">
    <level value="DEBUG" />
    </logger>
    <logger name="java.sql.Statement">
    <level value="DEBUG" />
    </logger>
    <logger name="com.ibatis">
    <level value="DEBUG" />
    </logger>
    <logger name="com.ibatis.common.jdbc.SimpleDataSource">
    <level value="DEBUG" />
    </logger>
    <logger name="com.ibatis.common.jdbc.ScriptRunner">
    <level value="DEBUG" />
    </logger>
    <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate">
    <level value="DEBUG" />
    </logger>
    <logger name="com.danga.MemCached">
    <level value="INFO" />
    </logger>
    <logger name="org.springframework.test">
    <level value="DEBUG" />
    </logger>
    <logger name="org.apache.struts2">
    <level value="DEBUG" />
    </logger>
    <root>
    <level value="INFO" />
    <!--<appender-ref ref="stdout" />
    -->
    <appender-ref ref="logfile-dao" />
    <appender-ref ref="logfile-service" />
    <appender-ref ref="jms_dao" />
    <appender-ref ref="jms_service" />
    </root>
    </configuration>

    ==================================================

    【http://logback.qos.ch/manual/configuration.html】

    Inserting log requests into the application code requires a fair amount of planning and effort. Observation shows that approximately four percent of code is dedicated to logging. Consequently, even a moderately sized application will contain thousands of logging statements embedded within its code. Given their number, we need tools to manage these log statements.

    Logback can be configured either programmatically or with a configuration script expressed in XML or Groovy format. By the way, existing log4j users can convert their log4j.properties files tologback.xml using our PropertiesTranslator web-application.

    Let us begin by discussing the initialization steps that logback follows to try to configure itself:

    1. Logback tries to find a file called logback.groovy in the classpath.

    2. If no such file is found, logback tries to find a file called logback-test.xml in the classpath.

    3. If no such file is found, it checks for the file logback.xml in the classpath..

    4. If no such file is found, and the executing JVM has the ServiceLoader (JDK 6 and above) the ServiceLoader will be used to resolve an implementation of com.qos.logback.classic.spi.Configurator. The first implementation found will be used. See ServiceLoader documentation for more details.

    5. If none of the above succeeds, logback configures itself automatically using the BasicConfiguratorwhich will cause logging output to be directed to the console.

    The fourth and last step is meant to provide a default (but very basic) logging functionality in the absence of a configuration file.

  • 相关阅读:
    Java运行时数据区
    关于Java中的内存屏障
    Java中对象在内存中的大小、分配等问题
    【java基础】两个日期的比较大小的几种方法。
    报错信息: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
    linux 中文件按照时间倒序或者升序显示
    maven本地仓库存在为什么还要连接外网下载?
    【奇奇怪怪的代码问题】-springboot前后端时间不一致
    日常问题-使用maven jetty插件启动慢的一些解决方法
    Mybatis 框架下 SQL 注入攻击的 3 种方式
  • 原文地址:https://www.cnblogs.com/caroline4lc/p/3836486.html
Copyright © 2011-2022 走看看