背景:在公司中警察需要做技术支持,查看日志,而查看日志首先要自己清楚日志是如何生成的,所以有必要知道日志的前世今生!

转载出处:http://www.cnblogs.com/godtrue/p/6444158.html

1 测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述

1 老规矩,先来个栗子,然后再聊聊感受

1.1 举例

(1)这里栗子有一点特别呀!给出了包名唉!想必有用,是的,配置文件中要特别说明一下的

  1. package test.log4j.test8;
  2.  
  3. import org.apache.log4j.LogManager;
  4. import org.apache.log4j.Logger;
  5. import org.apache.log4j.xml.DOMConfigurator;
  6.  
  7. /**
  8. * Created by godtrue
  9. */
  10. public class UseLog4j {
  11. //日志记录器
  12. private static Logger LOGGER = LogManager.getLogger(UseLog4j.class);
  13. //程序入口——主函数
  14. public static void main(String[]args) {
  15. //读取使用Java的特性文件编写的配置文件
  16. DOMConfigurator.configure( "D:\\workspace_test\\hello-log4j\\log4j.xml" );
  17. //输出日志信息,测试日志级别的作用(配置在配置文件中),仅仅输出大于等于目前有效级别的日志信息
  18. LOGGER.debug("[1]-my level is DEBUG 天");
  19. LOGGER.info("[2]-my level is INFO");
  20. LOGGER.warn("[3]-my level is WARN");
  21. LOGGER.error("[4]-my level is ERROR");
  22. }
  23. }

ps:在main()中,加载log4j,还可以这么 写:

PropertyConfigurator.configure("log4j.properties");

(2)这段代码和(1)除了类名多了一个 _ ,并没有什么区别,那有什么用那?恩,有用的,一切为了测试,不信,你自己试试就更清楚了

  1. package test.log4j.test8;
  2.  
  3. import org.apache.log4j.LogManager;
  4. import org.apache.log4j.Logger;
  5. import org.apache.log4j.xml.DOMConfigurator;
  6.  
  7. /**
  8. * Created by godtrue
  9. */
  10. public class UseLog4j_ {
  11. //日志记录器
  12. private static Logger LOGGER = LogManager.getLogger(UseLog4j_.class);
  13. //程序入口——主函数
  14. public static void main(String[]args) {
  15. //读取使用Java的特性文件编写的配置文件
  16. DOMConfigurator.configure( "D:\\workspace_test\\hello-log4j\\log4j.xml" );
  17. //输出日志信息,测试日志级别的作用(配置在配置文件中),仅仅输出大于等于目前有效级别的日志信息
  18. LOGGER.debug("[1]-my level is DEBUG 天");
  19. LOGGER.info("[2]-my level is INFO");
  20. LOGGER.warn("[3]-my level is WARN");
  21. LOGGER.error("[4]-my level is ERROR");
  22. }
  23. }

(3)如下的配置文件,仅列出了三种文件输出目的地的配置,他们相对比较常用,其中值得特别注意的是记录器的 name 和 additivity 这两个属性的作用,详情往下看注解,最好自己试试

ps:下面的配置文件十分的详尽,只要对号入座即可!

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  3.  
  4. <log4j:configuration>
  5.  
  6. <!-- 将日志信息输出到控制台 -->
  7. <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
  8. <!-- 设置日志输出的样式 -->
  9. <layout class="org.apache.log4j.PatternLayout">
  10. <!-- 设置日志输出的格式 -->
  11. <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
  12. </layout>
  13. <!--过滤器设置输出的级别-->
  14. <filter class="org.apache.log4j.varia.LevelRangeFilter">
  15. <!-- 设置日志输出的最小级别 -->
  16. <param name="levelMin" value="WARN" />
  17. <!-- 设置日志输出的最大级别 -->
  18. <param name="levelMax" value="ERROR" />
  19. <!-- 设置日志输出的xxx,默认是false -->
  20. <param name="AcceptOnMatch" value="true" />
  21. </filter>
  22. </appender>
  23.  
  24. <!-- 将日志信息输出到文件,但是当文件的大小达到某个阈值的时候,日志文件会自动回滚 -->
  25. <appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
  26. <!-- 设置日志信息输出文件全路径名 -->
  27. <param name="File" value="D:/log4j/RollingFileAppender.log" />
  28. <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
  29. <param name="Append" value="true" />
  30. <!-- 设置保存备份回滚日志的最大个数 -->
  31. <param name="MaxBackupIndex" value="10" />
  32. <!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB -->
  33. <param name="MaxFileSize" value="10KB" />
  34. <!-- 设置日志输出的样式 -->
  35. <layout class="org.apache.log4j.PatternLayout">
  36. <!-- 设置日志输出的格式 -->
  37. <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
  38. </layout>
  39. </appender>
  40.  
  41. <!-- 将日志信息输出到文件,可以配置多久产生一个新的日志信息文件 -->
  42. <appender name="DailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
  43. <!-- 设置日志信息输出文件全路径名 -->
  44. <param name="File" value="D:/log4j/DailyRollingFileAppender.log" />
  45. <!-- 设置日志每分钟回滚一次,即产生一个新的日志文件 -->
  46. <param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />
  47. <!-- 设置日志输出的样式 -->
  48. <layout class="org.apache.log4j.PatternLayout">
  49. <!-- 设置日志输出的格式 -->
  50. <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
  51. </layout>
  52. </appender>
  53.  
  54. <!--
  55. 注意:
  56. 1:当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
  57. 2:logger中的name非常重要,它代表记录器的包的形式,有一定的包含关系,试验表明
  58. 2-1:当定义的logger的name同名时,只有最后的那一个才能正确的打印日志
  59. 2-2:当对应的logger含有包含关系时,比如:name=test.log4j.test8 和 name=test.log4j.test8.UseLog4j,则只有子集才能正确打印日志name=test.log4j.test8.UseLog4j
  60. 2-3:logger的name表示所有的包含在此名的所有记录器都遵循同样的配置,name的值中的包含关系是指记录器的名称哟!注意啦!
  61. 3:logger中定义的level和appender中的filter定义的level的区间取交集
  62. 4:如果appender中的filter定义的 levelMin > levelMax ,则打印不出日志信息
  63. -->
  64.  
  65. <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
  66. <logger name="test.log4j.test8.UseLog4j" additivity="false">
  67. <level value ="WARN"/>
  68. <appender-ref ref="DailyRollingFileAppender"/>
  69. </logger>
  70.  
  71. <!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
  72. <logger name="test.log4j.test8.UseLog4j_" additivity="false">
  73. <level value ="ERROR"/>
  74. <appender-ref ref="RollingFileAppender"/>
  75. </logger>
  76.  
  77. <!-- 根logger的设置-->
  78. <root>
  79. <level value ="INFO"/>
  80. <appender-ref ref="ConsoleAppender"/>
  81. <!--<appender-ref ref="DailyRollingFileAppender"/>-->
  82. </root>
  83.  
  84. </log4j:configuration>

