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





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值