Java日志使用

  Java项目中常用的日志门面技术有commons-logging、slf4j,常用的日志实现技术有java.util.logging、log4j、logback。
  
  commons-logging是由apache提供的最早日志门面,提供一个功能有限的简单实现simple logger,实际使用中需加载具体的日志实现包。commons-logging在程序运行时,使用classloader从classpath动态绑定日志实现包,搜索顺序为log4j、java.util.logging、simple logger。一说是osgi不同的插件使用自己的classloader,导致commons-logging无法继续工作,就是说无法加载具体的日志实现包。项目中用其打日志,需给出commons-logging.jar,具体的日志库xxx.jar,并通过配置文件指定使用哪种实现库。

  slf4j,simple logging facade for java,其提供在程序运行前静态绑定日志实现包的功能,可解决commons-logging存在的动态加载问题,是目前推荐的日志门面技术。项目中用其打日志,需给出slf4j.jar,具体的日志库xxx.jar、门面桥接到具体日志库slf4j-xxx.jar,并通过绑定包slf4j-xxx.jar来指定使用哪种实现库。

  java.util.logging,在jdk1.4之后的版本给出的日志实现,功能比log4j少。
  log4j,目前推荐的日志实现,功能比较强大。
  由log4j的开发者推出的logback,作为log4j的替代者,有着更加优秀的功能。

  不管使用哪种日志实现库,日志门面就commons-logging和slf4j两种,明确这两种门面接口的使用就算是掌握了在java项目中打日志的方法。

===========================================

  早期Java项目使用最多的日志门面是commons-logging,log4j是推荐的日志实现库,需要的jar包为commons-logging.jar、log4j.jar。
  现今java项目推荐的日志门面是slf4j,log4j仍是推荐的日志实现库,需要的jar包为slf4j-api.jar、slf4j-log4j12.jar、log4j.jar,其中绑定包slf4j-log4j12.jar指定了要使用的实现库。
  commons-logging存在osgi问题,但早期项目多使用其作为日志门面,为保证兼容仍使用其作为日志门面,但通过slf4j的静态绑定技术来加载具体的日志库log4j,需要的jar包为commons-logging.jar、jcl-over-slf4j.jar、slf4j-api.jar、slf4j-log4j12.jar、log4j.jar,其中jcl-over-slf4j.jar将日志的接口重定向到slf4j。

// 使用log4j需先将日志的相关信息在属性文件properties或xml文件配置好,剩下的事情就是在项目中的适当位置打日志
public class LogTest {
    // slf4j接口使用
    // getLogger内调用slf4j-log4j.jar的StaticLoggerBinder类的getLogger,获取对应的log4j
    private static final Logger logger = LoggerFactory.getLogger(LogTest.class);

    // commons-logging接口使用
    // 与slf4j基本一样,一个用Logger,一个用Log
    private static final Log logger = LoggerFactory.getLogger(LogTest.class);