1.2 感受

1)我们现在实际的项目使用的是log4j2,相应的配置方式和这里有所不同,抽时间我再好好玩一下

2)如果整个log4j日志框架,按照比较平滑的学习曲线来学习的话,还是非常简单的,以前学习过,不过不做笔记就是学习一下,时间一长容易忘记各项配置都是干啥的,所以,在里再补上一笔,写博客的好处就体现出来了,等忘记了回头再看看,也许记忆就恢复了,谢谢博客园提供的游戏场所。——世界是个游乐场,我们都是上帝的孩子。

3)编程这一行,我觉得应该重复的造轮子,特别是在学习某项技术的时候,网上关于log4j的博文也挺多的,刚开始我也找了一些来看,不过发现不好玩,不是自己的东西理解起来费劲不说,好多一实验还不灵,当然,有好多也是相当不错的,是经过试验的,不过不够详细。总之,好的要学习,而学习的最好途径还是自己多思考,多动手试验试验。

1.3 写这些博客我曾详细的看过一下资源(非常感谢,在此谢过!)

log4j官网

log4j教程

使用Log4j进行日志操作

最详细的Log4j使用教程

log4j百度百科

log4j维基百科

log4j详解与实战

log4j配置文件详解

log4j.properties配置详解与实例-全部测试通过

log4j.properties配置文件详解

log4j.xml配置文件详解

log4.xmlj配置文件详解

1.4 补充知识

log4j.rootLogger=日志级别,appender1, appender2, ….

  • 日志级别:ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF,不区分大小写
  • 注意,需在控制台输入,只需将其中一个appender定义为stdout即可
  • 注意,rootLogger默认是对整个工程生效
  • 注意,如果只想对某些包操作,那么:log4j.logger.com.hutu=info, stdout,表示该日志对package com.hutu生效
  • 注意,这样做可以区分dev/线上,也可以减小性能影响:if(log.isDebugEnabled()){log.debug();}

 log4j.appender.appender1=org.apache.log4j.日志输出到哪儿

  • ConsoleAppender(控制台)
  • FileAppender(文件)
  • DailyRollingFileAppender(每天产生一个日志文件)
  • RollingFileAppender(文件大小到达指定尺寸时产生一个新的文件)
  • WriteAppender(将日志信息以流格式发送到任意指定的地方)
  • JDBCAppender(将日志信息保存到数据库中)

 log4j.appender.appender1.File=文件目录及文件

