日志问题总会让一些小司机们在项目中吃了大亏,刚吃了个大亏,记录一下促进。
当前的日志框架有 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);
}
}
}
参考博客点击打开链接,介绍了工作原理。