使用Log4j为项目配置日志输出应用详细总结及示例演示.

Log4j组件构成

Log4j由三个重要的组件构成:

1.日志信息的优先级(Logger)

2.日志信息的输出目的地(Appender)

3.日志信息的输出格式(Layout)。

概要:

日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG,分别用来指定这条日志信息的重要程度;

日志信息的输出目的地指定了日志将打印到控制台还是文件中;

而输出格式则控制了日志信息的显示内容。

Log4j介绍

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

Log4j下载地址: http://logging.apache.org/log4j/2.x/download.html

Log4j配置文件的格式

Log4j支持两种配置文件格式:

1. XML格式的文件

2. properties格式的文件

也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。

Log4j定义配置文件

1.配置根Logger

其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

参数说明:  

level是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。

Off:最高等级,用于关闭所有日志记录

Fatal:指出每个严重的错误事件将会导致应用程序的退出。

Error:指出虽然发生错误事件,但仍然不影响系统的继续运行。

Warn:表明会出现潜在的错误情形

Info:一般用在粗粒度级别上,强调应用程序的运行全程

Debug:一般和在粗粒度级别上,强调应用程序的运行全程。

All:最低等级,用于打开所有日志记录。

Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。

appenderName就是指日志信息输出到哪个地方,可以同时指定多个输出目的地。

2.配置日志信息输出目的地Appender

其语法为:

复制代码
log4j.appender.appenderName = fully.qualified.name.of.appender.class   log4j.appender.appenderName.option1 = value1   ...   log4j.appender.appenderName.option = valueN
复制代码

Log4j提供的appender有以下几种:

  org.apache.log4j.ConsoleAppender(控制台)

  org.apache.log4j.FileAppender(文件)

  org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)

  org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生新文件)

  org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

3.配置日志信息的格式

语法为:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.option = valueN

Log4j提供的layout有以下几种:

  org.apache.log4j.HTMLLayout(以HTML表格形式布局),

  org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

  org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

%m输出代码中指定的消息  

%p输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL   

%r输出自应用启动到输出该log信息耗费的毫秒数   

%c输出所属的类目,通常就是所在类的全名   

%t输出产生该日志事件的线程名   

%n输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”   

%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyMMMddHH:mm:ss,SSS},输出类似:2002年10月18日22:10:28,921   

%l输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像javaservlets这样的多客户多线程的应用中。

%%:输出一个”%”字符 %F:输出日志消息产生时所在的文件名称

%L:输出代码中的行号

%m:输出代码中指定的消息,产生的日志具体信息

%n:输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。

如:

1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。

2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。

3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。

4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

log4j.xml的配置方式

View Code
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="appender1"class="org.apache.log4j.RollingFileAppender"><param name="File" value="logfile08.html" /><param name="MaxFileSize" value="1MB" /><param name="MaxBackupIndex" value="5" /><layout class="org.apache.log4j.HTMLLayout"></layout></appender><root><level value="debug" /><appender-ref ref="appender1" /></root>
</log4j:configuration>
复制代码

代码中使用Log4j

  在程序中使用Log4j之前,首先要将commons-logging.jar和logging-log4j-1.2.9.jar导入到classpath中,并将log4j.properties放于src根目录中。 在类中使用log4j,首先声明一个静态变量Loggerlogger=Logger.getLog("classname").现在就可以使用了。

用法如下:logger.debug("debugmessage")或者logger.info("infomessage").

1.得到记录器

  使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。

其语法为:

  publicstaticLoggergetLogger(Stringname)

  通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

  staticLoggerlogger=Logger.getLogger(ServerWithLog4j.class.getName())

2.读取配置文件

  当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

  BasicConfigurator.configure():自动快速地使用缺省Log4j环境。

  PropertyConfigurator.configure(StringconfigFilename):读取使用Java的特性文件编写的配置文件。

  DOMConfigurator.configure(Stringfilename):读取XML形式的配置文件。

3.插入记录信息(格式化日志信息)

  当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,语法如下:

   Logger.debug(Objectmessage);

   Logger.info(Objectmessage);

   Logger.warn(Objectmessage);

   Logger.error(Objectmessage);

