logbackのhelloworld

[b][size=large]一、概述[/size][/b]
[b]1.日志是啥?[/b]
当我是个逗比的时候我是这么理解的:log.debug()代替了system.out.print();
当我项目工作时,以为是一堆得.log文件。
这两天项目发布新版本,比较轻松,决定好好地研究下日志以及logback。
传送门1:日志的作用与方法:[url]http://www.infoq.com/cn/articles/why-and-how-log[/url]
上面的作者很好的总结了日志的作用,其中一条非常印象深刻:[u]非预期执行[/u],最近在做的项目中调用了微博的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);

加上注释的那段代码,就会很方便的定位问题。
[b]2.logback是什么?[/b]
官方的说法:Logback is intended as a successor to the popular log4j project.这样说让log4j的开发者情何以堪,但是后来发现两个都是同一个人开发的。。。。。
传送门1:logback官方文档:[url]http://logback.qos.ch/manual/introduction.html[/url]
[size=large][b]二、最简单的helloworld[/b][/size]
首先要3个jar:slf4j-api;logback-classic;logback-core;然后就可以直接搞起了。
[b]清单:helloworld.java[/b]
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
什么都没配置,为什么就可以输出了呢?看下面一段代码。
[b]清单2.helloworld2.java[/b]
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个文件,如果都没有找到,则会给我们设置一个默认的配置!
[b]使用logback的三步[/b]:1.配置logback的环境:引包以及上面缺失的配置文件。
2.需要输出日志的类中创建一个Logger实例(推荐当前的类类名作为参数)
3.使用logger实例的输出方法( debug(), info(), warn() and error())。
[size=large][b]三、logback.xml配置[/b][/size]
首先介绍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,控制台得到的日志是:
[table]
|info |
|debug |
[/table]
myApp.log中得到的日志是:
[table]
|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|
[/table]
当然实际项目中不可能这么简单,下面是公司用到的一个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:[url]http://www.cnblogs.com/yongze103/archive/2012/05/05/2484753.html[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值