在实际的项目开发和维护中,日志是经常用到的一个内容。遇到问题的时候,经常需要通过日志去查出问题的所在并解决问题。

通常我们会用:

System.out.println(xxx);

来打印运行中所需要的内容。但在日志非常多的情况下,或者在项目上线的情况下,这种方式就狠不实用了。总不能盯着控制台看日志吧?如果想看前段时间的日志呢?如果要大批的改变日志打印出的内容呢?如果想只看异常信息的日志呢?所以,要使用日志组件。

Java中的日志组件有很多,如:Apache的log4j、commons-logging.jar,slf4j(slf4j做的是包装简化的工作,是把底层jdk中的日志等内容包装了)。jdk中也有日志,java.util.logging.Logger。目前在工作中接触的也就是log4j了。

log4j是apache下的一个开源项目。官网: http://logging.apache.org/, 其中有Apache下各个编程语言的日志组件。log4j现在有2和1,现在用1版本的(2版本目前还是beta版),下载log4j,其中包含log4j的jar包。版本下载1最新的log4j-1.2.17.jar。下载后,解压,把log4j的jar包放入项目的lib下,就可以开始使用了。

一、

(1)在程序中写日志,如下:

 import org.apache.log4j.Logger;

 public class LoggerTest {
private Logger log = Logger.getLogger(LoggerTest.class);//创建Logger对象,构造函数的参数写该类的class,表明是该类中的日志,日志中打印的信息中,类名也是这个 public void add() {
//1. 写日志
log.debug("LoggerTest debug message");
log.info("LoggerTest info message");
log.warn("LoggerTest warn message");
log.error("LoggerTest error message");
log.fatal("LoggerTest fatal message");
//log输出的规则: debug < info < warn < error < fatal
}
}

log4j中的日志分五个级别,分别是debug、info、warn、error、fatal,它们的级别高低是:debug < info < warn < error < fatal。在配置文件中可以设置日志的输出级别,只有该级别的和高于该级别的日志才可以被看到。比如,在配置文件中设置的输出级别是warn,那么只有输出级别为warn、error、fatal的日志才会输出,debug和info的日志不会被输出。
该例子中,当执行到log.xxx(xxx);方法的时候,日志就会按照配置文件中的设置输出。接下来看如何写配置文件。

(2)写配置文件

在源文件包中建一个名为log4j.properties的文件(文件名固定)。

下载的log4j包中,example文件夹里是一些例子,可以参考其中的sort1.properties,sort2.properties...来写配置文件。

官网上的Java Doc是log4j的API,供查询参考。

①先看一个基本的写法:

 log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=(%d)[%m]--%l%n log4j.rootLogger=DEBUG,A1

第一行:表示日志的输出方式。A1是我们自己起的名字。值是ConsoleAppender类的完全限定名。ConsoleAppender表示在控制台上输出。

第二行:日志的输出形式

第三行:输出的格式,其中的括号、中括号、横线,都是普通字符,为了显示的好看而已,没有其他含义。各个"%"+字母的含义如下:

 %m 输出代码中指定的消息
%p 输出优先级, 即DEBUG, INFO, WARN, ERROR, FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目, 通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符, Windows平台为“/r/n” , Unix平台为“/n”
%d 输出日志时间点的日期或时间, 默认格式为ISO8601, 也可以在其后指定格式, 比如: %d{yyy MMM dd
HH:mm:ss , SSS}
%l 输出日志事件的发生位置, 包括类目名、 发生的线程, 以及在代码中的行数。

%m:指我们在代码中写的输出日志的内容。%l输出的内容比较全,也通常是开发者要看的。例子:(%d)[%m]--%l%n输出的样子是:

(2013-03-28 09:28:46,130)[LoggerTest debug message]--com.google.test.LoggerTest.add(LoggerTest.java:16)

(2013-03-28 09:28:46,156)[LoggerTest info message]--com.google.test.LoggerTest.add(LoggerTest.java:16)

(2013-03-28 09:28:46,256)[LoggerTest warn message]--com.google.test.LoggerTest.add(LoggerTest.java:16)

(2013-03-28 09:28:46,316)[LoggerTest error message]--com.google.test.LoggerTest.add(LoggerTest.java:16)

(2013-03-28 09:28:46,356)[LoggerTest fatal message]--com.google.test.LoggerTest.add(LoggerTest.java:16)

第五行:rootLogger表示,src代码包下的所有包的日志级别,和使用的配置的名字。

%m是log.debug等里面写的内容

②当项目部署到服务器上后,通常把日志存在文件中,便于查找问题时使用,写法如下:

 log4j.appender.fout=org.apache.log4j.FileAppender
