说来惭愧,今天就写了个"hello world",了解了一下log4j的日志。

  本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置文件开始用的log4j.properties,结果控制台一直打印ERROR StatusLogger No log4j2 configuration file found.也就是Log4j2配置文件没找到的意思。

  我就把log4j.properties文件名改成log4j2.properties,结果不报错了,但是就是不打印日志,直接就结束运行了(Process finished with exit code 0),现在想想好愚蠢啊。

  后来经过百般折腾,发现log4j是log4j,log4j2是log4j2,不能混用啊,但它们都是出自同一个公司,log4j2顾名思义是第二代,是log4j的优化升级版。

  log4j的配置文件是log4j.properties,是以.properties后缀名结尾的文件命名,而log4j2的配置文件一般是xml文件或json,以.xml或.json后缀格式的命名,log4j更新到1.2.17版就停止了更新,发布了Log4j2;

  我加入的jar包一直是log4j2的jar包,开始使用了log4j的配置文件(log4j.properties),所以一直打印不出来。后来重新加入配置文件log4j2.xml后,就可以打印了。

  maven的pom.xml文件中加入的依赖:加入log4j的实现和log4j核心包,如果版本号(version)在2.0以下,配置文件就是.properties了哦

  1. <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
  2. <dependency>
  3. <groupId>org.apache.logging.log4j</groupId>
  4. <artifactId>log4j-slf4j-impl</artifactId>
  5. <version>2.6.2</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
  8. <dependency>
  9. <groupId>org.apache.logging.log4j</groupId>
  10. <artifactId>log4j-core</artifactId>
  11. <version>2.6.2</version>
  12. </dependency>

  如果是springboot项目:需要排除一个logback的jar包,以免冲突:

  1.     <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <!--log4j-slf4j-impl与 logback-classic包不兼容,删除这个包 -->
  7. <groupId>ch.qos.logback</groupId>
  8. <artifactId>logback-classic</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>

  log4j2.xml文件:网上复制的一个,写的挺全,由于我只用到在控制台打印输出,所以我把没用到的都注释了。

  后面用到了文件输出,需要的可以点击查看:http://www.cnblogs.com/hyyq/p/7171227.html

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2.  
  3. <!--
  4. status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出
  5. monitorInterval : Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。
  6.  
  7. 注:本配置文件的目标是将不同级别的日志输出到不同文件,最大2MB一个文件,
  8. 文件数据达到最大值时,旧数据会被压缩并放进指定文件夹
  9. -->
  10. <Configuration status="WARN" monitorInterval="600">
  11.  
  12. <!--<Properties>
  13. &lt;!&ndash; 配置日志文件输出目录,此配置将日志输出到tomcat根目录下的指定文件夹 &ndash;&gt;
  14. <Property name="LOG_HOME">${sys:catalina.home}/WebAppLogs/SSHExample</Property>
  15. </Properties>-->
  16.  
  17. <Appenders>
  18.  
  19. <!--这个输出控制台的配置,这里输出除了warn和error级别的信息到System.out-->
  20. <Console name="console_out_appender" target="SYSTEM_OUT">
  21. <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)
  22. 优先级,即DEBUG,INFO,WARN,ERROR,
  23. -->
  24. <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="ACCEPT"/>
  25. <!-- 输出日志的格式 -->
  26. <PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n"/>
  27. </Console>
  28. <!--
  29. &lt;!&ndash;这个输出控制台的配置,这里输出warn和error级别的信息到System.err,在eclipse控制台上看到的是红色文字&ndash;&gt;
  30. <Console name="console_err_appender" target="SYSTEM_ERR">
  31. &lt;!&ndash; 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) &ndash;&gt;
  32. <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
  33. &lt;!&ndash; 输出日志的格式 &ndash;&gt;
  34. <PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n"/>
  35. </Console>
  36. -->
  37.  
  38. <!-- &lt;!&ndash; TRACE级别日志 &ndash;&gt;
  39. &lt;!&ndash; 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内,
  40. 日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号,此appender只输出trace级别的数据到trace.log &ndash;&gt;
  41. <RollingRandomAccessFile name="trace_appender"
  42. immediateFlush="true" fileName="${LOG_HOME}/trace.log"
  43. filePattern="${LOG_HOME}/trace/trace - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
  44. <PatternLayout>
  45. <pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
  46. </PatternLayout>
  47. <Policies>&lt;!&ndash; 两个配置任选其一 &ndash;&gt;
  48.  
  49. &lt;!&ndash; 每个日志文件最大2MB &ndash;&gt;
  50. <SizeBasedTriggeringPolicy size="2MB"/>
  51.  
  52. </Policies>
  53. <Filters>&lt;!&ndash; 此Filter意思是,只输出debug级别的数据 &ndash;&gt;
  54. &lt;!&ndash; DENY,日志将立即被抛弃不再经过其他过滤器;
  55. NEUTRAL,有序列表里的下个过滤器过接着处理日志;
  56. ACCEPT,日志会被立即处理,不再经过剩余过滤器。 &ndash;&gt;
  57. <ThresholdFilter level="debug" onMatch="DENY" onMismatch="NEUTRAL"/>
  58. <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
  59. </Filters>
  60. </RollingRandomAccessFile>
  61.  
  62. &lt;!&ndash; DEBUG级别日志 &ndash;&gt;
  63. &lt;!&ndash; 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内,
  64. 日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号,此appender只输出debug级别的数据到debug.log &ndash;&gt;
  65. <RollingRandomAccessFile name="debug_appender"
  66. immediateFlush="true" fileName="${LOG_HOME}/debug.log"
  67. filePattern="${LOG_HOME}/debug/debug - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
  68. <PatternLayout>
  69. <pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
  70. </PatternLayout>
  71. <Policies>&lt;!&ndash; 两个配置任选其一 &ndash;&gt;
  72.  
  73. &lt;!&ndash; 每个日志文件最大2MB &ndash;&gt;
  74. <SizeBasedTriggeringPolicy size="2MB"/>
  75.  
  76. &lt;!&ndash; 如果启用此配置,则日志会按文件名生成新压缩文件,
  77. 即如果filePattern配置的日期格式为 %d{yyyy-MM-dd HH} ,则每小时生成一个压缩文件,
  78. 如果filePattern配置的日期格式为 %d{yyyy-MM-dd} ,则天生成一个压缩文件 &ndash;&gt;
  79. &lt;!&ndash; <TimeBasedTriggeringPolicy interval="1" modulate="true" /> &ndash;&gt;
  80.  
  81. </Policies>
  82. <Filters>&lt;!&ndash; 此Filter意思是,只输出debug级别的数据 &ndash;&gt;
  83. &lt;!&ndash; DENY,日志将立即被抛弃不再经过其他过滤器;
  84. NEUTRAL,有序列表里的下个过滤器过接着处理日志;
  85. ACCEPT,日志会被立即处理,不再经过剩余过滤器。 &ndash;&gt;
  86. <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
  87. <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
  88. </Filters>
  89. </RollingRandomAccessFile>
  90.  
  91. &lt;!&ndash; INFO级别日志 &ndash;&gt;
  92. <RollingRandomAccessFile name="info_appender"
  93. immediateFlush="true" fileName="${LOG_HOME}/info.log"
  94. filePattern="${LOG_HOME}/info/info - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
  95. <PatternLayout>
  96. <pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
  97. </PatternLayout>
  98. <Policies>
  99. <SizeBasedTriggeringPolicy size="2MB"/>
  100. </Policies>
  101. <Filters>
  102. <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
  103. <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
  104. </Filters>
  105. </RollingRandomAccessFile>
  106.  
  107. &lt;!&ndash; WARN级别日志 &ndash;&gt;
  108. <RollingRandomAccessFile name="warn_appender"
  109. immediateFlush="true" fileName="${LOG_HOME}/warn.log"
  110. filePattern="${LOG_HOME}/warn/warn - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
  111. <PatternLayout>
  112. <pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
  113. </PatternLayout>
  114. <Policies>
  115. <SizeBasedTriggeringPolicy size="2MB"/>
  116. </Policies>
  117. <Filters>
  118. <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
  119. <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
  120. </Filters>
  121. </RollingRandomAccessFile>
  122.  
  123. &lt;!&ndash; ERROR级别日志 &ndash;&gt;
  124. <RollingRandomAccessFile name="error_appender"
  125. immediateFlush="true" fileName="${LOG_HOME}/error.log"
  126. filePattern="${LOG_HOME}/error/error - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
  127. <PatternLayout>
  128. <pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
  129. </PatternLayout>
  130. <Policies>
  131. <SizeBasedTriggeringPolicy size="2MB"/>
  132. </Policies>
  133. <Filters>
  134. <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
  135. </Filters>
  136. </RollingRandomAccessFile>-->
  137. </Appenders>
  138.  
  139. <Loggers>
  140. <!-- 配置日志的根节点 -->
  141. <root level="trace">
  142. <appender-ref ref="console_out_appender"/>
  143. <!-- <appender-ref ref="console_err_appender"/>
  144. <appender-ref ref="trace_appender"/>
  145. <appender-ref ref="debug_appender"/>
  146. <appender-ref ref="info_appender"/>
  147. <appender-ref ref="warn_appender"/>
  148. <appender-ref ref="error_appender"/>-->
  149. </root>
  150.  
  151. <!-- 第三方日志系统 -->
  152. <logger name="org.springframework.core" level="info"/>
  153. <logger name="org.springframework.beans" level="info"/>
  154. <logger name="org.springframework.context" level="info"/>
  155. <logger name="org.springframework.web" level="info"/>
  156. <logger name="org.jboss.netty" level="warn"/>
  157. <logger name="org.apache.http" level="warn"/>
  158.  
  159. </Loggers>
  160.  
  161. </Configuration>

  番外篇:

  我在代码中打印的是info级别的log,里面有中文,没想到idea工具的控制台输出乱码了,解决方法是在idea安装目录下的bin目录下的idea.exe.vmoptions文件的最后一行加入”-Dfile.encoding=UTF-8"(没有双引号),并把idea工程编码也改成utf-8(一般是默认utf-8),修改方式是file-->settings-->editor-->file encoding ,见下图,然后重启idea就可以了。