${user.home}/logs/...

 log4j.appender.appender1.MaxFileSize=最大文件大小

 log4j.appender.appender1.MaxBackupIndex=备份文件个数

  • 其中,appender1是在第一行定义过的;
  • 文件目录及文件,例如,/home/admin/logs/hutudan.log
  • 最大文件大小,例如,100KB
  • 备份文件个数,例如,1

 log4j.appender.ServerDailyRollingFile.DatePattern=日志后缀格式

  • 例如,'.'yyyy-MM-dd

 log4j.appender.appender1.layout=org.apache.log4j.日志布局格式

  • HTMLLayout(以HTML表格形式布局)
  • SimpleLayout(包含日志信息的级别和信息字符串)
  • TTCCLayout(包含日志产生的时间,执行绪,类别等信息)
  • PatternLayout(可以灵活的指定布局格式,常用

 log4j.appender.appender1.layout.ConversionPattern=日志输出格式

  1. 例如,%d - %m%n或%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
  2. %c 输出日志信息所属的类的全名
  3. %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-M-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
  4. %f 输出日志信息所属的类的类名
  5. %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
  6. %m 输出代码中指定的信息,如log(message)中的message
  7. %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
  8. %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
  9. %r 输出自应用启动到输出该日志信息所耗费的毫秒数
  10. %t 输出产生该日志事件的线程名
  11. 可参考:http://blog.sina.com.cn/s/blog_4e4dd5570100qowy.html

 log4j.appender.ServerDailyRollingFile.Append=true

  • 例如,不解释,追加往后写便是

 总结一下:

  • Logger类:完成日志记录,设置日志信息级别
  • Appender类:决定日志去向,终端、DB、硬盘
  • Layout类:决定日志输出的样式,例如包含当前线程、行号、时间

(转)log4j(七)——log4j.xml简单配置样例说明的更多相关文章

  1. log4j(七)——log4j.xml简单配置样例说明

    一:测试环境与log4j(一)--为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 (1)这里栗子有一点特别呀!给出了包名唉!想必有用,是的,配置文件中要特别说明一下 ...

  2. (转)log4j(六)——log4j.properties简单配置样例说明

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 老规矩,先来个栗子,然后再聊聊感受 (1)使用配文件的方式,是不是感觉非常的清爽,如果不在程序中读取配置文件就更加的清 ...

  3. log4j(六)——log4j.properties简单配置样例说明

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 (1)使用配文件的方式,是不是感觉非常的清爽,如果不在程序中读取配置文件就更加的清 ...

  4. log4j2的xml的配置样例

    log4j2.xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status ...

  5. log4j.xml简单配置实现在控制台打印sql执行语句【加注释】

    转: log4j.xml简单配置实现在控制台打印sql执行语句 2017年09月27日 13:02:34 艾然丶 阅读数 8804   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协 ...

  6. Android中关于JNI 的学习(零)简单的样例,简单地入门

    Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...

  7. 使用CEF(二)— 基于VS2019编写一个简单CEF样例

    使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...

  8. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  9. nginx https 配置样例

    站点nginx https 配置模板 第一章 nginx 支持https 配置样例 其他 相关链接地址 第一章 nginx 支持https 配置样例 说明:https 段配置参数说明 Server 段 ...

随机推荐

  1. python读写文件相关内容

    1.python读取文件 f = open('E:/info.txt', 'r')#用read的方式打开a = 0for line in f.readlines():读取没一行,就是读取所有文件的意思 ...

  2. Nmap在实战中的高级用法

    Nmap提供了四项基本功能(主机发现.端口扫描.服务与版本侦测.OS侦测)及丰富的脚本库.Nmap既能应用于简单的网络信息扫描,也能用在高级.复杂.特定的环境中:例如扫描互联网上大量的主机:绕开防火墙 ...

  3. CentOS上安装redis记录

    下载稳定版 curl -O http://download.redis.io/releases/redis-stable.tar.gz tar -zxvf redis-stable.tar.gz cd ...

  4. Dalvik详解

    整理自百度百科 Dalvik Dalvik是Google公司自己设计用于Android平台的Java虚拟机.Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一 ...

  5. Hibernate入门(五)

    一 Hibernate继承映射 我们可以将继承层次结构类与数据库的表映射. 1. 每个层次类一张表 这个层次结构有三个类,Employee是Regular_Employee和Contract_Empl ...

  6. UWP的Converter妙用

    MVVM模式的使用,简化了UWP应用的开发,使层次更加分明.在写xaml的时候,有些小技术还是很实用的:比如Converter,字面上理解是转换器,那它到底是转换什么的?接触过的可能知道它起的是类型转 ...

  7. 蜘蛛大战之 站点LOGO(SEO)

    起因: 同事让我看 搜公司名称,百度第一位并没有出现公司网址,是别人的,然后我 惊奇的发现,站点logo 竟然 抓了张 无关紧要的图片,从此 变开始了 为期 10天+的战争: 经过: [2017-06 ...

  8. 《基于Node.js实现简易聊天室系列之详细设计》

    一个完整的项目基本分为三个部分:前端.后台和数据库.依照软件工程的理论知识,应该依次按照以下几个步骤:需求分析.概要设计.详细设计.编码.测试等.由于缺乏相关知识的储备,导致这个Demo系列的文章层次 ...

  9. 如何卸载CentOS自带的apache

    查看安装的组件: rpm -qa | grep httpd 如果预装有apache,那么会显示像httpd-2.2.3-22.el5.centos这种的组件名. 卸载组件: rpm -e httpd- ...

  10. Swift大写和小写字符串

    您可以通过字符串的 uppercaseString 和 lowercaseString 属性来访问一个字符串的大写/小写版本. 复制纯文本新窗口 let normal = "Could yo ...