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.

  • 相关阅读:
    查看Linux系统版本和内核信息
    XManager连接CentOS6.5
    Linux系统中Ant的安装与实例应用
    Linux常用命令列表
    虚拟机中CentOS系统添加新磁盘
    Linux-IP网络设置
    [原创]Toolbar setNavigationIcon无效
    [转]JAVA回调机制(CallBack)详解
    [原创]PM2使nodejs应用随系统启动
    [原创]Linux(CentOS)下安装mongodb
  • 原文地址:https://www.cnblogs.com/caroline4lc/p/3836486.html
Copyright © 2011-2022 走看看