java中log的应用
log的简单应用 备忘
加入jar包commons-logging-1.1.jar
log4j.properties 如下(就放在src根目录底下 名字和位置都不要变)
#OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL log4j.rootLogger=warn,stdout,err,war log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n log4j.appender.err=org.apache.log4j.DailyRollingFileAppender log4j.appender.err.layout=org.apache.log4j.PatternLayout log4j.appender.err.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c ---- %m%n log4j.appender.err.datePattern='.'yyyy-MM-dd log4j.appender.err.Threshold = ERROR log4j.appender.err.append=true log4j.appender.err.File=d:/logs/error.log log4j.appender.war=org.apache.log4j.DailyRollingFileAppender log4j.appender.war.layout=org.apache.log4j.PatternLayout log4j.appender.war.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c ---- %m%n log4j.appender.war.datePattern='.'yyyy-MM-dd log4j.appender.war.Threshold = warn log4j.appender.war.append=true log4j.appender.war.File=d:/logs/warn.log log4j.logger.org.hibernate.tool.hbm2ddl=debug log4j.logger.com.bjsxt.hibernate.MyLog4j=info
简单介绍一下
第一行注释 代表了log的日志级别
第二行的意思是 把所有warn级别之上的日志输出的三个位置 分别是stdout err 和war
再后面的三部分 就是对三个位置输出格式的介绍 不解释
log4j.appender.err.Threshold = ERROR 这句话的意思是 在err这个位置里只输出error级别之上的信息
这四部分合起来 就是说warn以上的信息都先在console上输出一下 其中error和warn的信息还要分别输出到d:/logs/error.log和d:/logs/warn.log里每天都输出到一个文件夹里
不用再解释了吧
log4j.logger.com.bjsxt.hibernate.MyLog4j=info
这两行的意思是说在com.bjsxt.hibernate.MyLog4j类下的信息 只要达到了info级别就输出 不用搭理第二行的warn级别
log4j.logger.org.hibernate.tool.hbm2ddl=debug 一样不再赘述
测试程序
package com.bjsxt.hibernate; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class MyLog4j { private static final Log log = LogFactory.getLog(MyLog4j.class); public static void main(String[] args) { log.info("sdf"); log.debug("debug"); log.error("i am errorsdsssf"); } }
运行结果
[INFO ] [09:25:56] com.bjsxt.hibernate.MyLog4j - sdf
[ERROR] [09:25:56] com.bjsxt.hibernate.MyLog4j - i am errorsdsssf
如果我把log4j.properties里面的最后一句话
log4j.logger.com.bjsxt.hibernate.MyLog4j=info 注释掉
再运行 结果就是
[ERROR] [09:28:05] com.bjsxt.hibernate.MyLog4j - i am errorsdsssf
log4j没有什么多余的东西 如果只是要单纯的使用 记住这个配置 我觉得也就够了
***********************************************************
2015年11月17日修正版
以前一直不清楚关于java的日志系统到底是个怎么回事,今天碰到了一个问题,算是把这个问题给解决了
common-logging 是apache的日志接口,只定义了规则,没有干具体的事情
slf4j全称为Simple Logging Facade for JAVA,java简单日志门面。类似于Apache Common-Logging,是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案
大家在初级阶段就认为slf4j与common-loging干的是一回事就OK
下来就是log4j与logback
大家可以认为这俩是一回事,干的都是具体的日志记录
同时如果我们用log4j那么在于slf4j连接时,还需要一个slf4j-log4j12.jar来做连接器
我们看下面的这张图:
今天在看zookeeper的时候,发现不管怎么改log4j.properties都有很多很多的日志打印出来#
最后才发现,原来项目里用的是logback来做日志处理器
那怎么办,加上logback的配置文件呗#把logback.xml放入编译目录下(就在根目录下)
<?xml version="1.0"?> <configuration> <!-- ch.qos.logback.core.ConsoleAppender 控制台输出 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 日志级别 --> <root> <level value="error" /> <appender-ref ref="console" /> </root> </configuration>
我们的测试代码是:
package com.hcr.web.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogTest { private static final Logger log = LoggerFactory.getLogger(LogTest.class); public static void main(String[] args) { log.error("i am error"); log.debug("i am debug"); log.info("i am inof"); } }
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/repo/ch/qos/logback/logback-classic/1.1.1/logback-classic-1.1.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/D:/repo/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder] [ERROR] 21:07:33.728 [main] com.hcr.web.controller.LogTest - i am error
仔细阅读上面的说明
有多个slf4j的实现
仔细一看,对呀,有slf4j-log4j12-1.6.1.jar,还有logback-classic-1.1.1.jar#
我们已经决定使用logback了(网上说logback的效率比较高)
那么很简单去掉slf4j-log4j12即可#
问题是在我项目里pom.xml并没有出现slf4j-log4j12呀#
那只能是一种情况----我引用的某个jar包引用了slf4j-log4j12
那问题又出现了,我咋知道我引用的那个jar包又去间接的引用了slf4j-log4j12呢?
如果有多个实现的话 似乎运行的是logback
在pom文件目录下运行mvn dependency:tree
[INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building gomeTest Maven Webapp 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ gomeTest --- [INFO] com.ruishenh:gomeTest:war:0.0.1-SNAPSHOT [INFO] +- com.alibaba.rocketmq:rocketmq-all:pom:3.0.4-open:compile [INFO] +- com.alibaba.rocketmq:rocketmq-client:jar:3.0.4-open:compile [INFO] +- com.alibaba.rocketmq:rocketmq-common:jar:3.0.4-open:compile [INFO] | +- com.alibaba.rocketmq:rocketmq-remoting:jar:3.0.4-open:compile [INFO] | | +- com.alibaba:fastjson:jar:1.1.33:compile [INFO] | | \- io.netty:netty-all:jar:4.0.9.Final:compile [INFO] | +- commons-cli:commons-cli:jar:1.2:compile [INFO] | \- commons-io:commons-io:jar:2.4:compile [INFO] +- commons-httpclient:commons-httpclient:jar:3.1:compile [INFO] | \- commons-codec:commons-codec:jar:1.2:compile [INFO] +- org.apache.httpcomponents:httpclient:jar:4.2.3:compile [INFO] | \- commons-logging:commons-logging:jar:1.1.1:compile [INFO] +- org.apache.httpcomponents:httpcore:jar:4.2.3:compile [INFO] +- org.apache.httpcomponents:httpmime:jar:4.2.3:compile [INFO] +- ch.qos.logback:logback-classic:jar:1.1.1:compile [INFO] | \- org.slf4j:slf4j-api:jar:1.7.6:compile [INFO] +- ch.qos.logback:logback-core:jar:1.1.1:compile [INFO] +- junit:junit:jar:4.10:test (scope not updated to compile) [INFO] | \- org.hamcrest:hamcrest-core:jar:1.1:test [INFO] +- org.swinglabs:swingx:jar:1.6.1:compile [INFO] | +- com.jhlabs:filters:jar:2.0.235:compile [INFO] | \- org.swinglabs:swing-worker:jar:1.1:compile [INFO] +- redis.clients:jedis:jar:2.4.2:compile [INFO] | \- org.apache.commons:commons-pool2:jar:2.0:compile [INFO] +- org.springframework:spring-webmvc:jar:3.1.0.RELEASE:compile [INFO] | +- org.springframework:spring-asm:jar:3.1.0.RELEASE:compile [INFO] | \- org.springframework:spring-context-support:jar:3.1.0.RELEASE:compile [INFO] +- org.springframework:spring-web:jar:3.1.0.RELEASE:compile [INFO] | \- aopalliance:aopalliance:jar:1.0:compile [INFO] +- org.springframework:spring-test:jar:3.1.0.RELEASE:compile [INFO] +- org.springframework:spring-expression:jar:3.1.0.RELEASE:compile [INFO] +- org.springframework:spring-tx:jar:3.1.0.RELEASE:compile [INFO] | \- org.springframework:spring-aop:jar:3.1.0.RELEASE:compile [INFO] +- org.springframework:spring-beans:jar:3.1.0.RELEASE:compile [INFO] +- org.springframework:spring-core:jar:3.1.0.RELEASE:compile [INFO] +- org.springframework:spring-context:jar:3.1.0.RELEASE:compile [INFO] +- org.springframework:spring-jdbc:jar:3.1.0.RELEASE:compile [INFO] +- org.quartz-scheduler:quartz:jar:1.7.2:compile [INFO] +- com.alibaba:dubbo:jar:2.0.13:compile [INFO] | +- org.springframework:spring:jar:2.5.6.SEC03:compile [INFO] | +- org.javassist:javassist:jar:3.15.0-GA:compile [INFO] | \- org.jboss.netty:netty:jar:3.2.5.Final:compile [INFO] +- org.apache.zookeeper:zookeeper:jar:3.4.6:compile [INFO] | +- org.slf4j:slf4j-log4j12:jar:1.6.1:compile [INFO] | +- jline:jline:jar:0.9.94:compile [INFO] | \- io.netty:netty:jar:3.7.0.Final:compile [INFO] +- org.codehaus.jackson:jackson-core-asl:jar:1.8.4:compile [INFO] +- org.codehaus.jackson:jackson-mapper-asl:jar:1.8.4:compile [INFO] +- javax.servlet:servlet-api:jar:2.5:provided [INFO] \- javax.servlet:jsp-api:jar:2.0:provided [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.248s [INFO] Finished at: Tue Nov 17 21:44:19 CST 2015 [INFO] Final Memory: 11M/309M [INFO] ------------------------------------------------------------------------ D:\Java Code\DubboTest>
我们能看到在zookeeper里面引用了slf4j-log4j12
怎么办?看下面
<pre name="code" class="html"><dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions>
<pre name="code" class="html"></dependency>
让它不要引用slf4j-log4j12即可(总而言之,slf4j-log4j12与log4j这两个jar都不能出现)
另外maven dependency 里面有个optional选项
默认为false
项目b的pom中引用了组件c,且c的optional是false 那么如果项目a引用项目b的时候 也会默认的把组件c加上
如果b的pom中引用了组件c,且c的optional是true 那么如果项目a引用项目b的时候 就不会引用组件c 如果还需要组件c 那么只能多加一个dependency
另外
使用maven将整个项目打成jar包
<plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>abc.ef.sdf</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin>
然后在pom文件上右键 run as->maven assembly:assembly
之后在pom的同级目录里会生成你所需要的jar
参考资料
http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html
感谢glt
glt是谁?
我媳妇!!
哈哈哈
程序员表达爱意的方式果然不同凡响
2015年11月17日修正版
***********************************************************
再另外
关于log
在之前的
private static Log log=LogFactory.getLog(RecvNotify.class);
log.error("i am error");
System.out.println(log.getClass());
本来使用common-log
----i am error
class org.apache.commons.logging.impl.Log4JLogger
后来加上:jcl-over-slf4j
[ERROR] [23:03:36] com.ronglian.jspt.sample.RecvNotify
----i am error
class org.apache.commons.logging.impl.SLF4JLocationAwareLog
我们就把common-log的实现转换为了slf4j的实现
参考资料
http://blog.csdn.net/dslztx/article/details/47282253
java中log的应用的更多相关文章
- java中log日志的使用(完全版)
Commons_logging包 Apache通用日志包 他为Log4JLogger:NoOpLog:LogKitLogger:Jdk14Logger:AvalonLogger提供了一共通用的接口进行 ...
- Java中的Checked Exception——美丽世界中潜藏的恶魔?
在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能.有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常.但是在查看这些API的文档时,我们却没 ...
- Java中的多线程你只要看这一篇就够了
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:279558494 我们一起学Java! 引 如果对什么是线程.什么是进程仍存有疑惑, ...
- 关于Java中枚举Enum的深入剖析
在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定.Java也不例外.Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析. 什么是Enum Enum是自Java ...
- java中实现定时功能
网上资料: 我们可以使用Timer和TimerTask类在java中实现定时任务,详细说明如下: 1.基础知识java.util.Timer一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务 ...
- java中常用的工具类(二)
下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 关于JAVA中的String的使用与连接(转)
JAVA中的String连接性能 Java中的String是一个非常特殊的类,使它特殊的一个主要原因是:String是不可变的(immutable). String的不可变性是Ja ...
- 如何在java中使用sikuli进行自动化测试
很早之前写过一篇介绍sikuli的文章.本文简单介绍如何在java中使用sikuli进自动化测试. 图形脚本语言sikuli sikuli IDE可以完成常见的单击.右击.移动到.拖动等鼠标操作,ja ...
- Java中几种日志方案
.本文记录Java中几种常用的日志解决方案 0x01 Log4j .这应该是一个比较老牌的日志方案了,配置也比较简单,步骤如下 1)添加对应依赖,比如 Gradle 中 dependencies { ...
随机推荐
- 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )
初学者遇到 Android Studio, 导入工程后, 会出现各种奇葩错误, 如果管理好各个插件, gradle, SDK, SDK Tools, 各种官方依赖库 的版本, 会将错误大大的减少; 这 ...
- sublime 安装package control
import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d15146761 ...
- Python实现Mysql数据库连接池
python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...
- Android通过WebService实现图片的上传和下载(一)
这篇文章将讲解Android如果通过访问WebService接口实现图片的上传和下载,当然这不但需要大家懂得Android还要懂得WebService技术,安卓属于客户端,而webservice则属于 ...
- Redis中的关系查询
本文对Redis如何保存关系型数据,以及如何对其匹配.范围.模糊查询进行举例讲解,其中模糊查询功能基于最新的2.8.9以后版本. 1 关系型数据的存储 以Staff对象为例,在关系型数据库或类似Gri ...
- 剑指offer面试题4 替换空格(c)
- 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为 ...
- DBCP连接池TestOnBorrow的坑
生产环境连接池TestOnBorrow设置为false,导致有时获取的连接不可用.分析如下: TestOnBorrow=false时,由于不检测池里连接的可用性,于是假如连接池中的连接被数据库关闭了, ...
- Android实现系统ROOT, 并能赋予app root权限
1. 获取root权限 --> 修改adb源码 a. 打开 system/core/adb/adb_main.cpp,或者是 system/core/adb/daemon/main.c ...
- I/O操作之文件压缩与解压
与文件压缩与解压相关的类在java.util.zip包下 实例 //文件压缩 import java.io.File; import java.io.FileInputStream; import j ...