标签:
Log4j的创始人Ceki Gülcü重写了Log4j的内部实现,改进后形成了Logback,相比Log4j速度更快,资源占用更少,也更稳定。(另外Log4j 2.0又是在Logback基础上进行了改进,但还未广泛使用)
Logback包括3个部分:
特性:
Logback的核心对象和用法与Log4j是相承的,主要对象有:
Logback整体流程:
因为核心对象与Log4J相承,所有配置的思路也类似于log4j的.properties文件。
<?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>
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"); } }
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是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
标签:
原文地址:http://www.cnblogs.com/pixy/p/4980603.html