`
飞翔的马甲
  • 浏览: 4756 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

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


   
分享到:
评论

相关推荐

    springboot-helloworld.rar

    《SpringBoot HelloWorld初探》 在当今的Java开发领域,SpringBoot框架因其简化Spring应用的初始搭建以及开发过程而备受青睐。"springboot-helloworld.rar"这个压缩包,显然是一个入门级的示例,旨在帮助开发者快速...

    spring boot - hello world

    **Spring Boot Hello World 知识点详解** Spring Boot 是由 Pivotal 团队开发的框架,它旨在简化 Spring 应用程序的初始搭建以及开发过程。通过内嵌的Servlet容器,如Tomcat或Jetty,Spring Boot可以快速地创建独立...

    Helloworld.zip

    【标题】"Helloworld.zip" 是一个以 Maven 构建的简单 HelloWorld 工程示例,它使用 Logback 进行日志记录。这个压缩包包含了一个基础的 Java 应用程序,适合初学者了解 Maven 和 Logback 的基本用法。 【描述】...

    HelloWorld.zip

    【HelloWorld.zip】是一个入门级的Spring开发项目压缩包,其中包含了使用JavaSpring框架构建的基础应用。这个项目旨在帮助初学者理解Spring的核心概念,并提供了一个实际的代码示例。使用JDK版本为12,意味着它遵循...

    spring-boot-helloworld

    【Spring Boot HelloWorld】项目概述 Spring Boot是由Pivotal团队提供的全新框架,旨在简化Spring应用的初始搭建以及开发过程。它集成了大量的常用第三方库配置,如数据源、JPA、定时任务、缓存、消息、邮件等,...

    spring-boot的helloWorld

    在这个"spring-boot的helloWorld"程序中,我们将深入探讨Spring Boot的基本结构和关键特性。 1. **Spring Initializr**: 创建Spring Boot项目时,通常会用到Spring Initializr,这是一个在线工具或IDE插件,用于...

    SpringBoot第 1 讲:HelloWorld.zip

    在本教程中,我们将深入探讨SpringBoot框架,通过"SpringBoot第1讲:HelloWorld.zip"这个压缩包,我们开始入门学习。SpringBoot是Java开发中的一个流行框架,旨在简化Spring应用的初始搭建以及开发过程。它包含了...

    Logback用户手册中文版

    3.3. 用 logback-test.xml 或 logback.xml 自动配置 ............................................... 19 3.4. 自动打印警告和错误消息 ...........................................................................

    helloworld-dropwizard:Dropwizard hello world 应用程序

    "helloworld-dropwizard" 是一个简单的示例项目,用于演示如何使用 Dropwizard 创建一个基础的 "Hello, World!" 应用程序。下面将详细讲解 Dropwizard 的核心组件以及如何使用它来构建应用。 1. **Dropwizard 框架...

    logback-json-example:Logback JSON示例

    Logback JSON示例 该项目显示了如何配置Logback以登录JSON。 相关代码: 输出示例: logger . debug( " Hello world.... { " timestamp " : " 2018... " message " : " Hello world. " , " context " : " default " }

    HelloWorld-Springboot-App

    【HelloWorld-Springboot-App】是一个典型的Java项目,它基于Spring Boot框架构建,用于展示基本的Spring Boot应用开发流程。Spring Boot简化了创建独立、生产级别的基于Spring的应用程序,通过提供默认配置来消除...

    HelloWorld-DropWizard:我的第一个掉落向导项目

    【HelloWorld-DropWizard:我的第一个掉落向导项目】 DropWizard是一个基于Java的高性能、微服务框架,它封装了许多常用库,如Jersey(用于RESTful服务)、Jackson(JSON处理)、Guava(实用工具类)和Jetty(HTTP...

    demo-pedestal-hello:“Hello World”演示如何使用带有数据和拦截器的 Pedestal 进行日志记录和异常跟踪

    去看: Hello World! 在 src/demo_pedestal_hello/service.clj 阅读您的应用程序的源代码。 探索定义路由和响应的函数文档。 使用lein test运行应用程序的测试。 阅读 test/demo_pedestal_hello/service_test.clj...

    springboothelloworld.zip

    SpringBoot HelloWorld 示例是一个基础的Web应用,用于演示Spring Boot框架的基本使用。Spring Boot是由Pivotal团队提供的一个全新框架,其设计目标是用来简化新Spring应用的初始搭建以及开发过程。它集成了大量的...

    springboot_helloworld:springboot 的学习demo

    在 "springboot_helloworld" 这个学习 demo 中,我们可以探索以下几个关键知识点: 1. **Spring Initializr**: 创建项目时,通常会使用 Spring Initializr(http://start.spring.io)来初始化一个新的 Spring Boot ...

    springBoot-study:SpringBoot学习的相关工程并辅以博文讲解。主要包括入门的Hello World,自定义配置的获取,集成mybatis的xml和注解使用,集成jpa的使用,集成德鲁伊进行项目的监控,物体实战使用,项目打包,使用logback日志文件管理,添加过滤器和拦截器,多数据源,Restful风格的服务,集成弹性搜索,redis,netty,集成jsp和百里香叶,集成风暴,kafka等相关技术

    springBoot研究springBoot-study是本人在学习SpringBoot的一些工程!...工程说明 :SpringBoot的Hello World版本。启动程序,然后在浏览器输入http://localhost:8080//hello ,即可查看相关信息。 :SpringBo

    Spring Boot教程.pdf

    笔记从 Hello World 开始,逐步深入到配置文件、 Profile 模式、日志处理、Web 实战、模板引擎、错误处理机制等多个方面。 一、 Hello World Hello World 是 Spring Boot 的入门项目,通过建立简单的 Web 项目来...

Global site tag (gtag.js) - Google Analytics