logbackのhelloworld

一、概述
1.日志是啥?
当我是个逗比的时候我是这么理解的:log.debug()代替了system.out.print();
当我项目工作时,以为是一堆得.log文件。
这两天项目发布新版本,比较轻松,决定好好地研究下日志以及logback。
传送门1:日志的作用与方法: http://www.infoq.com/cn/articles/why-and-how-log
上面的作者很好的总结了日志的作用,其中一条非常印象深刻: 非预期执行,最近在做的项目中调用了微博的api,会返回一堆error_code的东东,我只会对特定的error_code处理,其他的一并返回false。这就产生了问题,如果返回false,但是日志里又看不到具体的错误原因,定位非常麻烦。
String value = son.toString();
if(save_failue_keys.contains(value)){
	builder.append("[").append(value).append("]");
	JsonNode err = node.get("error");
	if(err != null){
		builder.append(err.toString());
	}
	return SAVE_FAILURE;
}
//LOGGER.debug("微博转发失败原因{}",value);

加上注释的那段代码,就会很方便的定位问题。
2.logback是什么?
官方的说法:Logback is intended as a successor to the popular log4j project.这样说让log4j的开发者情何以堪,但是后来发现两个都是同一个人开发的。。。。。
传送门1:logback官方文档: http://logback.qos.ch/manual/introduction.html
二、最简单的helloworld
首先要3个jar:slf4j-api;logback-classic;logback-core;然后就可以直接搞起了。
清单:helloworld.java
public class HelloWorld {
	public static void main(String[] args) {
	    Logger logger = LoggerFactory.getLogger("Logback-HelloWorld");
	    logger.info("haha");
	}
}

控制台就可以输出:18:58:22.479 [main] INFO  Logback-HelloWorld - haha
什么都没配置,为什么就可以输出了呢?看下面一段代码。
清单2.helloworld2.java
public class HelloWorld2 {
    public static void main(String[] args) {
	    Logger logger = LoggerFactory.getLogger("Logback-HelloWorld2");
	    logger.info("haha");
	 // print internal state
	    LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
	    StatusPrinter.print(lc);
	}
}

控制台会输出:19:08:21.038 [main] INFO  Logback-HelloWorld2 - haha
19:08:20,978 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
19:08:20,978 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
19:08:20,978 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
19:08:20,978 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Setting up default configuration.
从上面的日志可以看出logback会默认的去加载3个文件,如果都没有找到,则会给我们设置一个默认的配置!
使用logback的三步:1.配置logback的环境:引包以及上面缺失的配置文件。
2.需要输出日志的类中创建一个Logger实例(推荐当前的类类名作为参数)
3.使用logger实例的输出方法( debug(), info(), warn() and error())。
三、logback.xml配置
首先介绍logback的三个核心对象:Logger、Appender、Layout
  Logger:日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、 PostreSQL、Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。
Layout:负责把事件转换成字符串,格式化的日志信息的输出。
logback.xml中的配置主要就是围绕着三个对象。
<configuration>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${user.dir}/log/myApp.log</file>
    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>
  
  <logger name="Logback-HelloWorld3" level="INFO"/>
  <root level="INFO">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="FILE"/>
  </root>
</configuration>

public class HelloWorld3 {
    public static void main(String[] args) {
	    Logger logger = LoggerFactory.getLogger("Logback-HelloWorld3");
	    logger.info("info");
	    logger.debug("debug");
	}
}

    整体的结构是:configuration节点下有appender;logger;root;其中appender和logger可以配置多个。root唯一。
    首先看配置文件中的两个appender,通过名称就可以很明显的看出一个是将日志输出到根目录下的log文件夹下的文件中,一个是将日志输出在控制台上。
    其次是logger,其中的name就是方法getLogger()传入的参数。可以像例中的root一样配置多个appender-ref,同时还会从root中继承appender-ref。
    运行helloworld3,控制台得到的日志是:
info  
debug 

    myApp.log中得到的日志是:
2014-07-31 20:25:17,545 INFO [main] Logback-HelloWorld3 [HelloWorld3.java:13] info
2014-07-31 20:25:17,545 DEBUG [main] Logback-HelloWorld3 [HelloWorld3.java:14] debug

