转自紫风乱写:http://www.blogjava.net/justfly/archive/2014/08/10/416768.html,建议大家去原处学习

写在前面的话:

作为《Java程序员修炼之道》博文的第一个主题Logging,我计划中按照如下三篇来写:

  1. Logback的简单介绍和配置
  2. 在Java代码中如何使用SLF4J来写日志以及写日志的要点
  3. 作为一个程序员,在日常工作中如何分析和挖掘Log。

1. 缘起

写代码中的日志是一个除了用代码实现功能之外最基础最基础的一个技能了,是一个必须掌握的技能。但是目前为止,关于如何写日志的文章和书籍还是不多。

1.1 写日志的必要性

碰到QA提的一个bug的时候,我见识过两种方式的答复:a)请给我重现步骤和重现数据;b)把当时的日志给我。答复前者的,一般需要花很多时间去找问题出现在那里,如果是别人开发的模块的话,花费的时间更多。答复后者的,一般能很快的找到出问题的点,然后就可以开始进入修复的流程。

从概念上来说:日志是一个可运行的、可维护的软件的基础组成部分;通过日志,我们可以了解软件系统在运行中的实时状态,历史状态和异常状态等。一个没有良好日志的软件是所有人的噩梦。

如果你不想给自己找麻烦,你还是把日志好好写写。

1.2 为什么选Logback?

原因有俩:

  1. 我最近几年用的都是Logback
  2. 在前几天Log4j 2.0出来之前,logback的Logger用得比较爽
不过不管是Logback、Log4j还是别的什么Log框架,后继文章里面的关于写Log的一些技巧和建议都是适用的。

2. 如何配置Logback

下面会简单介绍一下Logback的配置,适用于开始配置和开始入门,适用于一般情况下的使用,如果想了解更多的信息,建议看看Logback的官方文档,写得很不错的。http://logback.qos.ch/manual/introduction.html

2.1 Logback简单介绍

简单来说就是Log4j 1流行了,发现有一些问题是无法解决的,于是又出来了Logback,在Log4j的基础上提升了性能,提高了功能等等。不过前几天又出来了Log4j 2,据说是相对于Logbak来说又提升了性能提高了功能。

2.2 关于SLF4J和Logback

SLF4J(slf4j.org)又称Simple Logging Facade for Java,是一个通用的logging接口,它试图一统Logging框架的天下,兼容了(Log4j 1, java.util.logging和Jakarta Commons Logging)这三个最流行的Logging框架。Logback就是SLF4J的默认实现。

2.3 依赖包导入

下文以Logback 1.1.2及slf4j1.7.6版本为例子。一般情况下,你按照我下面说的就可以了,如果不行的话,你可以去翻翻英文的文档:http://logback.qos.ch/setup.html

2.3.1 一般程序

Maven版

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.2</version>
</dependency>

非Maven版

http://logback.qos.ch/dist/logback-1.1.2.zip下载下来之后,在其根目录下有logback-core-1.1.2.jarlogback-classic-1.1.2.jar这俩个Jar,在logback-examples\lib下有slf4j-api-1.7.6.jar这个jar,把这三个Jar添加到你的代码包路径中。

2.3.2 非独立运行程序

如果你做的是一个Lib或者API,那么你就不应该依赖于具体的slf4j实现。所以你对logback的依赖应该是在运行测试代码的时候,具体实现方式如下文所示:

Maven版

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.6</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.2</version>
    <scope>test</scope>
</dependency>

当然了你是要把版本信息放在pom.xml中的<dependencies>还是<dependencyManagement>里面就你自己决定吧。

非Maven版

在发布的时候不要把只有Logback才用到jar打包进你的发布程序里面。(如果觉得绕口再多读两遍)

2.4 与遗留Logging框架兼容

目前行业除了Logback之外,广泛使用的还有其他四种Logging框架:

Log4j 2因为是刚出来的,目前SLF4J对其的兼容性还未知,对于其他的三种框架,SLF4J都提供了兼容性的支持。下面介绍了如何让Logbak兼容这些框架,另外,也可以阅读官方说明:http://www.slf4j.org/legacy.html

2.4.1 兼容Log4j 1和Apache Commons Logging

SLF4J对于Log4J 1和Apache commons Logging的支持方式是提供了实现Log4j和Apache commons Logging接口的SLF4J实现。使用方式是

  1. 去除对Log4J和Apache commons Logging的Jar包的引用
  2. 引入SLF4J的对应接口的实现包。

2.4.1.1 移除引用

