Java日志操作总结

(2008-04-21 17:39:06)

标签:

杂谈

 
.  使用Jakarta Commons Logging(JCL)

1.1. 概述

Apache的开源日志组件Jakarta CommonsLogging(JCL)提供的是一个日志(Log)接口(Interface),同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口,对其它一些日志工具,包括Log4J,Avalon LogKit, and JDK1.4等,进行了简单的包装。Commons-logging的目的是为“所有的JAVA日志实现”提供一个同一的接口,它本身的日志功能比较弱(只有一个简单的SimpleLog实现类),所以一般不会单独使用它,可以结合功能强大的Log4j使用。

1.2. 配置commons-logging

1.2.1           将commons-logging.jar导入工程,若使用log4j还需导入log4j-1.2.8.jar

1.2.2           JCL首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到就是使用其中的Log实现类

commons-logging.properties文件

# commons-logging.properties

#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog

# simplelog.properties

# # Logging detail level,

# # Must be one of ("trace", "debug", "info","warn", "error", or "fatal").

#org.apache.commons.logging.simplelog.defaultlog=trace

org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog

1.2.3           如果上面的步骤失败,Commons的Logging接着检查系统属性org.apache.commons.logging.Log。

1.2.4           如果找不到org.apache.commons.logging.Log系统属性,Logging接着在CLASSPATH中寻找log4j的类。如果找到了,Logging就假定应用要使用的是log4j。不过这时log4j本身的属性仍要通过log4j.properties文件正确配置。

1.2.5           如果上述查找均不能找到适当的Logging API,但应用程序正运行在JRE1.4或更高版本上,则默认使用JRE 1.4的日志记录功能。

1.2.6           最后,如果上述操作都失败,则应用将使用内建的SimpleLog。SimpleLog把所有日志信息直接输出到System.err。

1.3. 使用Log

1.3.1           导入所需的commons-logging类

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

1.3.2           利用LogFactory创建Log实例

private static final Loglog =LogFactory.getLog(ApacheLoggingDemo.class);

1.3.3           使用org.apache.commons.logging.Log类的成员方法输出日志信息

log.info("commons-logging infomessage");

log.debug("debug message");

log.error("error message");

log.warn("warnning message");

log.trace("trace message");

2.   使用JDK1.4Logger

2.1.概述

sun在JDK1.4提供了一个专门处理日志的记录包:java.util.logging,它可以对程序中的日志记录进行相当复杂的控制。例如:通过它可以指定日志级别和日志的位置(控制台、文件、Email等),我们可以自己手动创建子记录器,通过它可以用程序控制的方式来指定记录的内容,也可以使用配置文件来指定,而不需要改动程序。

2.2.使用Logger

2.2.1           在工程中创建配置文件logging.properties,内容如下:

# "handlers" specifies a comma separated list oflog Handler

handlers =java.util.logging.FileHandler,java.util.logging.ConsoleHandler

# Default global logging level.

.Level = INFO

# default file output is in user's homedirectory.

java.util.logging.FileHandler.pattern =runtime.log

java.util.logging.FileHandler.limit = 50000

java.util.logging.FileHandler.count = 2

java.util.logging.FileHandler.formatter =java.util.logging.XMLFormatter

# Limit the message that are printed on the consoleto INFO and above.

java.util.logging.FileHandler.level = INFO

java.util.logging.ConsoleHandler.formatter =java.util.logging.SimpleFormatter

说明:通过以上的配置,在处理日志时,就会将日志信息写入runtime.log文件中,并且在控制台也显示,若在工程中没有配置logging.properties文件,系统就会自动加载jre/lib/logging.properties配置文件内容,默认是ConsoleHandler意味着日志信息在控制台显示。

2.2.2           创建日志管理器LogManager实例并加载配置文件(logging.properties)

LogManager logMgr = LogManager.getLogManager();

FileInputStream fin = new FileInputStream(newFile(

"src/logging.properties"));

logMgr.readConfiguration(fin);

2.2.3           创建记录器Logger,并将其添加到当前日志管理器

log =Logger.getLogger(this.getClass().getName());

logMgr.addLogger(log);

2.2.4           使用记录器记录日志

log.fine("the fine message");

log.warning("the warning message");

log.info("the info message");

log.severe("The severe message");

3.  使用Log4j

3.1. 概述

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIXSyslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

3.2. Log4j配置

3.2.1           加入log4j-1.2.8.jar到你的工程当中

3.2.2           在工程的classpath下创建log4j.properties配置文件,内容如下:

### direct log messages to stdout ###

log4j.rootLogger=info,stdout

log4j.rootLogger=debug,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target=System.out

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d{yyy-MM-ddHH:mm:ss } [%t] %5p %c{1}:%L - %m%n

#log4j.logger.org.hibernate=fatal

#log4j.logger.net.sf.hibernate=fatal

#log4j.logger.net.sf.hibernate.SQL=fatal

