Java日志学习

日志问题总会让一些小司机们在项目中吃了大亏,刚吃了个大亏,记录一下促进。

 

当前的日志框架有 jdk 自带的 logging,log4j1、log4j2、logback ,这些框架都自己定制了日志 API ,并且有相应的实现。本篇主要介log4j与slf4j配合使用。


1、新建Maven工程,配置log4j日志


1.1 pom文件引入log4j jar包

<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
</dependency>


1.2 添加log4j.properties文件,内容如下:

#总局控制日志级别为debug ,指定控制台输出和文件输出。
log4j.rootLogger=debug,CONSOLE,INFOFILE
log4j.additivity.org.apache=false


# CONSOLE  org.apache.log4j.ConsoleAppender:控制台输出
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
# 日志级别
log4j.appender.CONSOLE.Threshold=debug
#直接输出,不进行缓存
log4j.appender.CONSOLE.ImmediateFlush=true
log4j.appender.CONSOLE.Target=System.out
#日志输出格式
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} (%F:%L) - %m%n

# File
log4j.appender.INFOFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.INFOFILE.Threshold=INFO
log4j.appender.INFOFILE.ImmediateFlush=true
#默认为true,添加到末尾,false在每次启动时进行覆盖
log4j.appender.INFOFILE.Append=true
log4j.appender.INFOFILE.File=D:\\logs\\info.log
log4j.appender.INFOFILE.Encoding=UTF-8
#文件名称的格式
log4j.appender.INFOFILE.DatePattern='.'yyyy-MM-dd'.log' 
#日志输出格式
log4j.appender.INFOFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.INFOFILE.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %C.%M(%F:%L) - %m%n

2、配置项详解:

2.1 Logger日志的7个级别(优先级从高到低):

 

OFF-关闭所有日志;

 

FATAL-记录严重的错误,并且会导致应用程序退出;

 

ERROR-记录严重的错误,但不会影响程序的运行;

 

WARN-记录警告;

 

INFO-记录程序中比较有意义的信息;

 

DEBUG-记录程序中的细节信息;

 

ALL-记录所有的日志;

 

2.2 log4j.additivity.org.apache:

子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。

 

 

2.3 输出日志Appender选项:

 

org.apache.log4j.ConsoleAppender    控制台


org.apache.log4j.FileAppender   输出到文件


org.apache.log4j.RollingFileAppender  输出到滚动文件


org.apache.log4j.DailyRollingFileAppender   定期回滚日志文件

 

org.apache.log4j.net.SMTPAppender  发送日志到指定邮件

 

org.apache.log4j.jdbc.JDBCAppender  发送到数据库

 

2.4 日志的输出格式:


org.apache.log4j.HTMLLayout   以HTML表格形式布局

org.apache.log4j.PatternLayout  可以灵活地指定布局模式

org.apache.log4j.SimpleLayout   包含日志信息的级别和信息字符串

org.apache.log4j.TTCCLayout     包含日志产生的时间、线程、类别等等信息

 

 

2.5  log4j.appender.console.layout.ConversionPattern详解:

 

%m   输出代码中指定的消息

  %p   输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

  %r   输出自应用启动到输出该log信息耗费的毫秒数

  %c   输出所属的类目,通常就是所在类的全名

  %t   输出产生该日志事件的线程名

  %n   输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”

  %d   输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss ,SSS},输出类似:2002年10月18日  22 : 10 : 28 , 921 

%l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10 )



3、新建 LogTest 如下:


import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LogTest {
	
	static{  
        PropertyConfigurator.configure("src/main/resources/log4j.properties");     
    }
	private static Logger LOGGER = Logger.getLogger(LogTest1.class);
	
	public static void main(String[] args) {
		LOGGER.debug("debug....");
		LOGGER.info("info....");
		LOGGER.warn("warn.....");
		LOGGER.error("error....");
		for (int i = 0; i < 50; i++) {
			LOGGER.error("error...."+i);
		}	
	}
}

观察控制台和文件输出。发现总局日志级别与子Logger日志级别的配合。


4,配合Spring使用


4.1 在pom文件中引入 spring相关jar包


<!-- spring begin -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>4.3.11.RELEASE</version>
		</dependency>
<!-- spring end -->


4.1 添加 applicationContext.xml; spring-mvc.xml文件

 

4.2 配置web.xml引入log4j.xml


<!--springframework 的ContextLoaderListener使用的配置文件 开始 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!--springframework 的ContextLoaderListener使用的配置文件 结束 -->


	<!--springframework 的Log4jConfigListener使用的配置文件 开始 -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4j.properties</param-value>
	</context-param>
	<context-param>
		<param-name>log4jRefreshInterval</param-name>
		<param-value>60000</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	<!--springframework 的Log4jConfigListener使用的配置文件 结束 -->


	<!-- springmvc控制器 配置开始 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	<!-- springmvc控制器 配置开始 -->


4.5 启动tomcat即可



5、引入 slf4j

 

简单日记门面(simple loggingFacade for Java)SLF4J是为各种loging APIs提供一个简单统一的接口,用来服务于各种各样的日志框架, 单独的slf4j是不能工作的,必须带上其他具体的日志实现方案. SLF4J就类似于JDBC访问数据库接口一样,它只是接口,真正的实现是由其它框架组件提供的。用户能够在部署的时候配置自己希

望的loging APIs实现。

准确的说,slf4j并不是一种具体的日志系统,而是一个用户日志系统的facade,允许用户在部署最终应用时方便的变更其日志系统。

 

如果在工程中要使用slf4j作为接口,并且要用log4j作为具体实现方案,那么我们需要做的事情如下:(下面的xxx表示具体版本号)

 

将slf4j-api-xxx.jar加入工程classpath中;

将slf4j-log4jxx-xxx.jar加入工程classpath中;

将log4j-xxx.jar加入工程classpath中;

将log4j.properties(log4j.xml)文件加入工程classpath中。

 

5.1 引入slf4j-api 和  配合log4j使用的jar包


<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.25</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.25</version>
</dependency>


5.2 代码使用


import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogTest1 {
	
	static{  
        PropertyConfigurator.configure("src/main/resources/log4j.properties");     
    }
	// org.slf4j.Logger 
	private static Logger LOGGER = LoggerFactory.getLogger(LogTest1.class);
	
	public static void main(String[] args) {
		LOGGER.debug("debug....");
		LOGGER.info("info....");
		LOGGER.warn("warn.....");
		LOGGER.error("error....");
		for (int i = 0; i < 50; i++) {
			// 可用 {} 占位符
			LOGGER.error("error....  {} ",i);
		}	
	}
}


参考博客点击打开链接,介绍了工作原理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值