Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以把日志信息输送控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等目的地;此外,我们还可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
Log4j主要由三个部分构成:日志信息的优先级,日志信息的输出目的地,和日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。
Log4j有两种系列的版本,一种是1.x系列的版本,可名为Log4j1,目前的最新版本是1.2.17,已停止更新(2012年5月)。另一种是2.x系列的版本,可名为Log4j2,目前的最新版本是2.14.1(2021年3月),还在不断的更新,Log4j2应该会逐渐取代Log4j1。其次,1.x版本的配置文件的后缀名可为".xml"和".properties",而2.x版本不再支持1.x中的以.properties
为后缀的文件配置方式,其配置文件后缀名只能为".xml",".json"或者".jsn"。
在程序中使用Log4j之前,需要下载Log4j,1.x系列的Log4j的下载地址为:http://logging.apache.org/log4j/1.2/index.html
,下载完毕后,解压之,应该会发现很多文件,我们只取其中的log4j-1.2.17.jar包,并将其导入到项目的classpath中,然后再将log4j.properties配置文件放于src根目录中(配置文件的位置是可以随意的,只要在初始化Log4j配置时,其路径设置正确即可)。如此,就可以在程序中使用Log4j了。
1.新建一个Java项目,其名Log4jTest,导入1.x系列的Log4j库jar包:log4j-1.2.17.jar,整个项目的最终目录如下:
2.在src的根目录中创建并设置log4j配置文件
### 设置根记录器 ###
log4j.rootLogger = debug,A,B,C
### 输出日志信息到控制台 ###
log4j.appender.A = org.apache.log4j.ConsoleAppender
log4j.appender.A.Target = System.out
log4j.appender.A.layout = org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern = [%-5p] %d{
yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG级别以上的日志到=D:\\logs\\log.log,分隔符为\\或//都可 ###
log4j.appender.B = org.apache.log4j.DailyRollingFileAppender
log4j.appender.B.File = D://logs//log.log
log4j.appender.B.Append = true
log4j.appender.B.Threshold = DEBUG
log4j.appender.B.layout = org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern = %-d{
yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR级别以上的日志到=D:\\logs\\error.log,分隔符为\\或//都可 ###
log4j.appender.C = org.apache.log4j.DailyRollingFileAppender
log4j.appender.C.File = D://logs//error.log
log4j.appender.C.Append = true
log4j.appender.C.Threshold = ERROR
log4j.appender.C.layout = org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern = %-d{
yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
3.在主程序中设置日志信息
package log4jtest;
import java.io.File;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
/**
* @author ym
*/
public class Log4jTest {
/**
* @param args
*/
public static void main(String[] args){
// 加载配置文件进行初始化
String path=System.getProperty("user.dir")+File.separator+"src"
+File.separator+"log4j.properties";
PropertyConfigurator.configure(path);
// 获得记录器
Logger logger = Logger.getLogger(Log4jTest.class);
// 输出各种级别的日志信息
// 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录error级别的信息
logger.error("This is error message.");
}
}
4.输出结果
(1)首先是输出到控制的日志信息
(2)再就是输出到文件中的日志信息
5.注意事项
在主程序中,我们是通过如下的代码手动初始化配置的:
// 加载配置文件进行初始化
String path=System.getProperty("user.dir")+File.separator+"src"
+File.separator+"log4j.properties";
PropertyConfigurator.configure(path);
这是一种初始化配置的方式,但如果每次使用记录器输出日志信息,都需要手动设置properties文件的路径,那未免有些麻烦。那有没有自动初始化配置的方法呢?答案是:有的。但不管是上述的方法,还是接下来要介绍的方法,都需要告诉程序你的properties配置文件在哪里?只是上述的方法除了要告诉路径外,还要手动初始化配置而已。
如果要告诉程序你的properties配置文件在哪里?可把配置文件所在的文件夹路径添加到classpath中,如例子中的配置文件是在src文件夹中,那么只要把src的路径添加到classpath中即可,如下,往classpath添加了src路径:
如此,就可以使用如下的程序输出日志信息了,显然,相比于手动初始化配置,这种方式无疑要简洁一些。
package log4jtest;
import org.apache.log4j.Logger;
/**
* @author ym
*/
public class Log4jTest {
/**
* @param args
*/
public static void main(String[] args){
// 获得记录器
Logger logger = Logger.getLogger(Log4jTest.class);
// 输出各种级别的日志信息
// 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录error级别的信息
logger.error("This is error message.");
}
}
1.x系列的Log4j支持两种配置文件格式,一种是XML格式的文件(.xml),另一种是properties格式的文件(.properties)。下面我们介绍的是properties格式的配置文件:
配置文件示例:
### 设置根记录器 ###
log4j.rootLogger = debug,A,B,C
### 输出日志信息到控制台 ###
log4j.appender.A = org.apache.log4j.ConsoleAppender
log4j.appender.A.Target = System.out
log4j.appender.A.layout = org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern = [%-5p] %d{
yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG级别以上的日志到=D:\\logs\\log.log,分隔符为\\或//都可 ###
log4j.appender.B = org.apache.log4j.DailyRollingFileAppender
log4j.appender.B.File = D://logs//log.log
log4j.appender.B.Append = true
log4j.appender.B.Threshold = DEBUG
log4j.appender.B.layout = org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern = %-d{
yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR级别以上的日志到=D:\\logs\\error.log,分隔符为\\或//都可 ###
log4j.appender.C = org.apache.log4j.DailyRollingFileAppender
log4j.appender.C.File = D://logs//error.log
log4j.appender.C.Append = true
log4j.appender.C.Threshold = ERROR
log4j.appender.C.layout = org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern = %-d{
yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
(1)配置根记录器Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
其中,level
是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过定义此处的级别,可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了DEBUG级别,则应用程序中所有级别的日志信息都将被打印出来,而如果在这里定义了INFO级别,则应用程序中的DEBUG级别的日志信息将不被打印出来,因为DEBUG的优先级低于INFO的优先级。为了可以打印所有级别的日志信息,此处一般把级别设置为DEBUG。appenderName
是追加器的名称,用于指定日志信息所输出的地方。追加器可以有多个,即可以同时指定多个输出目的地。
(2)配置日志信息的输出目的地Appender,其语法为:
log4j.appender.appenderName = 全限定类名
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
(3)各种追加器的选项设置
’.'yyyy-MM: 每月
’.'yyyy-ww: 每周
’.'yyyy-MM-dd: 每天
’.'yyyy-MM-dd-a: 每天两次
’.'yyyy-MM-dd-HH: 每小时
’.'yyyy-MM-dd-HH-mm: 每分钟
log4j.appender.appenderName.layout = 全限定类名
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式,推荐使用这种
),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
(4)日志输出格式的设置
在配置文件中可以通过log4j.appender.appenderName.layout.ConversionPattern设置日志的输出格式。
各种通配符如下:
%p: priority,输出日志信息的优先级,即ALL,DEBUG,INFO,WARN,ERROR,FATAL, OFF
%d: date,输出日志记录的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: class,输出日志信息所属的类目(类信息从创建logger时传入的Class对象className.class中获得),通常就是所在类的全限定类名,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间。
%C: 列出调用logger的类的全限定名称(包含包路径),假设当前类是"org.apache.xyz.SomeClass",%C表示org.apache.xyz.SomeClass,%C{1}表示SomeClass。
%t: thread,输出产生该日志事件的线程名,主程序中的线程名默认是main
%l: location,输出日志事件的发生位置,相当于%c.%t(%f:%L)的组合,包括类目、发生的线程,以及在代码中的行数。举例:log4jtest.Log4jTest.main(Log4jTest.java:24)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中
%%: 输出一个”%”字符
%F: file name,输出日志消息产生时所在的源文件名称
%L: line number,输出调用logger的代码行的行号
%m: message,输出代码中的指定消息,即日志的具体信息
%M: 输出调用logger的方法名
%n: 输出一个回车换行符,Windows平台为”/r/n”,Unix平台为”/n”输出日志信息换行
可以在%与通配字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
%20c :指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
%-20c :指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
%.30c :指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
log4j.logger 用法如下
# 1)log4j.logger.包名 = 日志级别 , appenderName1,appenderName2,....
# 定义该包名下的所有类的日志输出
# 2)log4j.logger.类全名含包名 = 日志级别 ,appenderName1,appenderName2,....
# 定义指定类的日志输出
# 3) log4j.logger.日志对象Logger命名名称 = 日志级别 , appenderName1,appenderName2,....
# 定义了某命名名称的日志的 输出,如:
# log4j.logger.Log1 就是指定义通过 Logger.getLogger("Log1") 获取的日志对象的日志输出
#以log4j.logger.包名为例子
log4j.logger.edu.service.impl = error,service_stdout,service_logfile
log4j.appender.service_stdout=org.apache.log4j.ConsoleAppender
log4j.appender.service_stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.service_stdout.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n
log4j.appender.service_logfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.service_logfile.file=d:\\log\\service.log
log4j.appender.service_logfile.DatePattern= '.'yyyy-MM-dd
log4j.appender.service_logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.service_logfile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n
log4j.appender.service_logfile.Encoding=UTF-8
```
next_permutation参数介绍:Next_permutation(place-begin,place_end)第一个参数是,全排列的首地址,第二个是尾地址。返回值:当place这个东西(数组,字符串)存在下一个更大排列的时候返回true,(按照字符顺序)例如...
贪心的策略很明显,找到满足要求的优先级最低的机器占用,做的时候有两种思路,一种思路简单,但是要用到stl容器,另一种是思路有点新奇,但是写的时候简单,两种思路具体看代码。思路一:/*对每个任务按价值排序,机器也按价值排序,同时将机器按优先级加入stl容器中,每次查找满足任务时间要求优先级最低的机器,然后占用这台机器,依次求下去就行*/#include #include
<!DOCTYPE html><html lang="en"><head> <title>animations</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ...
802.11ax,也称为高效无线网络(High-Efficiency Wireless-HEW),通过一系列系统特性和多种机制增加系统容量,通过更好的一致覆盖和减少空口介质拥塞来改善Wi-Fi网络的工作方式,使用户获得最佳体验;尤其在密集用户环境中,为更多的用户提供一致和可靠的数据吞吐量,其目标是将用户的平均吞吐量提高至少4倍。也就是说基于802.11ax的Wi-Fi网络意味着前所未有的高容量和高...
在优化行业,有很多站长虽然工作经验丰富,但是在前端优化技巧方面还存在欠缺,从优化的层面来看,SEO思维虽说很很重要,但是没有一个准确的前端把控,网站优化方面还是存在许多的不足。一、从网站布局结构优化细节分析所谓网站布局结构优化主要是网站结构简单、多以偏平化为主。一般情况下,建立网站结构的时候层次越少,越容易被蜘蛛抓取,相对网站也就越容易被收录了,如果是中小型网站目录超过三级以上,蜘蛛是不愿意往下爬,担心迷路形成死循环,据相关统计,如果访客在浏览网页时,三次没有找到自己需要的信息,就会离开,所以,我们发现
CentOS6环境下安装 0) 系统环境: CentOS 64位, python 2.6版本。1) 安装依赖包 #sudo yum install PyQt4 #sudo yum install wireshark wireshark-gnome (安装wireshark 以及wireshark的GUI图形界面) #tar GNS3-0.8.3.1
滤波器组完美重构与小波快速算法。前面的分析可以知道Vj相当于在j分辨率的逼近,Vj-1相当于j-1分辨率的逼近,这样Wj-1相当于两个分辨率逼近的差。在高分辨率下,我们可以用f在(2^j*t)的采样值来代替向Vj空间的投影,但是这是需要说明的,否则成为“小波的罪恶”,本来在Vj上的投影需要函数对Vj上的基{2^(j/2)*m(2^j*t–n)}投影,用采样值来代替是因为当j足够大的时候,如一般情况...
A Digression Into Trigonometry(三角函数的介绍)在学校里我们都学过如何用度表示角度,并且我们都知道一个圆有360度。但是科学家、工程师以及程序语言的设计者使用一种叫做弧度的单位。你也许会记得上面drawWheel的代码在section#2处使用了表达式2*M_PI来计算圆的大小并分割为几个扇区。这是因为360度精确的等于2*...
采用CMAKE+MingW+OpenCV+QT的方法编译OPENCV库,配置选项生成MakeFile一路顺利,然后开始mingw32-make。编译到88%左右的时候时错误出现了,打印显示预编译头文件perf_precomp.hpp编译出错,诡异的是换一台电脑后是另外一个模块同样文件编译出错,错误在不同位置。问题解决:使用用cmake创建时,本来使用的是G:/xxx/xxx/opencv/mingw
partition:1、删除表、创建外部表和分区、根据分区导入数据dfs -rmr /tmp/ext/tab_name1; --删除hadoop文件系统中的目录及文件dfs -mkdir /tmp/ext/tab_name1;--重新创建目录。建表前需要先创建与表名称对应的目录才行drop table if exists tab_name1;create exte...
文章目录spring cloud ribbonribbon自动装配LoadBalanced的作用ribbonInterceptor执行拦截器负载算法获取服务异步执行请求总结spring cloud ribbon众所周知springcloud ribbon 是用来做负载均衡的。那么它是怎么做到使restTemplate拥有负载均衡呢?带着这个疑问咱们来源码分析。本文会详细介绍阅读源码的方式。如果从多实现中找到具体实现。(非idea断点方式)ribbon自动装配demo 配置文件server: