Log4j使用总结

一、介绍
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。

二、配置文件
其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties格式的文件。下面我们介绍使用properties格式做为配置文件的方法:
示例:
log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

1. 配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了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(将日志信息以流格式发送到任意指定的地方)
(1).ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
(2).FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
(3).DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern=’.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)’.'yyyy-MM: 每月
2)’.'yyyy-ww: 每周
3)’.'yyyy-MM-dd: 每天
4)’.'yyyy-MM-dd-a: 每天两次
5)’.'yyyy-MM-dd-HH: 每小时
6)’.'yyyy-MM-dd-HH-mm: 每分钟
(4).RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。

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(包含日志产生的时间、线程、类别等等信息)

4、输出格式设置
在配置文件中可以通过log4j.appender.A1.layout.ConversionPattern设置日志输出格式。
参数:
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个”%”字符
%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之前,首先要将commons-logging.jar和logging-log4j-1.2.9.jar导入到classpath中,并将log4j.properties放于src根目录中。接下来就可以使用了。

1.得到记录器
使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:
public static Logger getLogger( String name),
通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;
注:推荐使用commons-logging结合log4j进行日志记录
private static Log logger = LogFactory.getLog(Yourclass.class);


2.插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;

四、Log4j比较全面的配置
LOG4J的配置之简单使它遍及于越来越多的应用中了:Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了。
Java代码收藏代码
  1. log4j.rootLogger=DEBUG,CONSOLE,A1,im
  2. log4j.addivity.org.apache=true
  3. #应用于控制台
  4. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
  5. log4j.appender.Threshold=DEBUG
  6. log4j.appender.CONSOLE.Target=System.out
  7. log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
  8. log4j.appender.CONSOLE.layout.ConversionPattern=[framework]%d-%c-%-4r[%t]%-5p%c%x-%m%n
  9. #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]n%c[CATEGORY]%n%m[MESSAGE]%n%n
  10. #应用于文件
  11. log4j.appender.FILE=org.apache.log4j.FileAppender
  12. log4j.appender.FILE.File=file.log
  13. log4j.appender.FILE.Append=false
  14. log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
  15. log4j.appender.FILE.layout.ConversionPattern=[framework]%d-%c-%-4r[%t]%-5p%c%x-%m%n
  16. #UsethislayoutforLogFactor5analysis
  17. #应用于文件回滚
  18. log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
  19. log4j.appender.ROLLING_FILE.Threshold=ERROR
  20. log4j.appender.ROLLING_FILE.File=rolling.log//文件位置,也可以用变量${java.home}、rolling.log
  21. log4j.appender.ROLLING_FILE.Append=true//true:添加false:覆盖
  22. log4j.appender.ROLLING_FILE.MaxFileSize=10KB//文件最大尺寸
  23. log4j.appender.ROLLING_FILE.MaxBackupIndex=1//备份数
  24. log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
  25. log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework]%d-%c-%-4r[%t]%-5p%c%x-%m%n
  26. #应用于socket
  27. log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
  28. log4j.appender.SOCKET.RemoteHost=localhost
  29. log4j.appender.SOCKET.Port=5001
  30. log4j.appender.SOCKET.LocationInfo=true
  31. #SetupforLogFacter5
  32. log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
  33. log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
  34. #LogFactor5Appender
  35. log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
  36. log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
  37. #发送日志给邮件
  38. log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
  39. log4j.appender.MAIL.Threshold=FATAL
  40. log4j.appender.MAIL.BufferSize=10
  41. log4j.appender.MAIL.From=web@www.wuset.com
  42. log4j.appender.MAIL.SMTPHost=www.wusetu.com
  43. log4j.appender.MAIL.Subject=Log4JMessage
  44. log4j.appender.MAIL.To=web@www.wusetu.com
  45. log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
  46. log4j.appender.MAIL.layout.ConversionPattern=[framework]%d-%c-%-4r[%t]%-5p%c%x-%m%n
  47. #用于数据库
  48. log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
  49. log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
  50. log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
  51. log4j.appender.DATABASE.user=root
  52. log4j.appender.DATABASE.password=
  53. log4j.appender.DATABASE.sql=INSERTINTOLOG4J(Message)VALUES(’[framework]%d-%c-%-4r[%t]%-5p%c%x-%m%n’)
  54. log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
  55. log4j.appender.DATABASE.layout.ConversionPattern=[framework]%d-%c-%-4r[%t]%-5p%c%x-%m%n
  56. log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
  57. log4j.appender.A1.File=SampleMessages.log4j
  58. log4j.appender.A1.DatePattern=yyyyMMdd-HH’.log4j’
  59. log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
  60. #自定义Appender
  61. log4j.appender.im=net.cybercorlin.util.logger.appender.IMAppender
  62. log4j.appender.im.host=mail.cybercorlin.net
  63. log4j.appender.im.username=username
  64. log4j.appender.im.password=password
  65. log4j.appender.im.recipient=corlin@cybercorlin.net
  66. log4j.appender.im.layout=org.apache.log4j.PatternLayout
  67. log4j.appender.im.layout.ConversionPattern=[framework]%d-%c-%-4r[%t]%-5p%c%x-%m%n

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

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

相关文章

C语言: GDB调试技术(一)

启动GDB的方法有以下几种: 1、gdb <program> program也就是你的执行文件,一般在当然目录下。’ 例如我写了一个简单的helloword程序 #include <stdio.h> int main(){int a = 1;char* ch = "hello world";printf("%s\n",ch);return 0; }那么我…

C语言: ---windows下VS Debug调试

首先我先列出来常用的一些命令或者键盘控制: F5 开始调试,执行到断点 Shift + F5 停止调试 F9 在光标所在行添加断点 Shift + F9 QuickWatch Shift Ctrl F9 delete all 断点 F10 单步执行 F11 进入调用的函数 Shift F11 跳出这次调用的函数 另外还可以用Disable all breakpoi…

leetcode350. 两个数组的交集 II

给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例 1: 输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2,2] 示例 2: 输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出: [4,9] 说明&#xff1a; 输出结果中每个元素出现的次数&#xff0c;应与元素在两个数组中出…

C语言: ---Linux下ulimit是什么鬼

其实ulimit的讲解不属于C或者C++ 语言范畴,他只是在我们日常开发或者线上linux运行环境不可缺少的工具。 比如我们要查看服务器崩溃的core文件,允许core文件产生,都需要ulimit -c命令调整。 比如我们设置的当前运行环境的栈空间过小,容易产生栈溢出,那么我们…

C语言: ---gdb查看内存和寄存器内容

gdb没有CodeWarrior强大,但是也提供了查看寄存器的命令:(gdb) info register r1r1 0xbffffb40 3221224256(gdb) info registersr0 0x1000052c 268436780r1 0xbffffb40 3221224256r2 0x48026ea0 1208118944r3 …

leetcode52. N皇后 II 最强解法直接秒杀100%

n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题的一种解法。 给定一个整数 n&#xff0c;返回 n 皇后不同的解决方案的数量。 示例: 输入: 4 输出: 2 解释: 4 皇后问题存在如下两个不同的解法。 [ […

C语言:---gdb多线程调试

1)恢复程序运行和单步调试 当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。 continue [ignore-count] c [ignore-count] fg [ignore-count] 恢复程序运行,直到程序结束,或是下一个断点到来。ig…

leetcode145. 二叉树的后序遍历 意想不到的骚操作

给定一个二叉树&#xff0c;返回它的 后序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 思路&#xff1a;前序遍历左右交换&#xff0c;然后倒序输出 原因&am…

C++:29 --- C++继承关系下的内存布局(下)

1 单继承 C++ 提供继承的目的是在不同的类型之间提取共性。比如,科学家对物种进行分类,从而有种、属、纲等说法。有了这种层次结构,我们才可能将某些具备特定性质的东西归入到最合适的分类层次上,如“怀孩子的是哺乳动物”。由于这些属性可以被子类继承,所以,我们只要知道…

C++:30 ---C++类成员,成员函数的内存布局

前面两篇文章我相信大家反复读了之后对这节不陌生了: 首先来看代码: class Demo { public://静态成员变量static const int sx = 0;//静态函数static void SF1() {} public://成员变量int x; public://成员函数void F1() {cout << "Im from Demo::F1()" <…

leetcode119. 杨辉三角 II 你能比我代码更短吗?

给定一个非负索引 k&#xff0c;其中 k ≤ 33&#xff0c;返回杨辉三角的第 k 行。 示例: 输入: 3 输出: [1,3,3,1]按照定义写即可。 class Solution:def getRow(self, rowIndex: int) -> List[int]:l[1]for i in range(rowIndex):l[1][l[j]l[j1] for j in range(len(l)-1…

C++:28 --- C++内存布局(上)

了解你所使用的编程语言究竟是如何实现的,对于C++程序员可能特别有意义。 首先,我们顺次考察C兼容的结构(struct)的布局,单继承,多重继承,以及虚继承;接着,我们讲成员变量和成员函数的访问,当然,这里面包含虚函数的情况;再接下来,我们考察构造函数,析构函数,以…

leetcode114. 二叉树展开为链表

给定一个二叉树&#xff0c;原地将它展开为链表。 例如&#xff0c;给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为&#xff1a; 1 \ 2 \ 3 \ 4 \ 5 \ 6 思路&#xff1a;所有左子树的最右节点接上右子…

C++:26---动态内存管理new、delete

实在不好意思,到这里才给大家分享new和delete。 对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。 由于malloc/free是库函数而不是运算符,不在编译器控制权限…

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

Log4j组件构成 Log4j由三个重要的组件构成&#xff1a; 1.日志信息的优先级(Logger) 2.日志信息的输出目的地(Appender) 3.日志信息的输出格式(Layout)。 概要: 日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG&#xff0c;分别用来指定这条日志信息的重要程度&…

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;但字符可以映射自己…