在实际的项目开发和维护中,日志是经常用到的一个内容。遇到问题的时候,经常需要通过日志去查出问题的所在并解决问题。
通常我们会用:
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)的更多相关文章
-
Vue组件基础用法
前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...
-
layui(七)——rate组件常见用法总结
layui中提供了rate组件,用法很简单,直接上代码. <div id="test1"></div> <script> layui.use(' ...
-
log4j一些配置用法
Log4j基本用法----日志级别 基本使用方法: Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN.INFO ...
-
Log4j的常见用法
对于log4j,一般常用的只要保存如下的内容为属性文件即可: #log4j.rootLogger=DEBUG,A1,R log4j.rootLogger=INFO,A1,R log4j.appende ...
-
layui(三)——laypage组件常见用法总结
laypage 的使用非常简单,指向一个用于存放分页的容器,通过服务端得到一些初始值,即可完成分页渲染.核心方法: laypage.render(options) 来设置基础参数. 一.laypag ...
-
[UE4]虚幻4 spline组件、spline mesh组件的用法
最近公司项目需要,把这两个东东好好看了下.不得不说,这两个组件还是非常方便的,但是相关的介绍.教程却非常的少.它们概念模糊,用法奇特,我就总结下吧. 首先,先要明白spline component.s ...
-
slf4j log4j logback相关用法
Java的简单日志门面( Simple Logging Facade for Java SLF4J)作为一个简单的门面或抽象,用来服务于各种各样的日志框架,比如java.util.logging.lo ...
-
中间件:ElasticSearch组件RestHighLevelClient用法详解
本文源码:GitHub·点这里 || GitEE·点这里 一.基础API简介 1.RestHighLevelClient RestHighLevelClient的API作为ElasticSearch备 ...
-
开源.NET FTP组件edtFTPnet 用法
edtFTPnet官方网站:http://www.enterprisedt.com/products/edtftpnet/ 目前最新版本为2.2.3,下载后在bin目录中找到edtFTPnet.dll ...
随机推荐
-
Android App的设计架构:MVC,MVP,MVVM与架构经验谈
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
-
Angular2 CLI 快速开发
Angular2 CLI 快速开发 http://www.tuicool.com/articles/z6V3Ubz 解决npm 的 shasum check failed for错误(npm注册国内镜 ...
-
修改/etc/profile文件
通常情况下,/etc/profile文件是只读的,直接用vi或gedit打开修改后是无法保存的.要修改profile,需要取得root权限,(使用gedit编辑)应该如下: $sudo gedit / ...
-
iOS 开发 nonatomic 和 atomic
nonatomic : 非原子属性 atomic : 原子属性 如果不写关键字 那么默认就是 原子属性 - 多线程写入属性时,保证同一时间只有一个线程能够执行写入操作 - 单(线程)写多(线程 ...
-
ThinkPHP5.0源码学习之缓存Cache(二)
一.使用Cache类 TP5.0框架默认使用的是File文件缓存驱动,可以修改全局配置文件convention.php中的type,将其改为Redis,这样使用的就是Redis缓存驱动了.
-
js 键盘码
键盘各按键对应的数字 keycode 9 = Tab keycode 12 = Clear keycode 13 = Enter keycode 16 = Shift keycode 17 = Con ...
-
[android] 切换按钮-自定义控件-拖动效果
重写View的onTouchEvent()方法,传递进来MotionEvent对象 调用MotionEvent对象的getAction()方法,获取当前动作 switch判断一下当前动作 事件为Mot ...
-
【C#进阶】委托那些事儿(二)
二.传统的委托 接下来讲一讲方法参数.下面以“餐馆服务员为客户下单”[2]的事件作为描述.一般对事件的做法分3个部分: 1. 方法参数 EventArgs,一般用于传送数据.在本例场景中 public ...
-
gatttool的使用
1.使能hci接口 # hciconfig hci0 up 2.使用hcitool搜索BLE设备 # hcitool lescan LE Scan ...D0:39:72:BE:D2:26 (unkn ...
-
Hadoop之MapReduce命令
概述 全部的Hadoop命令都通过bin/mapred脚本调用. 在没有不论什么參数的情况下.执行mapred脚本将打印该命令描写叙述. 使用:mapred [--config confdir] CO ...