log4j.appender.fout.layout=org.apache.log4j.PatternLayout
log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m\r\n
log4j.appender.fout.file=C:/logs/system.log
log4j.rootLogger=DEBUG, fout

第一行:使用FileAppender

第四行:写上存放日志的路径。

    可以在log4j的apidoc中查看类FileAppender,file是FileAppender的属性,这一行我们给file属性赋值。

③上一种方法日积月累之后,日志文件会变的非常大,可能上G。查看这么大的log文本,实在是不方便。通常会按照日期存放日志。

 log4j.appender.fout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fout.layout=org.apache.log4j.PatternLayout
log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m\r\n
log4j.appender.fout.DatePattern='.'yyyy-MM-dd
5 log4j.appender.fout.Threshold=INFO
log4j.appender.fout.file=C:/logs/x.log

第一行:使用DailyRollingFileAppender

第四行:表示按照日来存放日志,到了第二天,第一天的日志名称就自动由"x.log"变成"x年-月-日.log"

第五行:表示存到文件中的日志的级别。如果同时写的有:log4j.rootLogger=DEBUG, fout级别以第五行的为准

该部分可以写多个,然后设置不同的log级别,这样不同级别的log就存放在不同的文件里了。

④日志也可以根据源文件的包来存放

 log4j.appender.fout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fout.layout=org.apache.log4j.PatternLayout
log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m\r\n
log4j.appender.fout.DatePattern='.' yyyy-MM-dd
log4j.appender.fout.file=C:/logs/x.log log4j.logger.com.google=ERROR, fout

第七行:log4j.logger后面加上包名,表名这个包里的日志的输出设置是fout,级别是error

二、今天看了公司项目的日志,发现是在XML文件里配置的。看了一遍,会了用properties,这个XML就也能看懂,只是换了一种写法而已。

在下载的log4j包中,有XML配置log4j的例子。这里附上一个项目里的例子log4j.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="false"> <appender name="COMMON" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="log/common.log" />
<param name="MaxFileSize" value="10MB" />
<param name="MaxBackupIndex" value="5" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>
<appender name="ASYNC-COMMON" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="8192" />
<appender-ref ref="COMMON" />
</appender>
<category name="google.common">
<param name="additivity" value="false" />
<priority value="ERROR" />
<appender-ref ref="ASYNC-COMMON" />
</category> <appender name="UNCATEGORIZED" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="log/uncategorized.log" />
<param name="MaxFileSize" value="30MB" />
<param name="MaxBackupIndex" value="5" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%c] - %m%n" />
</layout>
</appender>
<appender name="ASYNC-UNCATEGORIZED" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="8192" />
<appender-ref ref="UNCATEGORIZED" />
</appender> <appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="ERROR"></param>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n"></param>
</layout>
</appender> <root>
<level value="ERROR" />
<appender-ref ref="ASYNC-UNCATEGORIZED" />
<appender-ref ref="console" />
</root>
</log4j:configuration>

分段解释这个例子:

   <appender name="COMMON" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="log/common.log" />
<param name="MaxFileSize" value="10MB" />
<param name="MaxBackupIndex" value="5" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>
<appender name="ASYNC-COMMON" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="8192" />
<appender-ref ref="COMMON" />
</appender>
<category name="google.common">
<param name="additivity" value="false" />
<priority value="ERROR" />
<appender-ref ref="ASYNC-COMMON" />
</category>

<appender>对应properties文件的log4j.appender,对应org.apache.log4j.Appender接口

行1:用的是RollingFileAppender(可以在log4j的apidoc中查看这些类和接口,<param>中的name是类的属性或者方法,value是我们给这些属性填的值)。API中:

RollingFileAppender在当日志文件达到一定大小时,备份日志。

File参数,对应log4j.appender.file

MaxFileSize,日志文件的最大大小,当达到这个大小之后,会自动备份。备份的文件名后加上序号:.1,.2

MaxBackupIndex,备份的最大索引,这里是5,即文件名最大的是:common.log.5

<layout>对应log4j.appender.file.layout

<param name="ConversionPattern" value="%m%n">对应log4j.appender.file.layout.ConversionPattern="%m%n"

行10:org.apache.log4j.AsyncAppender,API中:

AsyncAppender使日志异步。它收集事件发送,然后递送事件给绑定到AsyncAppender的appender,可以给AsyncAppender绑定多个appender,AsyncAppender会用单独的线程给在缓冲区中的事件服务。

行11:BufferSize定义缓冲区的大小

行12:<appender-ref />是绑定到这个AsyncAppender的appender的名字