当然实际项目中不可能这么简单,下面是公司用到的一个logback.xml配置文件。
<configuration scan="false" debug="false">
    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>

    <!-- To enable JMX Management -->
    <jmxConfigurator />

    <appender name="standard_out" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%-5level|%d{yyyy-MM-dd HH:mm:ss.SSS}|%thread|%-40.40logger{0}|%msg%n</pattern>
        </encoder>
    </appender>

    <appender name="surveyAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <file>${user.dir}/logs/survey_ws_info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${user.dir}/logs/survey_ws_info/%d{yyyy/MM/dd/yyyy_MM_dd}.log</FileNamePattern>
            <MaxHistory>180</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%-5level|%d{yyyy-MM-dd HH:mm:ss.SSS}|%thread|%-40.40logger{0}|%msg%n</pattern>
        </encoder>
    </appender>

    <appender name="surveyErrAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <file>${user.dir}/logs/survey_ws_err.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${user.dir}/logs/survey_ws_err/%d{yyyy/MM/dd/yyyy_MM_dd}.log</FileNamePattern>
            <MaxHistory>180</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%-5level|%d{yyyy-MM-dd HH:mm:ss.SSS}|%thread|%-40.40logger{0}|%msg%n</pattern>
        </encoder>
    </appender>
    
    <appender name="schedulerAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    	<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <file>${user.dir}/logs/survey_ws_scheduler.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${user.dir}/logs/survey_ws_scheduler/%d{yyyy/MM/dd/yyyy_MM_dd}.log</FileNamePattern>
            <MaxHistory>180</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%-5level|%d{yyyy-MM-dd HH:mm:ss.SSS}|%thread|%-40.40logger{0}|%msg%n</pattern>
        </encoder>
    </appender>

    <!-- 登录日志的输出源 -->
    <appender name="loginAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <Encoding>UTF-8</Encoding>
        <File>${user.dir}/logs/survey_ws_login.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${user.dir}/logs/survey_ws_login/%d{yyyy/MM/dd/'login_'yyyy_MM_dd}.log
            </FileNamePattern>
            <MaxHistory>180</MaxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%msg%n</pattern>
        </layout>
    </appender>

    <logger name="login" level="INFO" additivity="false">
        <appender-ref ref="loginAppender" />
    </logger>

    <logger name="org.springframework.web.servlet" level="ERROR" />
    <logger name="org.springframework.web.context.support" level="ERROR" />
    <logger name="org.springframework.beans.factory.config" level="ERROR" />
    <logger name="org.springframework.beans.factory.support" level="ERROR" />
    <logger name="org.springframework.beans.factory.xml" level="ERROR" />
    <logger name="org.springframework.web.servlet.mvc" level="WARN" />
    <logger name="org.springframework.web.servlet.handler" level="WARN" />
    <logger name="org.springframework.orm.hibernate3" level="ERROR" />
    <logger name="org.springframework.security.web" level="ERROR" />
    <logger name="org.springframework.security.config" level="ERROR" />
    <logger name="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" level="WARN" />
    <logger name="org.hibernate.cfg" level="ERROR" />
    <logger name="org.hibernate.util" level="ERROR" />
    <logger name="org.hibernate.connection" level="ERROR" />
    <logger name="org.hibernate.dialect" level="ERROR" />
    <logger name="org.hibernate.hql.ast" level="ERROR" />
    <logger name="org.hibernate.type" level="ERROR" />
    <logger name="org.hibernate.impl" level="ERROR" />
    <logger name="org.hibernate.transaction" level="ERROR" />
    <logger name="org.hibernate.engine.jdbc" level="ERROR" />
    <logger name="org.hibernate.annotations.common" level="ERROR" />
    <logger name="org.hibernate.jdbc.util" level="ERROR" />

    <!--<logger name="com.tonglukuaijian.survey.application.impl.DictDataServiceImpl" level="DEBUG" />
    <logger name="com.tonglukuaijian.survey.application.impl.SurveyServiceImpl" level="DEBUG" />
    <logger name="com.tonglukuaijian.survey.application.impl.SurveyQueryServiceImpl" level="DEBUG" />-->

    <logger name="org.apache.cxf.jaxrs.utils.FormUtils" level="WARN" />
    <logger name="org.apache.cxf.interceptor.LoggingInInterceptor" level="WARN" />
    <logger name="org.apache.cxf.interceptor.LoggingOutInterceptor" level="WARN" />

    <logger name="com.tonglukuaijian.survey.ws.scheduler.Scheduler">
    	<appender-ref ref="schedulerAppender" />
    </logger>

    <root level="INFO">
        <appender-ref ref="standard_out" />
        <appender-ref ref="surveyAppender" />
        <appender-ref ref="surveyErrAppender" />
    </root>
</configuration

以上是今天看官方文档的一些总结,还没有涉及到后面的filter,layout,欢迎指正。ps:看了几篇logback helloworld的文章,基本都是从官方文档上搬下来的。。果然英语好点才是王道。
传送门3: http://www.cnblogs.com/yongze103/archive/2012/05/05/2484753.html


   

你可能感兴趣的:(日志,logback)