2017.5.6

关注微信同步更新:java_Squirrel

使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)的更多相关文章

  1. Python实现日志文件写入或者打印--类似于Java的Log4j

    开发过Java的应该都知道Log4j的重要性,尤其是在开发测试中,能够让开发和测试人员方便找的bug,Python也有和Log4j相同功能的库那就是logging库,其功能非常强大,在开发测试中很方便 ...

  2. android 华为、魅族手机无法打印 Log 日志的问题

    最近使用魅族真机测试 App 时,发现 LogCat 不显示项目工程中通过Log.d()和Log.v()打印的 debug 和 verbose 级别的日志,甚是奇怪,通过 debug 模式断点调试也没 ...

  3. Xposed框架Hook Android应用的所有类方法打印Log日志

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80954759 在进行Android程序的逆向分析的时候,经常需要Android程 ...

  4. python日志,支持彩色打印和文件大小切片写入和写入mongodb

    1.项目中使用了自定义的ColorHandler和MongoHandler,使用了内置的RotatingFileHandler和三方库的ConcurrentRotatingFileHandler. 支 ...

  5. e.printStackTrace()打印在哪里以及如何e.printStackTrace()的内容打印在日志中

    1.e.printStackTrace()打印在哪里 在catch中的e.printStackTrace()将打印到控制台 2.e.printStackTrace()打印的内容是什么 如下代码: im ...

  6. 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类

    快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...

  7. 解决华为手机不打印Log信息的问题

    在之前安装了Android Studio后,发现了一个很苦恼的事情,就是在程序中的写Log语句,不能正常的在Logcat中打印出来,这对于解决程序bug真是一刀切断,让人无从下手,在各种尝试后,首先我 ...

  8. Android Java层,Native层,Lib层打印Log简介【转】

    本文转载自:https://blog.csdn.net/AndroidMage/article/details/52225068 说明: 这里我根据个人工作情况说明在各个层打印log.如有问题欢迎拍砖 ...

  9. iOS 设备屏幕上实时打印 Log 的小工具

    需求 写这个小工具的想法,主要来源于很多团队都会用友盟.TalkingData 等第三方框架做自定义事件统计:不过统计代码加好之后,没有很好的方法来让测试工程师验证一下事件加上了没有,调用次数有没有重 ...