如果你的系统是直接的使用了Log4j或者Apache commons Logging框架的话,你可以直接把对他们的引用去掉就可以了。如果是你所引用的第三方包里面引用了Log4j或者Apache commons Logging,可以使用<exclusions>标签去掉对他们的引用,如下所示:
<dependency>
  <groupId>org.springframework.ldap</groupId>
  <artifactId>spring-ldap-core</artifactId>
  <exclusions>
      <exclusion>
          <artifactId>commons-logging</artifactId>
          <groupId>commons-logging</groupId>
      </exclusion>
  </exclusions>
</dependency>

如何找到哪些第三方包引用了Log4j或者Apache commons Logging呢?有俩个方法:

  • 使用 mvn dependency:tree 命令,如下图所示,可以看出需要在org.springframework.ldap:spring-ldap-core中排除掉对Apache commons Logging的引用。
  • 第二种方式是使用Eclipse的m2e Maven插件。如下图所示,打开pom.xml文件后,选择Dependency Hierarchy标签,然后在Filter中输入logging或者log4j进行过滤,在左侧的Dependency Hierarchy中使用右键菜单就可以自动过滤了。

2.4.1.2 Maven导入对应的SLF4J实现包

<!-- Log4j 的SLF4J 实现 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>1.7.6</version>
</dependency>
<!-- Apache commons Logging 的SLF4J实现 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.6</version>
</dependency>

2.4.1.3 非Maven版导入对应的SLF4J实现包

直接删除掉log4j-1.**.jar和commons-logging-1.**.jar文件,把http://slf4j.org/dist/slf4j-1.7.6.zip下载下来,把压缩包里的log4j-over-slf4j-1.7.6.jar或者(和)jcl-over-slf4j-1.7.6.jar文件放到classpath中。

2.4.2 兼容java.util.logging

SLF4J的jul-to-slf4j模块实现了一个java.util.logging handler,该handler会把对java.util.logging的调用都转化成对SLF4J实现的调用。所以需要以下俩个步骤:

  1. 导入jul-to-slf4j模块
  2. 启用jul-to-slf4j模块

2.4.2.1 导入jul-to-slf4j模块maven版

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>1.7.6</version>
</dependency>

2.4.2.2 导入jul-to-slf4j模块非Maven版

http://slf4j.org/dist/slf4j-1.7.6.zip下载下来,把压缩包里的jul-to-slf4j-1.7.6.jar放到classpath中。

2.4.2.3 启用jul-to-slf4j模块

logging.properties中添加如下一行:

handlers = org.slf4j.bridge.SLF4JBridgeHandler 

2.5 Logback 配置文件简介

2.5.1 Logback配置文件名称、位置和编写策略

Logback 会按照如下的顺序在classpath中读取配置文件,如果读取到任何一个,则停止继续寻找。

  1. logback.groovy 这个是使用groovy语法的配置文件
  2. logback-test.xml
  3. logback.xml
如果以上三个文件都没能在classpath中找到,则会使用默认配置。默认配置如下:
  • 输出格式 %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
  • 输出方向:System.out
  • 输出级别:Debug
在我的经验中,基本上按照如下策略来配置Logback文件:
对于Maven项目
  • src/test/resources目录中放置logback-test.xml,该配置文件中log的输出是到输出到console,对于本应用的代码是debug级别,对于其他的是info级别。
  • src/main/resources目录中放置logback.xml,该配置文件中log的输出是输出到文件中,该文件每日滚动压缩打包备份,对于本应用的代码是info级别,对于其他的是warn级别。
对于非Maven项目
近10年里,我印象中没有做过非Maven的项目,所以提供不了经验,只能说说我知道的,供大家参考吧。
  • 对于web项目,logback.xml放置到WEB-INF/classes目录下,配置方式建议参考上面说的
  • 对于其他项目,放置到应用启动运行时的classpath根目录下

2.5.2 Logback配置文件示例

介绍Logback配置文件如何编写的有很多,我就不重复了,大家可以自己搜索一下。下面有两篇我觉得写得不错的,大家可以看一下:
 
公司项目的配置文件不方便贴出来,下面是我自己的个人项目中用的,加了一些注释,供大家参考。
logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
    <!--Appendar详解: http://logback.qos.ch/manual/appenders.html#RollingFileAppender -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 当前Log文件名 -->
        <file>ldap-pwd.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 非当天的Log文件压缩备份为 archive/ldap-pwd.2014-08-10.zip -->
            <fileNamePattern>archive/ldap-pwd.%d{yyyy-MM-dd}.zip</fileNamePattern>
            <!-- 超过30天的备份文件会被删除 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

<layout class="ch.qos.logback.classic.PatternLayout">
            <!-- 格式说明:http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout -->
            <Pattern>%d [%thread] %-5level %40logger{40} - %msg%n</Pattern>
        </layout>
    </appender>