程序演示

1.使用程序进行日志信息输出

复制代码
 1 package org.demo.log4j.dennisit;
 2 
 3 import java.io.IOException;
 4 
 5 import org.apache.commons.logging.impl.Log4JLogger;
 6 import org.apache.log4j.BasicConfigurator;
 7 import org.apache.log4j.FileAppender;
 8 import org.apache.log4j.Layout;
 9 import org.apache.log4j.Level;
10 import org.apache.log4j.Logger;
11 import org.apache.log4j.SimpleLayout;
12 
13 /**
14  *
15  *  @version : 1.1
16  *  
17  *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>
18  *    
19  *  @since      : 1.0        创建时间:    2013-1-1        下午03:19:42
20  *     
21  *  @function: 通过代码将日志输出
22  *
23  */
24 
25 public class Log4jPrintByCode {
26 
27     private static Logger logger = Logger.getLogger(Log4jPrintByCode.class);
28     
29     private Layout layout = new SimpleLayout();
30     private FileAppender fileAppender;
31     
32 
33     //使用构造依赖,创建对象时初始化
34     public Log4jPrintByCode(Layout layout, Level level,String distDir){
35         
36         BasicConfigurator.configure();        //使用默认的配置信息,不需要写log4j.properties
37         
38         try {
39             init(layout,level, distDir);
40         } catch (Exception e) {
41             e.printStackTrace();
42         }
43         
44     }
45     
46     
47     public void init(Layout layout, Level level,String distDir) throws Exception{
48         
49         logger.setLevel(level);                //设置日志输出级别
50         fileAppender = new FileAppender(layout,distDir,false);
51         logger.addAppender(fileAppender);    //添加输出端
52         
53     }
54     
55     
56     public static void main(String[] args) {
57         
58         SimpleLayout layout = new SimpleLayout();
59         String logDir = "log4jcode.Log";
60         Log4jPrintByCode log4jCode = new Log4jPrintByCode(layout,Level.INFO,logDir);
61         
62         
63         //下面信息将被输出
64         log4jCode.logger.info("log info print by log4j");
65         log4jCode.logger.warn("log warn print by log4j");
66         log4jCode.logger.error("log error print by log4j");
67         
68     }
69 
70 
71     public Layout getLayout() {
72         return layout;
73     }
74 
75     public void setLayout(Layout layout) {
76         this.layout = layout;
77     }
78 
79     public FileAppender getFileAppender() {
80         return fileAppender;
81     }
82 
83     public void setFileAppender(FileAppender fileAppender) {
84         this.fileAppender = fileAppender;
85     }
86     
87     
88     
89 }
复制代码

为了提高效率,我们可以在写日志前增加判断:

复制代码
// 记录debug级别的信息
if (logger.isDebugEnabled()) {logger.debug("This is debug message from Dao.");
}// 记录info级别的信息
if (logger.isInfoEnabled()) {logger.info("This is info message from Dao.");
}
复制代码

如果这个类作为基类,如J2EE中的BaseDao、BaseAction、BaseService等等,则我们可以将各层的日志信息分类输出到各个文件。

2.Log4J将同一个日志信息输出到多个目的地

应用实例将日志信息同时输出到控制台,文件和数据库中.

创建数据库与 表

复制代码
/* 创建数据库 */ 
create database db_log4j;/* 切换数据库 */
use  db_log4j;/* 日志信息表 */
create table tb_log(logId int not null auto_increment comment '流水号' ,createDate varchar(45) default null comment '日志生成时间' ,thread varchar(45) default null comment '当前线程',level varchar(45) default null comment '当前日志级别' ,class varchar(45) default null comment '生成日志的类',message varchar(245) default null comment '日志具体信息',primary key(logId)
);
复制代码

配置文件log4j.properties

复制代码
#定义3个输出端
log4j.rootCategory=INFO,A1,A2,A3#定义A1输出到控制器
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#定义A1的布局模式为PaternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# 定义A1的输出格式
log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n#定义A2输出到文件
log4j.appender.A2=org.apache.log4j.RollingFileAppender
#定义A2输出到哪个文件
log4j.appender.A2.File=./log/sysLog.log
#定义A2输出文件的最大长度
log4j.appender.A2.MaxFileSize = 1KB
#定义A2的备份文件数
log4j.appender.A2.MaxBackupIndex = 3
#定义A2的布局模式为PatternLayout
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
#定义A2的输出模式
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n#定义A3输出到数据库
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/db_log4j
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
#定义A3的布局和执行的SQL语句
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=INSERT INTO tb_log(createDate,thread,level,class,message) values('%d','%t','%-5p','%c','%m')
复制代码

Java测试代码

复制代码
package org.demo.log4j.dennisit;import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;/****  @version : 1.1*  *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>*    *  @since      : 1.0        创建时间:    2013-1-1        下午04:13:59*     *  @function: 通过配置文件控制日志信息输出到多个目的端**/public class Log4jPrintByConfigure {private static Logger logger = Logger.getLogger(Log4jPrintByConfigure.class);public static void main(String[] args) throws Exception {//加载log配置文件log4j.propertiesPropertyConfigurator.configure("configure/log4j.properties");//文件存放在src同目录的configure文件夹下//如果放在src下的话,参数应为"bin/log4j.properties"或者"src/log4j.properties", 建议以bin为准//以下信息将被打印输出logger.debug("logger print DEBUG messgae");logger.info("logger print INFO message");logger.warn("logger print WARN message");logger.error("logger print ERROR message");logger.fatal("Here is FATAL message");}}
复制代码

转载请注明出处[http://www.cnblogs.com/dennisit/archive/2013/01/01/2841603.html]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:27---new delete malloc free

上一节我讲了new和delete,有人问这不是和C语言的malloc/free为C的标准库函数差不多么 void* malloc(size_t size)//参数代表字节个数 void free(void* pointer)//参数代表内存地址new、delete则为C++的操作运算符,它调用的分别为赋值运算符重载operator new()和operator del…

C++:33---类成员指针

成员指针概述: 当初始化一个这样的指针时,我们令其指向类的某个成员,但是不指定该成员所属的对象直到使用成员指针时,才提供成员所属的对象成员指针是指可以指向类的非静态成员的指针一般情况下,指针指向一个对象,但是成员指针指向的是类的成员,而不是类的所创建出的对象…

C++:31---对象引用和赋值

一、对象移动概述 C++11标准引入了“对象移动”的概念对象移动的特性是:可以移动而非拷贝对象在C++旧标准中,没有直接的方法移动对象。因此会有很多不必要的资源拷贝标准库容器、string、share_ptr类既支持移动也支持拷贝。IO类和unique_ptr类可以移动但不能拷贝对象移动的特…

C++:34---union:联合/共用体,一种节省空间的类

一、联合(union)概述 联合(union)是一种特殊的类一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当我们给union的某个成员赋值之后,该union的其它成员就变成未定义的状态了。分配给一个union对象的存储空间至少要能容纳它的最大的数据成员类的某些…

leetcode205. 同构字符串 一般人一次做不对的简单题

给定两个字符串 s 和 t&#xff0c;判断它们是否是同构的。 如果 s 中的字符可以被替换得到 t &#xff0c;那么这两个字符串是同构的。 所有出现的字符都必须用另一个字符替换&#xff0c;同时保留字符的顺序。两个字符不能映射到同一个字符上&#xff0c;但字符可以映射自己…

C++:32---IO库

一、IO库 I0库类型和头文件头文件类型iostreamistream,wistream从流读取数据ostream,wostream向流写入数据iostream,wiostream读写流fstreamifstream,wifstream从文件读取数据ofstream,wofstream向文件写入数据fstream,wfstream读写文件sstreamistringstream,wistringst

leetcode209. 长度最小的子数组 借这个题规范一下双指针写法

给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组&#xff0c;返回 0。 示例: 输入: s 7, nums [2,3,1,2,4,3] 输出: 2 解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组…

C++(STL):01---pair容器

一、pair历史概述 C++标准库的第1版(C++98),提供了一个简单的class,用来处理类型不同的两个(一对)值,这个就是pair。到了C++11,pair被重新定义,有了很大扩展pair与tuple:tuple在TR1被引入,它是对pair的扩展tuple在后面详细概述。二、pair概述 特点: 一个pair保存两…

C++(STL):02---tuple容器

一、tuple的历史概述 Tuple是TR1引入的东西,它扩展了pair的概念,拥有任意数量的元素。在C++11标准之前,tuple最多带有10个类型不同的元素C++11,tuple被重新定义,采用variadic template概念,被设计为可用于任意大小的异质集合二、tuple概述 tuple与pair类似,也是一个模板…

C++(STL):06---数值的极值(numeric_limits类)

一、数值的极值概述 数值类型有着与平台相依的极值C++标准规定了各种类型必须保证的最小精度。这些最小值如下图所示: 类型最小长度char1byte(8bits)shortint2bytesint2byteslongint4bytes

leetocde 225. 用队列实现栈

使用队列实现栈的下列操作&#xff1a; push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。 你所使用的语…

C++(STL):03---智能指针之shared_ptr

一、shared_ptr类 头文件:#include<memory>智能指针,是一个模板。创建智能指针时,必须提供指针所指的类型如果当做前提条件判断,则是检测其是否为空shared_ptr<string> p1; //指向string shared_ptr<list<int>> p2;//指向int的list if(p1 &&…

C++(STL):05---智能指针之unique_ptr

一、unique_ptr类 头文件:#include<memory>智能指针,是一个模板。创建智能指针时,必须提供指针所指的类型与shared_ptr的不同之处: shared_ptr所指向的对象可以有多个其他shared_ptr智能指针而unique_ptr所指向的对象只能有一个unique_ptr指针,也就是自己。当unique…

JAVA中int、String的类型转换

int -> String int i12345; String s""; 第一种方法&#xff1a;si""; 第二种方法&#xff1a;sString.valueOf(i); 这两种方法有什么区别呢&#xff1f;作用是不是一样的呢&#xff1f;是不是在任何下都能互换呢&#xff1f; String -> int s"…

leetcode 231. 2的幂

给定一个整数&#xff0c;编写一个函数来判断它是否是 2 的幂次方。 示例 1: 输入: 1 输出: true 解释: 20 1 示例 2: 输入: 16 输出: true 解释: 24 16 示例 3: 输入: 218 输出: false 本题思路转载位运算的常用技巧&#xff1a;lowbit运算&#xff0c;包含lowbit公式、…

C++(STL):04---智能指针之weak_ptr

一、概念weak_ptr是一种不控制所指向对象生存期的智能指针&#xff0c;它指向一个shared_ptr管理的对象拥有“弱”共享的特点最重要的特点一个对象被多个shared_ptr类所指向时&#xff0c;就会拥有多个引用计数但是当weak_ptr指向一个shared_ptr类所指向的对象时&#xff0c;该…

C语言: const关键字与指针

const修饰指针的4种形式 const关键字,在C语言中用来修饰变量,表示这个变量是常量。const修饰指针有4种形式,区分清楚这4种即可全部理解const和指针。第一种:const int *p;第二种:int const *p;第三种:int * const p;第四种:const int * const p;ation ‘*p4’ // 第一种…

leetcode268. 缺失数字

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列&#xff0c;找出 0 .. n 中没有出现在序列中的那个数。 示例 1: 输入: [3,0,1] 输出: 2 示例 2: 输入: [9,6,4,2,3,5,7,0,1] 输出: 8 说明: 你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现? 众所周知&#…

C++(STL):07---vector之使用方式和常规用法

简单两三句话说下vector(一般领导讲话都说简单说两句,结果说了一个钟头): 介绍 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是…

leetcode276. 栅栏涂色

有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏&#xff0c;每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色&#xff0c;并且保证其中相邻的栅栏柱 最多连续两个 颜色相同。然后&#xff0c;返回所有有效涂色的方案数。 注意: n 和 k 均为非负的整数。 示例…