一、概述
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,控制台得到的日志是:
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初探》 在当今的Java开发领域,SpringBoot框架因其简化Spring应用的初始搭建以及开发过程而备受青睐。"springboot-helloworld.rar"这个压缩包,显然是一个入门级的示例,旨在帮助开发者快速...
**Spring Boot Hello World 知识点详解** Spring Boot 是由 Pivotal 团队开发的框架,它旨在简化 Spring 应用程序的初始搭建以及开发过程。通过内嵌的Servlet容器,如Tomcat或Jetty,Spring Boot可以快速地创建独立...
【标题】"Helloworld.zip" 是一个以 Maven 构建的简单 HelloWorld 工程示例,它使用 Logback 进行日志记录。这个压缩包包含了一个基础的 Java 应用程序,适合初学者了解 Maven 和 Logback 的基本用法。 【描述】...
【HelloWorld.zip】是一个入门级的Spring开发项目压缩包,其中包含了使用JavaSpring框架构建的基础应用。这个项目旨在帮助初学者理解Spring的核心概念,并提供了一个实际的代码示例。使用JDK版本为12,意味着它遵循...
【Spring Boot HelloWorld】项目概述 Spring Boot是由Pivotal团队提供的全新框架,旨在简化Spring应用的初始搭建以及开发过程。它集成了大量的常用第三方库配置,如数据源、JPA、定时任务、缓存、消息、邮件等,...
在这个"spring-boot的helloWorld"程序中,我们将深入探讨Spring Boot的基本结构和关键特性。 1. **Spring Initializr**: 创建Spring Boot项目时,通常会用到Spring Initializr,这是一个在线工具或IDE插件,用于...
在本教程中,我们将深入探讨SpringBoot框架,通过"SpringBoot第1讲:HelloWorld.zip"这个压缩包,我们开始入门学习。SpringBoot是Java开发中的一个流行框架,旨在简化Spring应用的初始搭建以及开发过程。它包含了...
3.3. 用 logback-test.xml 或 logback.xml 自动配置 ............................................... 19 3.4. 自动打印警告和错误消息 ...........................................................................
"helloworld-dropwizard" 是一个简单的示例项目,用于演示如何使用 Dropwizard 创建一个基础的 "Hello, World!" 应用程序。下面将详细讲解 Dropwizard 的核心组件以及如何使用它来构建应用。 1. **Dropwizard 框架...
Logback JSON示例 该项目显示了如何配置Logback以登录JSON。 相关代码: 输出示例: logger . debug( " Hello world.... { " timestamp " : " 2018... " message " : " Hello world. " , " context " : " default " }
【HelloWorld-Springboot-App】是一个典型的Java项目,它基于Spring Boot框架构建,用于展示基本的Spring Boot应用开发流程。Spring Boot简化了创建独立、生产级别的基于Spring的应用程序,通过提供默认配置来消除...
【HelloWorld-DropWizard:我的第一个掉落向导项目】 DropWizard是一个基于Java的高性能、微服务框架,它封装了许多常用库,如Jersey(用于RESTful服务)、Jackson(JSON处理)、Guava(实用工具类)和Jetty(HTTP...
去看: Hello World! 在 src/demo_pedestal_hello/service.clj 阅读您的应用程序的源代码。 探索定义路由和响应的函数文档。 使用lein test运行应用程序的测试。 阅读 test/demo_pedestal_hello/service_test.clj...
SpringBoot HelloWorld 示例是一个基础的Web应用,用于演示Spring Boot框架的基本使用。Spring Boot是由Pivotal团队提供的一个全新框架,其设计目标是用来简化新Spring应用的初始搭建以及开发过程。它集成了大量的...
在 "springboot_helloworld" 这个学习 demo 中,我们可以探索以下几个关键知识点: 1. **Spring Initializr**: 创建项目时,通常会使用 Spring Initializr(http://start.spring.io)来初始化一个新的 Spring Boot ...
springBoot研究springBoot-study是本人在学习SpringBoot的一些工程!...工程说明 :SpringBoot的Hello World版本。启动程序,然后在浏览器输入http://localhost:8080//hello ,即可查看相关信息。 :SpringBo
笔记从 Hello World 开始,逐步深入到配置文件、 Profile 模式、日志处理、Web 实战、模板引擎、错误处理机制等多个方面。 一、 Hello World Hello World 是 Spring Boot 的入门项目,通过建立简单的 Web 项目来...