#log4j.logger.net.sf.hibernate.type=fatal

#log4j.logger.net.sf.hibernate.tool.hbm2ddl=fatal

# Set root logger level to DEBUG and its onlyappender to A1.

#log4j.rootLogger=debug, stdout, R

#log4j.rootLogger=debug,R

#log4j.appender.stdout=org.apache.log4j.ConsoleAppender

#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and linenumber.

#log4j.appender.stdout.layout.ConversionPattern=%5p[%t] (%F:%L) - %m%n

# Print the date in ISO 8601 format

#log4j.appender.stdout.layout.ConversionPattern=%d[%t] %-5p %c - %m%n

#log4j.appender.R=org.apache.log4j.RollingFileAppender

#log4j.appender.R.File=example.log

#log4j.appender.R.MaxFileSize=100KB

# Keep one backup file

#log4j.appender.R.MaxBackupIndex=1

#log4j.appender.R.layout=org.apache.log4j.PatternLayout

#log4j.appender.R.layout.ConversionPattern=%p %t %c- %m%n

# Print only messages of level WARN or above in thepackage com.foo.

#log4j.logger.com.foo=WARN

3.2.3           在输出日志信息的类中使用Log4j

得到Log实例还有另外一种方式(利用LogFactory):

private static final Log logx =LogFactory.getLog(Log4jTest.class);

使用这种方式时要用到struts的commons-logging.jar

在实际应用中commons-logging+log4j无疑是最好的选择

3.3. Log4j配置文件详解

3.3.1       根类别

配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName,...
level 是日志记录的类别
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
类别level 为OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定义的优先级。
og4j常用的优先级FATAL>ERROR>WARN>INFO>DEBUG
配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
如果为log4j.rootLogger=WARN,则意味着只有WARN,ERROR,FATAL被输出,DEBUG,INFO将被屏蔽掉。
举例:log4j.rootLogger=INFO,stdout,Runlog,Errorlog
根日志类别为INFO,DEBUG将被屏蔽,其他的将被输出。stdout,Runlog,Errorlog分别为3个输出目的地。

3.3.2       常用输出格式

-X号:X信息输出时左对齐;
%p:日志信息级别
%d{}:日志信息产生时间
%c:日志信息所在地(类名)
%m:产生的日志具体信息
%n:输出日志信息换行
举例:
log4j.appender.stdout.layout.ConversionPattern=%5p%d{yyyy-MM-ddHH:mm:ss}

3.3.3       输出布局

使用的输出布局,其中log4j提供4种布局:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
举例:
输出格式为HTML表格
log4j.appender.stdout.layout=org.apache.log4j.HTMLLayout

3.3.4       日志信息的输出目的地

配置日志信息输出目的地Appender,其语法为
log4j.appender.appenderName =fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.option = valueN
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
log4j支持的输出目的地:
org.apache.log4j.ConsoleAppender 控制台
org.apache.log4j.FileAppender 文件
org.apache.log4j.DailyRollingFileAppender每天产生一个日志文件
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
org.apache.log4j.net.SMTPAppender 邮件
org.apache.log4j.jdbc.JDBCAppender 数据库
其他如:GUI组件、甚至是套接口服务器、NT的事件记录器、UNIXSyslog守护进程等
举例:
输出到控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender(指定输出到控制台)
log4j.appender.Threshold=DEBUG(指定输出类别)
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout(指定输出布局)
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c-%-4r [%t] %-5p %c %x - %m%n(指定输出格式)
输出到文件
 log4j.appender.FILE=org.apache.log4j.FileAppender(指定输出到文件)
 log4j.appender.FILE.File=file.log(指定输出的路径及文件名)
 log4j.appender.FILE.Append=false
 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout(指定输出的布局)
  log4j.appender.FILE.layout.ConversionPattern=[framework]%d - %c -%-4r [%t] %-5p %c %x - %m%n(指定输出的格式)
输出到文件(轮换"日志文件",当日志文件达到指定大小时,该文件就被关闭并备份,然后创建一个新的日志文件)
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender(指定输出到文件)
log4j.appender.ROLLING_FILE.Threshold=ERROR(指定输出类别)
log4j.appender.ROLLING_FILE.File=rolling.log(指定输出的路径及文件名)
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB(指定输出到文件的大小)
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout(指定采用输出布局)
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d- %c -%-4r [%t] %-5p %c %x - %m%n(指定采用输出格式)

3.4. 修改日志级别

3.4.1       在程序中修改

private static final Loggerlog =Logger.getLogger(YouClassName.class);

public static voidmodify(){

log.setLevel(Level.DEBUG);

}

通过Logger的setLevel方法来进行修改

Log4j日志的常用级别按优先级顺序可以分为:

TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF

但常用的就只有5个:DEBUG,INFO,WARN,ERROR,FATAL

DEBUG:致命错误

ERROR:错误