    public static void main(String[] args) {
        logger.trace("trace");
        logger.debug("dubug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }
}

===========================================

  log4j信息的配置有两种方式,属性文件properties配置和xml文件配置,其中properties配置简单、快速,xml配置严谨、规范。
  xml实现的功能比properties多,比如可以单独输出某一个级别的日志,而properties则是输出设定级别及其之上的所有日志,通常的建议是能用preperties不要用xml。

# properties配置详解

# 配置根Logger,语法为
# log4j.rootLogger = level, appender1, appender2, ..
# level日志级别,OFF、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、ALL
# 建议只使用DEBUG、INFO、WARN、ERROR四个级别
# 该级别类似开关,低于此级别的日志不会输出
# appender指定日志的输出目的地,可以有多个,名字可以随便取,但尽量见名知意
log4j.rootLogger = info, console, file, ....

# 配置日志输出目的地类,语法为
# log4j.appender.appender1 = className
#
# 目的地类有
# org.apache.log4j.ConsoleAppender 控制台
# org.apache.log4j.FileAppender 文件
# org.apache.log4j.DailyRollingFileAppender 每天生成一个文件
# org.apache.log4j.RollingFileAppender 文件大小超过规定标准后产生一个新文件
# org.apache.log4j.WriterAppender 以流的格式写到任意指定的地方
#
# 配置日志输出目的地类的选项,语法为
# log4j.appender.appender1.option1 = value1
#
# ConsoleAppender选项
# Threshold = level 日志输出最低级别
# ImmediateFlush = true/false 默认true,立即输出
# Target = System.err/out 默认值out,err为红色,out为黑色
#
# FileAppender选项
# Threshold、ImmediateFlush同上
# File = xx\xx\xx.log 输出路径与文件
# Append = true 默认true,表示追加,否则覆盖
# Encoding = UTF-8 编码
#
# DailyRollingFileAppender 选项
# Threshold、ImmediateFlush、File、Append、Encoding同上
# DatePattern='.'yyyy-ww/MM 每周 每月 '.'yyyy-MM-dd 每天
# '.'yyyy-MM-dd-HH 每时 '.'yyyy-MM-dd-HH-mm 每分 产生一个文件
#
# 配置日志格式类,语法为
# log4j.appender.appender1.layout = className
# 
# 格式类有
# org.apache.log4j.HTMLLayout HTML格式
# org.apache.log4j.PatternLayout 以指定格式输出
# org.apache.log4j.SimpleLayout 包括日志级别
# org.apache.log4j.TTCCLayout 包括日志时间、线程、类别等
# org.apache.log4j.xml.XMLLayout XML格式
#
# 配置日志格式类的选项,语法为
# log4j.appender.appender1.layout.option1 = value1
# 
# HTMLLayout选项
# LocationInfo = false 默认true,输出java文件名和行号
# Title = xxx 默认Log4J Log Messages
#
# PatternLayout选项
# ConversionPattern = %m%n 对日志信息格式化,类似C的printf
# %m 日志内容
# %p 日志级别
# %r 自应用启动到该日志输出的毫秒数
# %c 日志内容所在类的全名
# %t 日志内容所在方法名
# %n 回车换行
# %d 日志内容的输出时间,如:%d{yyyy-MM-dd HH:mm:ss}
# %l 日志内容所在的类、方法、行号
# %F 日志内容所在的文件名称
# %L 日志内容所在行号
# 
# XMLLayout选项
# LocationInfo同上

# 输出到控制台配置举例
log4j.appender.console= org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-d [ %t:%r ] - [ %p ] %m%n

# 输出到文件配置举例
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File = logs/log.log
log4j.appender.file.Append = true
log4j.appender.file.Threshold = info
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

// xml配置详解

// xml声明
<?xml version="1.0" encoding="UTF-8"?>
// DTD声明
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    // 配置根Logger 同上
    <root>
        <priority value ="debug"/>
        <appender-ref ref="conso"/>
        <appender-ref ref="file"/>
    </root>

    // additivity指定xfile是否继承缺省的配置
    <logger name="com.runway.bssp.activeXdemo" additivity="false">
        <priority value ="info"/>
        <appender-ref ref="xfile" />
    </logger>

    // 配置目的地 有五种 同上
    <appender name="conso" class="org.apache.log4j.ConsoleAppender">
        // 配置目的地选项
        ....

        // 配置日志格式和选项
        <layout class="org.apache.log4j.PatternLayout"
            <param name="ConversionPattern" value="%d %m %n" />
        </layout>

        // 配置过滤器和选项
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="levelMin" value="info" />
            <param name="levelMax" value="error" />
            <param name="AcceptOnMatch" value="true" />
        </filter>
    </appender>

    // 配置目的地
    <appender name="file" class="org.apache.log4j.RollingFileAppender">
        // 配置目的地选项
            <param name="File" value="D:/output.log" />
        <param name="Append" value="true" />
        // 设置文件最大尺寸
        <param name="MaxFileSize" value="1MB" />
        // 设置文件最大备份数
        <param name="MaxBackupIndex" value="10" />

        // 配置日志格式和选项
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %t - %m%n" />
        </layout>
    </appender>

    // 配置目的地
    <appender name="xfile" class="org.apache.log4j.DailyRollingFileAppender">
        // 配置目的地选项
        <param name="File" value="E:/activex.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />

        // 配置日志格式和选项
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %t - %m%n" />
        </layout>
    </appender>     
</log4j:configuration>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章