行14:<category /> API中:This class has been deprecated and replaced by the Logger subclass

  即这个标签已经过时了,被logger代替,相当于properties中的log4j.logger

  name属性值:项目中的包名。

  <priority />被level代替,表示日志的输出级别

  这一段相当于log4j.logger.google.common=ERROR,ASYNC-COMMON(ASYNC-COMMON的输出级别:ERROR)

   <appender name="UNCATEGORIZED" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="log/uncategorized.log" />
<param name="MaxFileSize" value="30MB" />
<param name="MaxBackupIndex" value="5" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%c] - %m%n" />
</layout>
</appender>
<appender name="ASYNC-UNCATEGORIZED" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="8192" />
<appender-ref ref="UNCATEGORIZED" />
</appender> <appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="ERROR"></param>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n"></param>
</layout>
</appender> <root>
<level value="ERROR" />
<appender-ref ref="ASYNC-UNCATEGORIZED" />
<appender-ref ref="console" />
</root>

行22:相当于log4j.rootLogger=ERROR, ASYNC-UNCATEGORIZED,console

XML的写法说的比较繁琐,其实呢,这两种是相通的,只是写法不同。

log4j组件的用法(log4j1)的更多相关文章

  1. Vue组件基础用法

    前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...

  2. layui(七)——rate组件常见用法总结

    layui中提供了rate组件,用法很简单,直接上代码. <div id="test1"></div> <script> layui.use(' ...

  3. log4j一些配置用法

    Log4j基本用法----日志级别 基本使用方法: Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN.INFO ...

  4. Log4j的常见用法

    对于log4j,一般常用的只要保存如下的内容为属性文件即可: #log4j.rootLogger=DEBUG,A1,R log4j.rootLogger=INFO,A1,R log4j.appende ...

  5. layui(三)——laypage组件常见用法总结

    laypage 的使用非常简单,指向一个用于存放分页的容器,通过服务端得到一些初始值,即可完成分页渲染.核心方法: laypage.render(options)  来设置基础参数. 一.laypag ...

  6. [UE4]虚幻4 spline组件、spline mesh组件的用法

    最近公司项目需要,把这两个东东好好看了下.不得不说,这两个组件还是非常方便的,但是相关的介绍.教程却非常的少.它们概念模糊,用法奇特,我就总结下吧. 首先,先要明白spline component.s ...

  7. slf4j log4j logback相关用法

    Java的简单日志门面( Simple Logging Facade for Java SLF4J)作为一个简单的门面或抽象,用来服务于各种各样的日志框架,比如java.util.logging.lo ...

  8. 中间件:ElasticSearch组件RestHighLevelClient用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.基础API简介 1.RestHighLevelClient RestHighLevelClient的API作为ElasticSearch备 ...

  9. 开源.NET FTP组件edtFTPnet 用法

    edtFTPnet官方网站:http://www.enterprisedt.com/products/edtftpnet/ 目前最新版本为2.2.3,下载后在bin目录中找到edtFTPnet.dll ...

随机推荐

  1. angularjs drag and drop

    angular-dragula Drag and drop so simple it hurts 480 live demo angular-drag-and-drop-lists Angular d ...

  2. C# System.Collections.ArrayList

    using System; using System.Collections; public class SamplesArrayList { public static void Main() { ...

  3. PPTP 在Centos 7.1 建立方法与失效处理

    # yum install pptp pptp-setup pptpsetup --create vpn --server  (serverName) --username (Username)  - ...

  4. c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数

    每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A ...

  5. 【Linux】使用w命令和uptime命令查看系统负载

    在Linux系统中查询系统CPU和内存的负载(使用率)时,我们通常习惯于使用top.atop或者ps,这篇文章将要给大家介绍如何使用w命令和uptime命令来查看系统的负载情况,对于uptime命令, ...

  6. 赋值文件夹名称为日期的doc命令

    copy D:\111.txt d:\%date:~0,4%年%date:~5,2%月%date:~8,2%日.*

  7. FFmpeg: AVFormatContext 结构体分析

    AVFormatContext 结构体分析这个结构体描述了一个媒体文件或媒体流的构成和基本信息.这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象.主要成员释义: ...

  8. LeetCode: Best Time to Buy and Sell Stock III 解题报告

    Best Time to Buy and Sell Stock IIIQuestion SolutionSay you have an array for which the ith element ...

  9. 原生AJAX请求教程

    ajax 即 Asynchronous Javascript And XML,AJAX 不是一门的新的语言,而是对现有持术的综合利用.本质是在 HTTP 协议的基础上以异步的方式与服务器进行通信. 异 ...

  10. 【iCore1S 双核心板_FPGA】例程十四:FSMC总线通信实验——独立地址模式

    实验原理: STM32F103上自带FMC控制器,本实验将通过FMC总线的地址独立模式实现STM32与FPGA 之间通信,FPGA内部建立RAM块,FPGA桥接STM32和RAM块,本实验通过FSMC ...