<logger name="cn.justfly.training.logging" level="info" />

<root level="warn">
        <appender-ref ref="FILE" />
    </root>
</configuration>

logback-test.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d [%thread] %-5level %40logger{40} - %msg%n</pattern>
        </encoder>
    </appender>
    <logger name="cn.justfly.training.logging" level="debug" />

<root level="info">
        <appender-ref ref="Console" />
    </root>
</configuration>

Java程序员修炼之道 之 Logging(1/3) - Logback 配置(转)的更多相关文章

  1. java程序员修炼之道

    今天在论坛里看到了一位工作10年的java大牛总结的java程序员修炼之道,看完后给出的评价是:字字玑珠,深入人心,猛回头,自己一无是处··· 大牛告诉我们应该好好学习与修炼以下知识与技能 Java语 ...

  2. 《Java程序员修炼之道》

    原子类:java.util.concurrent.atomic 线程锁:java.util.concurrent.locks 对付死锁:boolean acquired = lock.tryLock( ...

  3. java程序员修炼之道——大牛告诉我们应该好好学习与修炼以下知识与技能

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 一:Java语言学习(对线程(thread),串行化,反射,网络编程,JNI技术, ...

  4. Java程序猿修炼之道 之 Logging(3/3) - 怎么分析Log

    1. 说明 作为一个程序猿我们常常要做一件事情:获取某个Log文件,从当中找出自己想要的信息. 本文总结了我在工作中使用了哪些工具来分析Log文件获取我想要的信息,我近期几年的工作环境都是server ...

  5. 《程序员修炼之道:从小工到专家》【PDF】下载

    <程序员修炼之道:从小工到专家>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196340 内容简介 <程序员修炼之道> ...

  6. 分享Java程序员50多道热门的多线程和并发面试题(答案解析)

    下面是Java程序员相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器 ...

  7. [No0000135]程序员修炼之道 Tips

    这一篇文章其实就是记录程序员修炼之道中的所有 Tips, 我讲会在之后的每周实践两个 Tip, 并对这两个 Tips 进行补充和说明自己的体会, 最终成为书中所说的卓有成效的程序员. Tip 1: C ...

  8. Java程序员修炼之路

    作者简介:王成委,CSDN知识库特邀编辑,Java高级工程师,熟悉Java编程语言和Oracle数据库.专注于高并发架构设计和大数据存储方向的研究. 我们为什么选择Java 大多数人选择Java可能只 ...

  9. Java程序员的10道XML面试题

    包括web开发人员的Java面试在内的各种面试中,XML面试题在各种编程工作的面试中很常见.XML是一种成熟的技术,经常作为从一个平台到其他平台传输数据的标准.XML面试问题包括用于转换XML文件的X ...

随机推荐

  1. 理解SQL Server的查询内存授予(译)

    此文描述查询内存授予(query memory grant)在SQL Server上是如何工作的,适用于SQL 2005 到2008. 查询内存授予(下文缩写为QMG)是用于存储当数据进行排序和连接时 ...

  2. Device eth0 does not seem to be present,delaying initialization解决方法

    Bringing up interface eth0:  Device eth0 does not seem to be present, delaying initialization. 在linu ...

  3. ok6410 android driver(7)

    This article talk about how to test device driver on JNI. There are two ways to test the device driv ...

  4. LeetCode - 30. Substring with Concatenation of All Words

    30. Substring with Concatenation of All Words Problem's Link --------------------------------------- ...

  5. 2 Orchard汉化资源包的使用

    Orchard安装完毕之后我们就可以在后台尝试做一些基本的操作感受下Orchard提供的一些功能,比如添加一个页面.菜单.文章什么的.也可以试着新建一些部件.布局之类的感受下.个人建议摆弄一下了解下就 ...

  6. SystemMenu类的用法

    先声明对象以及相应常数: //SystemMenu对象 private SystemMenu m_systemMenu = null; // ID 常数定义 (可变,只要不与系统冲突即可) priva ...

  7. 数据库sqlserver2008登陆名密码登陆不了怎么办?

    我用的是sql server2008数据库,原先创建的登录名是sa,但是密码就忘了.总是出现这个连接问题

  8. u-boot移植总结(二)LED点灯调试 和 u-boot加载地址

    (一)LED点灯调试 FL2440电路总共有4个LED0,LED1,LED2,LED3,分别接到板子GPB5,GPB6,GPB8,GPB10引脚.通过设置三个寄存器GPBCON(0x56000010) ...

  9. spring详解(1)

    1.  什么是spring? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发 ...

  10. java之StringBuilder类详解

    StringBuilder 非线程安全的可变字符序列 .该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍).如果可能,建议优先采用该类,因为在 ...