随机推荐

  1. QL 获取当前日期,年、月、日、周、时、分、秒

    ?select GETDATE() as '当前日期', DateName(year,GetDate()) as '年', DateName(month,GetDate()) as '月', Date ...

  2. 一个jsp页面引入另一个jsp页面的三种方式 及静态引入和动态引入的区别

    转载下, 转载自:http://blog.csdn.net/fn_2015/article/details/70311495 1.第一种:jstl  import <c:import url=& ...

  3. C语言中的const,free使用方法具体解释

    注意:C语言中的const和C++中的const是有区别的,并且在使用VS编译測试的时候. 假设是C的话.请一定要建立一个后缀为C的文件.不要是CPP的文件. 由于.两个编译器会有区别的. 一.C语言 ...

  4. SQLServer: 用 ApexSQLLog 恢复 SQL Server 数据

    https://blog.csdn.net/yenange/article/details/50512312

  5. flask实例化参数以及信号

    一.实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.from_pyfile('settin ...

  6. Easyui 遮罩实现方式

    项目中在提交Ajax请求时,后台处理数据时间有点长,需要一个遮罩,就随便找了一个实现一下:包含两种方式,个人比较喜欢第二种 第一种: $("#saveMaterial").clic ...

  7. 流量分析系统---echarts模拟迁移中 ,geocoord从后台获取动态数值

    由于在echarts的使用手册中说了 {Object} geoCoord (geoCoord是Object类型) ,所以不能用传统的字符串拼接或数组的方式赋值.在后台的controller中用Map& ...

  8. 深度学习1--ubuntu14.04+win10双系统

    相当多的内容参考的百度经验https://jingyan.baidu.com/article/eb9f7b6d79a7b4869364e885.html?qq-pf-to=pcqq.group 还可以 ...

  9. IDEA中文出现乱码解决

    转自:http://lcl088005.iteye.com/blog/2284696 我是个idea的忠实用户,新公司的项目都是用eclipse做的,通过svn拉下代码后发现,注释的内容里,中文内容都 ...

  10. Python 1 数据类型的操作

    一.数字(Number) 1.数学函数: 函数 返回值 ( 描述 ) abs(x) 返回数字的绝对值,如abs(-10) 返回 10 ceil(x) 返回数字的上入整数,如math.ceil(4.1) ...