WARN:警告

INFO:常用信息

DEBUG:调试信息

TRACE:细节

3.4.2       通过配置文件修改

通过配置文件(log4j.properties)可以配置指定Logger类的日志显示级别,如:

指定com.xx.foo.TestClass类中的日志级别为INFO,输出为stdout定义:

Log4j.logger.com.xx.foo.TestClass = INFO,stdout

指定com.xx.foo包下的所有类的日志级别为DEBUG,输出为stdout定义:

Log4j.logger.com.xx.foo = DEBUG,stdout

名称为IAMLogInfo日志,日志级别为INFO,输出目标为控制台

Log4j.logger.IAMLogInfo = INFO,console

Java日志操作总结相关推荐

  1. JAVA记录操作日志步骤

    项目地址:https://gitee.com/Selegant/logs-demo.git 说明 系统日志不论是在日常的管理还是维护中都会起到很大的作用,但是在日志的记录中通常会存在很多的问题 日志记 ...

  2. java 日志 生成_Java日志(转)

    日志对于一个系统来说非常重要,查找异常信息.分析系统运行情况等都需要用到日志.所以无论是JDK还是第三方都提供了关于日志的相关工具,本文分别介绍以下几种工具,以及各种工具间的整合.原理. JDK的ja ...

  3. Java日志的心路历程

    大家好,我是头发还很多的阿星 今天来和大家聊聊Java日志体系,Java日志体系可以说是五花八门,眼花缭乱. 导致很多小伙伴因为日志标准库之间复杂的关系而感到烦恼,不知道统一系统的日志标准库需要依赖哪 ...

  4. 使用Log4j进行日志操作(牛小浩)不错的

    使用Log4j进行日志操作   一.Log4j简介   (1)概述 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是 ...

  5. 各种Java日志框架的比较

    2019独角兽企业重金招聘Python工程师标准>>> Log4j Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件. ...

  6. Java 日志缓存机制的实现--转载

    概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打印 ...

  7. 分布式文件系统—HDFS—Java API操作

    原文作者:jiangw-Tony 原文地址:HDFS基础使用 hdfs 在生产应用中主要是客户端的开发,其核心步骤是从 hdfs 提供的 api 中构造一个 HDFS的访问客户端对象,然后通过该客户端 ...

  8. 循序渐进看Java web日志跟踪(2)-Java日志API认识

    接触过Java的朋友应该都会知道,java的开源框架百花齐放,实现同样的功能,总能找到几个强大的开源框架来进行选择.在日志方面,Java同样不逊色.除了JDK本身自带的简单的日志工具,java还有如l ...

  9. java日志——基本日志+高级日志

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java日志--基本日志+高级日志 的相关知识: [1]记录日志 1.1)出现的问题和解决方法 ...

最新文章

  1. 魅族手机使用应用沙盒一键修改位置数据
  2. CentOS安装和配置Mysql
  3. 使用ajaxfileupload.js实现文件上传
  4. [html] viewport常见设置都有哪些?
  5. EJB是什么?EJB的概念分析与理解(copy)
  6. 09-Flutter移动电商实战-移动商城数据请求实战
  7. python输出子列表_python利用递归函数输出嵌套列表的每个元素
  8. Java判断字符串是否是数值
  9. C#:XML操作类--转
  10. 修复Ubuntu系列pip
  11. 【不积跬步,无以致千里】DELETE SINGLE IPTABLES RULES
  12. html科学计算器,html+css+js实现科学计算器
  13. 一个线性四叉树编码的试题
  14. sequel pro 格式化sql
  15. 写一篇本科/硕士毕业论文究竟需要看多少篇文献?
  16. 细说共模干扰和差模干扰(四个腿的电感是什么?有什么作用?)
  17. UE5 预览版载具模板工程车不能移动的问题
  18. python绘制树状excel表格_Python-使用XlsxWriter模块在Excel工作表中绘制柱形图
  19. IT常用职位缩写总结
  20. win7软件图标异常解决

热门文章

  1. NS3使用过程中重要内容整理
  2. 【渝粤教育】国家开放大学2018年春季 0184-21T行政职业能力 参考试题
  3. [渝粤教育] 西南科技大学 国际贸易理论与实务 在线考试复习资料2021版(2)
  4. 网络 计算机不显示不出来,网页图片显示不出来怎么办 网络故障解决【详解】...
  5. php只显示一部分文章,typecho同一个页面下调用不同分类的文章但是却只显示一个分类文章...
  6. flutterapp部分手机无法打开_Flutter应用程序在最新更新后无法运行
  7. 发言稿开场白范文_发言稿开场白
  8. prove, verify, bear out, demonstrate, confirm, validate, testify, certify 的区别
  9. 江苏省计算机等级知识,江苏省计算机二级考试基础知识_计算机基础练习题
  10. C语言实用算法系列之冒泡排序、sizeof与strlen的区别